Мой JQuery вызов API ipify Использование XMLHttpRequest возвращает ошибку состояния 405 - PullRequest
0 голосов
/ 05 апреля 2020

Это код моего http://api.ipify.org звонка:

    function getInfo(website)
    {

      var xhr = new XMLHttpRequest();
      //change this string to the lambda_insertPromoter string.
      // fuckCORS + 
      var url = website;
      console.log("getInfo");
      //alert(data);        
      xhr.open("POST", url, true);
      xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
      xhr.setRequestHeader("Accept","application/json");
      xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");

      xhr.onreadystatechange = function () {
          if (this.readyState == 4 && this.status == 200) {

            var json = JSON.parse(xhr.responseText);
            console.log(json);
            var ip_address = json.ip;
            console.log(ip_address)
            return ip_address;

          }
          else if (this.readyState == 4 && this.status >= 400 && this.status < 500)
          {
            console.log(this);
            console.log("getInfo: readyState == 4 && status >= 400 && status < 500");
          }
          else if (this.readyState == 4 && this.status >= 500)
          {
            console.log("getInfo: readyState == 4 && status >= 500");
          }
        }

      xhr.send();

    }

    var ip_address_2 = getInfo("https://cors-anywhere.herokuapp.com/https://api.ipify.org/?format=json&callback=?");

    alert(ip_address_2);

Когда я запускаю этот запрос, я получаю следующий ответ:

XMLHttpRequest { onreadystatechange: onreadystatechange(), readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, responseURL: "https://cors-anywhere.herokuapp.com/https://api.ipify.org/?format=json&callback=?", status: 405, statusText: "Method Not Allowed", responseType: "", response: "" }

Получаемый ответ является код статуса 405, который означает, что сайт получает запрос, но он не работает.

Какие изменения я должен внести, чтобы получить IP-адрес, который мне нужен?

1 Ответ

1 голос
/ 06 апреля 2020

Что HTTP 405 на самом деле означает, что метод не разрешен , что означает, что URL, который вы пытаетесь получить с помощью POST, не разрешает POST. Используйте GET. Кроме того, способ, которым вы пытаетесь получить возвращаемые значения: var ip_address_2 = ... не будет работать, потому что вы делаете HTTP-запрос, который является асинхронным, что означает, что alert(ip_address_2) всегда будет предупреждать undefined.

Введите Обещание и asyn c / ожидайте

По сути, вы заключаете код в обещание, и это то, что вы возвращаете. Затем за пределами вас ждите этого обещания разрешить / отклонить, и вы получите свое значение в ip_address_2.

Обратите внимание, я также обернул код, который вызывает getInfo в IIFE с (важно) ключевым словом async, поскольку await можно использовать только внутри async функций.

HIH

 function getInfo(website) {
     console.log("getting info...");
     return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open("get", website, true);
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xhr.setRequestHeader("Accept","application/json");
        xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");

        xhr.onreadystatechange = function () {
            if (this.readyState == 4 && this.status == 200) {
               var json = JSON.parse(xhr.responseText);
               var ip_address = json.ip;
               resolve(ip_address); //<-- this is how you return (on success) from inside a Promise
            }
            else if (this.readyState == 4 && this.status >= 400 && this.status < 500)
            {
               reject(this.status); //<-- this is how you return (on failure) from inside a Promise
               console.log(this.status);
               console.log("getInfo: readyState == 4 && status >= 400 && status < 500");
            }
            else if (this.readyState == 4 && this.status >= 500)
            {
               reject(this.status);
               console.log("getInfo: readyState == 4 && status >= 500");
            }
          }
         xhr.send();
       });
    }

(async ()=>{
    var ip_address_2 = await getInfo("https://cors-anywhere.herokuapp.com/https://api.ipify.org/?format=json&callback=?");
    console.log(`got info: ${ip_address_2}`);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...