Простой вызов API (CORS) не работает

1

Прежде всего, я новичок в работе с API.

Я пытаюсь сделать самый простой вызов API другому домену (службе погоды), чем моя собственная клиентская сторона. Среди прочего, у меня были проблемы с CORS, отсутствие правильного заголовка и т.д., Поэтому я попытался сделать обходной путь, направив вызов через crossorigin.me (будет видно из URL-адреса в моем коде).

(Это не код, а только проблема - прокрутка вниз для кода). Однако мой код в настоящее время...

console.log(status); //returns 0
console.log(statusText); //returns an empty string

Это полный код.

function createCORSRequest(method, url) {
  xhr = new XMLHttpRequest();

  //I work in Chrome, so I only included withCredentials, not accounting for other browsers
  if ("withCredentials" in xhr) {
    xhr.open(method, url, true);
  }
  xhr.send();
  console.log(xhr.status); //returns 0
  console.log(xhr.statusText); //returns empty string
}

createCORSRequest("GET", "https://crossorigin.me/https://www.metaweather.com/api/location/2459115");

Если вы посещаете сайт напрямую, https://crossorigin.me/https://www.metaweather.com/api/location/2459115, я получаю это сообщение: Origin: заголовок не требуется. В консоли он дает код статуса 403, но я читал, что только сервер может управлять/получать доступ к заголовку и что я (кодер) не могу.

  • 1
    Вы просто пытаетесь прочитать статус до отправки запроса. Вы должны ждать ответа.
  • 1
    «но я читал, что только сервер может контролировать / получать доступ к заголовку», - HTTP-сообщения имеют заголовки. HTTP-запросы имеют заголовки. HTTP-ответы имеют заголовки. Сервер жалуется, что в вашем HTTP-запросе не было заголовка Origin . Это потому, что вы не отправили его с XMLHttpRequest.
Показать ещё 3 комментария
Теги:
xmlhttprequest
cors

1 ответ

1
Лучший ответ

Вы вызываете xhr.send() а затем сразу же пытаетесь прочитать статус ответа.

Вы должны подождать, пока не появится ответ, прежде чем вы сможете это сделать.

Используйте прослушиватель событий загрузки.

xhr.addEventListener("load", log_status);
xhr.send();

function log_status() {
   console.log(this.status);
   console.log(this.statusText);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню