Что 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}`);
})();