Я пытаюсь сделать AJAX-вызов файла PHP на другом сайте:
$.ajax({
type: "GET",
dataType: "json",
url: 'http://user:[email protected]/myphpfile.php',
data: {
records: JSON.stringify(workingarray),
account: account,
},
complete: function(response) {
var parsedresponse = $.parseJSON(JSON.stringify(response)).responseText.split("<br>");
otherFunction(parsedresponse);
}
});
Мой PHP-файл:
<?php
header('Access-Control-Allow-Origin: *');
header('content-type: application/json; charset=utf-8');
$records = json_decode($_GET['records']);
$account = $_GET['account'];
.....[LOGIN AND SQL QUERY].....
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
$conn->close();
?>
Все это прекрасно работало, пока я не заметил, что на самом деле не включил аутентификацию. Как только я это сделал, все просто сломалось, и я всегда получаю следующую ошибку:
XMLHttpRequest не может загрузить
HTTP: // пользователь: [email protected]/myphpfile.php (…) нет
Заголовок «Access-Control-Allow-Origin» присутствует в запрошенном
ресурс. Происхождениеhttp://originurl.co.ukПоэтому не допускается
доступ. Ответ имел HTTP-код состояния 401.
Однако, как вы увидите из моего PHP-кода, присутствует заголовок. Я также попытался добавить следующие 2 строки в мой .htaccess:
Header set Access-Control-Allow-Origin "*"Header set Access-Control-Allow-Credentials true
С разочаровывающим небольшим эффектом, то есть, никакого эффекта вообще.
Я попытался преобразовать тип данных в JSONP, но я не совсем уверен, как это сделать … Я попробовал следующие изменения:
$.ajax({
type: "GET",
dataType: "jsonp",
url: 'http://user:[email protected]/myphpfile.php?callback=?',
data: {
records: JSON.stringify(workingarray),
account: account,
},
complete: function(response) {
var parsedresponse = $.parseJSON(JSON.stringify(response)).responseText.split("<br>");
otherFunction(parsedresponse);
}
});
Мой PHP-файл:
<?php
header('Access-Control-Allow-Origin: *');
header('content-type: application/jsonp; charset=utf-8');
...
while ($row = $result->fetch_assoc()) {
echo $_GET['callback'] . "(" . json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ")";
}
$conn->close();
?>
Насколько я вижу, это не приводит к ошибке в консоли, но единственное, что я мог понять в ответе, было следующее:
статус: 200
statusText: «загрузить»
(Я добавил console.log(parsedresponse)
линия к complete:
функция для целей отладки, но я должен признать, что я не совсем уверен, как интерпретировать большую часть того, что я вижу.)
Любая помощь или предложения будут высоко оценены, потому что это вызывает у меня большое разочарование.
Я думаю, что я решил проблему — я не совсем переписал приложение, но я могу позвонить и получить ответ, так что все должно быть просто плыть отсюда (знаменитые последние слова, ха-ха).
Во всяком случае, изменения, которые я сделал, были следующие — я сначала переключился complete
за success
в вызове AJAX:
$.ajax({
type: "GET",
dataType: "jsonp",
url: 'https://user:[email protected]/myphpfile.php?callback=?',
data: {
records: JSON.stringify(workingarray),
account: account,
},
success: function(response) {
console.log(response);
otherFunction(response);
}
});
А потом, и я думаю, что это, вероятно, было главной проблемой, мне пришлось переписать эту часть файла PHP …
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo json_encode($row['Some columns']."<br>", JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
…становиться:
$result = $conn->query($sql);
$rows = array();
while ($row = $result->fetch_assoc()) {
$rows[] = array('data' => $row['Some columns']);
}
echo $_GET['callback'] . "(" . json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ")";
…как очевидно (в ретроспективе) мой предыдущий метод возвращал несколько функций с одним и тем же именем.
Я также изменил URL запроса на https, который, я думаю, должен быть достаточно безопасным для предполагаемого использования.
В любом случае надеюсь, что кто-то найдет мой опыт полезным.
Других решений пока нет …