2017-02-21 27 views
1

Я создал приложение React-Native, подключенное к API Watson REST. Использование библиотеки выборки, которая является частью ReactNative, все работает хорошо, для получения списка рабочих пространств, как это:IBM Watson (разговор) REST API с Fetch (whatwg-fetch)

const myAuth = new Buffer(USR+':'+PWD).toString('base64'); 
    const myInit = { 
     method: 'GET', 
     headers: { 
      'Accept': 'application/json', 
      'Content-Type': 'application/json', 
      'Origin': '', 
      'Authorization': 'Basic ' + myAuth, 
     } 
    }; 

    return fetch(URL, myInit) 
     .then((response) => response.json()) 
     .then((responseJson) => { ... } 

Я сейчас движется к React (а не ReactNative) и whatwg-fetch библиотека. Тот же код не работает. Во-первых, я получил ошибку:

Поле заголовка запроса Авторизация не допускается заголовками Access-Control-Allow-Headers в предполетном ответе.

Затем, прочитав десятки нитей об этих типах проблем, это стало черной магией. Добавление заголовков для Access-Control-Allow-Methods, Access-Control-Allow-Headers и т. Д. До сих пор ничего не работало. В конце концов проблема стала такой:

В заголовке заголовка заголовка заголовка заголовка заголовка заголовка заголовка заголовка заголовка поля заголовка заголовка поля заголовка заголовка поля заголовка заголовка заголовка заголовка заголовка поля заголовка заголовка заголовка заголовка заголовка заголовка заголовка заголовка заголовка заголовка поля заголовка заголовка заголовка.

Может кто-нибудь указать мне, пожалуйста, на пример или код, который работает, пожалуйста?

==============

ОБНОВЛЕНИЯ ...

Спасибо @sideshowbarker и @FakeRainBrigand. Я предполагаю, что серверная сторона является обязательной для клиентского приложения браузера.

ответ

1

Браузер отказывается отправить ваш запрос, потому что сервер, на который вы отправляете запрос, не включил CORS, по крайней мере, не с этими заголовками.

Единственное решение без изменения сервера, на которое вы нацеливаете, - это написать собственный сервер, который делает запрос от имени клиента.

+0

Так почему же он работал с React-Native fetch @FakeRainBrigand? – TalBeno

+3

Реагирующие приложения запускаются за пределами модели веб-безопасности одинакового происхождения, которая запрещает веб-приложениям делать запросы с перекрестным происхождением (если сайт не отправляется на запросы, отвечая заголовком «Access-Control-Allow-Origin». Реакт выполняется внутри кода веб-приложения в браузере, а браузеры - это единственное место, где применяются ограничения перекрестного происхождения/CORS. Реагирующие приложения запускаются за пределами браузера, поэтому они не связаны никакими перекрестными ограничениями (они не Фактически, это происходит из любого источника, поэтому понятие «кросс-происхождение» не относится к ним. – sideshowbarker

1

Удалите все клиентские коды, задающие заголовок запроса Access-Control-Allow-Headers.

Заголовок - это заголовок ответа, на который отправляются серверы с поддержкой CORS. Вы не устанавливаете его со стороны клиента.

На основании сообщений об ошибках, указанных в вопросе, похоже, что сервер уже настроен правильно для отправки правильных заголовков Access-Control-*. (В противном случае вы вместо того, чтобы бы получить ошибку о том, что нет в ответ нет Access-Control-Allow-Origin.)

Единственной ошибку идентифицирующей из информации в этом вопросе на данный момент только эта проблема запроса включая Access-Control-Allow-Headers запроса заголовок, который не должен Не будь там.

+0

, когда я его удаляю - я возвращаюсь в поле «Поле заголовка запроса». Разрешение разрешений Access-Control-Allow-Headers не допускается при предполетном ответе ». – TalBeno

+0

Да, я думаю, что API просто не имеет поддержки CORS. По крайней мере, если это https://www.ibm.com/watson/developercloud/conversation/api/v1/, то нет никаких указаний на поддержку CORS и нет примеров использования API из клиентского кода веб-приложения в браузере. – sideshowbarker