Мне удалось получить содержимое JSON с помощью jQuery.ajax()
. В настоящее время он извлекает содержимое с другого хоста, содержащего единственный файл index.php, возвращающий ответ 401 со следующим телом: {'status':401}
.
Это JS:
$(document).ready(function() { $.ajax({ url: 'http://restapi', type: 'GET', dataType: 'json', success: function() { document.write('works'); }, error: function(xhr) { document.write('failed, status:' + xhr.status); }, beforeSend: setHeader }); }); function setHeader(xhr) { xhr.setRequestHeader('Authorization', 'Bearer 12345'); }
И PHP:
<?php header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); header('Access-Control-Allow-Credentials: true'); header("Access-Control-Allow-Headers: X-Requested-With, Authorization"); header("HTTP/1.1 401 Unauthorized"); echo json_encode(['status' => 401]); exit;
Если я удалю заголовок, xhr.setRequestHeader('Authorization', 'Bearer 12345');
, все работает нормально (ответ имеет тело json и xhr.status
возвращает 401
). Но с заголовком Authorization тело ничего не возвращает и xhr.status
возвращает 0
.
Мне нужно отправить токен auth в этот заголовок.
Я сделал то же самое, используя Node.js, и заметил, что он отправил два запроса / ответа. Один с заголовком 204 и другой с предполагаемым 401 и корпусом json. Первым методом были ОПЦИИ, а второй метод – GET, поэтому я попробовал это с помощью этого:
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { header("HTTP/1.1 204 No Content"); } else { header("HTTP/1.1 401 Unauthorized"); echo json_encode(['status' => 401]); }
Работает отлично.