Как обработать ответ выборки из «непрозрачного» типа? - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь правильно интерпретировать ответ от вызова выборки на URL, который я считаю строкой json.Я перепробовал множество вариантов, основанных на похожих постах, но ничто не дает мне полезных данных для работы.Вот одна попытка:

fetch('http://serverURL/api/ready/', {method: "POST", mode: "no-cors"})
    .then(function(response) { 
        response.json().then(function(data) {
            console.log('data:' + data);
        });
    })
    .catch(function(err) {
        console.log('Fetch Error :-S', err);
    });

Возвращает синтаксическую ошибку в консоли:

SyntaxError: JSON.parse: неожиданный конец данных в строке 1 столбца 1 JSONdata

Так что, возможно, это не JSON ... если я поставлю точку останова на строке console.log и наведу курсор мыши на ответ (строка выше), я вижу объект ответа (?) с различнымиполя:

Response object from debugger hover

Не уверен, как интерпретировать это ... статус: 0 предполагает, что он не получил действительный ответ.Однако, если я проверяю вкладку «Сеть» в инструментах разработчика и нажимаю на строку выборки, там отображается состояние 200, а в разделе «Окно ответа» / JSON отображается информация о сообщении, которое вы также увидите, если просто вставить URL-адрес в URL-адрес браузера.бар напрямую.Как и в разделе «Полезные данные ответа», в котором показана строка JSON:

{"msg": "API is ready.", "Success": true}

Так ... это выглядит как JSON, нет?Но fetch не может принять это как json?

Вот еще один вариант, но с использованием response.text () вместо response.json ()

fetch('http://serverURL/api/ready/', {method: "POST", mode: "no-cors"})
    .then((response) => {
        console.log(response);
        response.text().then((data) => {
            console.log("data:" + data);
    });
});

Это печатает объект ответа вконсоль (то же, что и выше: ok: false, status: 0, type: opaque etc).Второй файл console.log ничего не печатает после data :.Если я использую response.json, я снова получаю синтаксическую ошибку о конце данных, как указано выше.

Есть идеи?Я понимаю, что сервер может не предоставлять то, что нужно или нужно для выборки, но он действительно предоставляет некоторую информацию (по крайней мере, при использовании URL-адреса непосредственно в браузере), с которой мне нужно иметь дело, например, в виде json, текста или чего-то еще..

1 Ответ

0 голосов
/ 27 февраля 2019

По сути, вы не можете получить доступ к телу ответа из непрозрачного запроса.

Режим добавления: «no-cors» не будет волшебным образом заставлять вещи работать.Браузеры по умолчанию блокируют код внешнего интерфейса от доступа к ресурсам из разных источников.Если сайт отправляет Access-Control-Allow-Origin в своих ответах, браузеры ослабят эту блокировку и позволят вашему коду получить доступ к ответу.

Но если сайт не отправляет Access-Control-Allow-Первый заголовок в его ответах, тогда ваш код JavaScript не сможет напрямую получить доступ к ответам с этого сайта.В частности, указание режима: «no-cors» не исправит это (на самом деле это только ухудшит ситуацию).

С https://stackoverflow.com/a/43268098/1666071

А также сfetch документация:

no-cors - Предотвращает использование метода чем-либо кроме HEAD, GET или POST, а заголовки - чем-то иным, кроме простых заголовков.Если какие-либо ServiceWorkers перехватывают эти запросы, они не могут добавлять или переопределять никакие заголовки, кроме тех, которые являются простыми заголовками. Кроме того, JavaScript может не иметь доступа ни к каким свойствам полученного ответа. Это гарантирует, что ServiceWorkers не влияет на семантику Интернета, и предотвращает проблемы безопасности и конфиденциальности, возникающие из-за утечки данных между доменами.

https://developer.mozilla.org/en-US/docs/Web/API/Request/mode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...