HTTP JSON запрос в JS - проблема с CORS - PullRequest
1 голос
/ 27 марта 2020

Цель этого проекта - использовать IBM Watson и его AI, понимающий естественный язык.

Когда я использую Insomnia (клиент REST), я могу получить POST-запрос через go и получить JSON response.

Однако, когда я пытаюсь использовать javascript, я не могу отправить запрос POST и получаю следующую ошибку: «Доступ к XMLHttpRequest по адресу WEBSITE-I'M-TRYING- TO-REACH 'from origin' null 'был заблокирован политикой CORS: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: Перенаправление не разрешено для запроса предварительной проверки. "

Вот код, который я использую:

var url = "http://newsroom.ibm.com/Guerbet-and-IBM-Watson-Health-Announce-Strategic-Partnership-for-Artificial-Intelligence-in-Medical-Imaging-Liver"

getData(url);

function getData(url){
  var data = JSON.stringify({
    "url": url,
    "features": {
      "sentiment": {},
      "categories": {},
      "concepts": {},
      "entities": {},
      "keywords": {}
    }
  });

  var postURL = "https://api.us-south.natural-language-understanding.watson.cloud.ibm.com/instances/9d2bd18a-8017-4e44-8de9-acc01a9f0795/v1/analyze?version=2019-07-12"

  var xml = new XMLHttpRequest();
  xml.withCredentials = true;

  xml.addEventListener("readystatechange", function () {
    if (this.readyState === this.DONE) {
      console.log(this.responseText);
    }
  });

  var username = "myUsername";
  var password = "myPassword";
  xml.open("POST", postURL);
  xml.setRequestHeader("content-type", "application/json");
  xml.setRequestHeader("Authorization", "Basic " + username + ":" + password)

  xml.send(data);
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>JSON Requests</title>
  <script src="main.js"></script>
</head>

<body>
  <h1>JSON Requests</h1>

</body>

</html>

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

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

xml.setRequestHeader("Origin", "https://the-great.site");

0 голосов
/ 27 марта 2020

XMLHttpRequest следует политике CORS, что означает, что вы должны поместить заголовок ORIGIN в свой запрос, чтобы сервер мог проверить ваш хост (однако это не гарантирует, что вашему приложению будет предоставлен доступ к ресурс)

В вашем случае просто установить заголовок ORIGIN недостаточно по двум причинам:

  • вы используете настраиваемый заголовок
  • вы используете content-type кроме text/plain

, что означает, что вы должны сначала запросить у сервера разрешение на выдачу запроса, прежде чем отправлять сам запрос (это называется «предварительная проверка»).

Этот запрос на разрешение выполняется с использованием метода HTTP OPTIONS и выглядит следующим образом (в вашем случае):

OPTIONS /instances/9d2bd18a-8017-4e44-8de9-acc01a9f0795/v1/analyze HTTP/1.1  
Origin: http://(or https://)your_host  
Access-Control-Request-Method: POST  
Access-Control-Request-Headers: Authorization

Сервер ответит либо «предоставлено разрешение», либо «отказано в разрешении» ». Если разрешение предоставлено, вы можете продолжить выполнение фактического запроса POST. Если разрешение отклонено, ваш хост заблокирован для отправки запроса на этот сервер.

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