Проблема при извлечении внешнего API, возвращающего JSON - PullRequest
0 голосов
/ 30 января 2019

У меня проблемы с извлечением внешнего API, который должен вернуть JSON.

В API не включена поддержка CORS, поэтому я пытаюсь использовать fetch с параметром mode: "no-cors".Я пытался использовать jsonp, но не работает вообще.

Итак, вот фрагмент кода:

fetch(APIURL, {
  mode: "no-cors",
}).then(response => {
  console.log(response)
  return response.json();
}).then(data => {
  console.log(data);
}).catch(err => {
  console.log(err)
});

Оператор catch возвращает это SyntaxError: "JSON.parse: unexpected end of data at line 1 column 1 of the JSON data"

Вот результат console.log(response)

bodyUsed: true
headers: Headers
   <prototype>: HeadersPrototype { append: append(), delete: delete(), get:   get(), … }
ok: false
redirected: false
status: 0
statusText: ""
type: "opaque"
url: ""
<prototype>: ResponsePrototype { clone: clone(), arrayBuffer: arrayBuffer(), blob: blob(), … }

Но на вкладке сети я вижу ответ JSON, который я хочу использовать, поэтому я нахожу странным, что вижу его там, поэтому я предполагаю проблемуна моем конце.Я попытался проверить вывод JSON в валидаторе, и это действительный JSON.

Есть идеи?Спасибо.

1 Ответ

0 голосов
/ 30 января 2019

При нормальных обстоятельствах вы не можете читать данные со стороннего сайта из-за единой политики происхождения.

CORS позволяет стороннему сайту предоставлять разрешение JavaScript на чтение данных.

Параметр no-cors для вашего JavaScript означает, что «я не хочу делать ничего, требующего разрешения от CORS».Это позволяет сделать запрос на отправку данных, не имея возможности прочитать ответ (преимущество заключается в том, что он не выдает сообщение об ошибке по всей консоли разработчика, сообщающее, что вы не можете прочитать данные, которые не пытаетесь прочитать).

Поскольку вам необходимо прочитать данные, вы не можете использовать no-cors.

Поскольку сайт не предоставляет разрешения для CORS, вы не можете читать данные напрямую с помощью кода на стороне клиента..

Использовать прокси.

...