fetch () с междоменной причиной вызывает ошибку JSON.parse - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь использовать fetch () с кросс-доменом, но получаю необычные ошибки.У меня есть следующий скрипт, размещенный на http://example2.com/index.html

let url = "https://example1.com/login";
fetch(url,
        {
        "method":"POST",
        "content-type":"application/x-www-form-urlencoded",
        "mode":"no-cors",
        "headers":{
                "Authorization":"Basic johnjohn",
                "Auth-Secret":"johnsecretpassword",
        }
})
.then(response=>response.text())
.then(content=>{
        console.log(content); // prints empty line
        json = JSON.parse(content);
})
.catch(e=>console.log(`Error occurred: ${e}`));

Когда я запускаю этот скрипт, мой console.log(content) печатает пустую строку, а мой JSON.parse(content) выдает ошибку Error occurred: SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data.

Когда я захожу в консоль разработчика FireFox, нажимаю на сеть, нажимаю на ответ, я вижу следующую полезную нагрузку:

enter image description here

Изменение response.text()на response.json() вызывает блок catch с той же ошибкой синтаксического анализа JSON.

Кроме того, мой https://example1.com/login - это php-файл со следующим содержимым:

<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Authorization, Auth-Secret, Content-Type');

die(json_encode(array("data"=>"authorization","status"=>"fail")));

Что яделать неправильно?

1 Ответ

1 голос
/ 25 сентября 2019

Спасибо @Amy в моих комментариях выше.Эти два изменения устранили проблему:

Я добавил эту строку в свой login.php:

header('Access-Control-Allow-Headers: Authorization, Auth-Secret, Content-Type');

И удалил строку "mode":"no-cors" в своем index.html.

Таким образом, мой index.html будет уважать CORS, а мой login.php готов получить доступ к другим заголовкам.

...