AJAX-запрос перекрестного происхождения с JSON прерывается, когда требуется аутентификация

Я пытаюсь сделать 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: функция для целей отладки, но я должен признать, что я не совсем уверен, как интерпретировать большую часть того, что я вижу.)

Любая помощь или предложения будут высоко оценены, потому что это вызывает у меня большое разочарование.

0

Решение

Я думаю, что я решил проблему — я не совсем переписал приложение, но я могу позвонить и получить ответ, так что все должно быть просто плыть отсюда (знаменитые последние слова, ха-ха).

Во всяком случае, изменения, которые я сделал, были следующие — я сначала переключился 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, который, я думаю, должен быть достаточно безопасным для предполагаемого использования.

В любом случае надеюсь, что кто-то найдет мой опыт полезным.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]