Ошибка CORS при получении данных API ReactJS - PullRequest
0 голосов
/ 02 июля 2018

Я уже несколько дней пытаюсь создать реагирующее веб-приложение для моей стажировки, и я столкнулся с ошибкой CORS. Я использую последнюю версию activJS и помещаю ее в create-react-app, а ниже приведен код для извлечения:

componentDidMount() {
  fetch('--------------------------------------------',{
    method: "GET",
    headers: {
      "access-control-allow-origin" : "*",
      "Content-type": "application/json; charset=UTF-8"
    }})
  .then(results => results.json())
  .then(info => {
    const results = info.data.map(x => {
      return {
        id: x.id,
        slug: x.slug,
        name: x.name,
        address_1: x.address_1,
        address_2: x.address_2,
        city: x.city,
        state: x.state,
        postal_code: x.postal_code,
        country_code: x.country_code,
        phone_number: x.phone_number,
      }
    })
    this.setState({warehouses: results, lastPage: info.last_page});
  })
  .then(console.log(this.state.warehouses))
 }

Извините, что я не могу опубликовать URL для API из-за правил компании, однако подтверждается, что в серверной части API нет настройки CORS.

Тем не менее, я сталкиваюсь со следующими ошибками при запуске на Mozilla

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at ------------------. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

и

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at ---------------------------------------------. (Reason: CORS request did not succeed).

При запуске на Chrome выдает следующую ошибку

Failed to load resource: the server responded with a status of 405 (Method Not Allowed)

и

Failed to load --------------------------------------------------------: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 405. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

и

Uncaught (in promise) TypeError: Failed to fetch

Другое дело, что я могу открывать URL в своих браузерах без проблем или чего-либо еще.

Пожалуйста, помогите и спасибо!

Дополнительная информация

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

Далее я попытался выполнить настройку прокси, однако теперь он выдает

Unhandled Rejection (SyntaxError): Unexpected token < in JSON at position 0

Согласно Интернету, это вызвано тем, что ответ не является JSON. Однако, когда я проверил API, он дает это

api img

что означает, что тип возвращаемого значения должен быть в формате JSON?

Дополнительная информация

проверка ответа даст это

{ "статус": 200, "общее": 1, "per_page": 3, "current_page": 1, "LAST_PAGE": 1, "next_page_url": нулевой, "prev_page_url": нулевой, "с": 1, "to": 3, "data": [{"id": 1, "slug": "america", "name": "america", "address_1": "Суд США", "address_2": " США " "город": "США", "государство": "США", "postal_code": "94545", "country_code": "США", "phone_number": "10000001", "CREATED_BY": нулевой," updated_by ": null," creation_at ":" 2017-11-10 11: 30: 50 + 00 "," updated_at ":" 2018-06-28 07: 27: 55 + 00 "}]}

1 Ответ

0 голосов
/ 02 июля 2018

Параметры CORS необходимо настроить в API, чтобы разрешить доступ из домена приложения React. Нет настроек CORS, нет AJAX из разных доменов . Все просто. Вы можете либо добавить настройки CORS в API своей компании (это вряд ли произойдет), либо обойти, как описано ниже:

CORS является исключительно механизмом клиентского браузера для защиты пользователей от вредоносного AJAX. Поэтому одним из способов обойти это является передача вашего AJAX-запроса из приложения React на собственный веб-сервер. Как предполагает Винсент, create-react-app предоставляет простой способ сделать это: в вашем файле package.json просто бросьте "proxy": "http://your-company-api-domain". Для более подробной информации, пожалуйста, смотрите ссылку

Тогда в вашем приложении для реагирования вы можете использовать относительный URL-адрес, например: fetch('/api/endpoints'). Обратите внимание, что относительный URL-адрес должен соответствовать API вашей компании. Это отправит запрос на ваш сервер, затем сервер перенаправит запрос в API вашей компании и вернет ответ обратно в ваше приложение. Поскольку запрос обрабатывается сервер-сервер, а не браузер-сервер, проверка CORS не произойдет. Следовательно, вы можете избавиться от всех ненужных заголовков CORS в вашем запросе.

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