Как получить ответ XMLHttpRequest?

187

Я хотел бы знать, как использовать XMLHttpRequest для загрузки содержимого удаленного URL-адреса и сохранить HTML-код доступного сайта в переменной JS.

Скажем, если бы я хотел загрузить и предупредить () HTML- код http://foo.com/bar.php , как бы я это сделал?

Рохан
источник
Возможный дубликат Чего я пропускаю в XMLHttpRequest?
Ной Уизерспун
2
если вы открыты для библиотек JS, jQuery действительно упрощает это с помощью метода .load (): api.jquery.com/load
scunliffe
20
слава богу, наконец, результат Google, который не касается jQuery: |
Сэм Флёбергс,

Ответы:

277

Вы можете получить его XMLHttpRequest.responseTextв XMLHttpRequest.onreadystatechangeкогда XMLHttpRequest.readyStateравно XMLHttpRequest.DONE.

Вот пример (не совместимый с IE6 / 7).

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState == XMLHttpRequest.DONE) {
        alert(xhr.responseText);
    }
}
xhr.open('GET', 'http://example.com', true);
xhr.send(null);

Для лучшей совместимости с кросс-браузерами, не только с IE6 / 7, но и для покрытия некоторых утечек или ошибок памяти, характерных для браузера, а также для уменьшения многословности при запуске ajaxical запросов, вы можете использовать jQuery .

$.get('http://example.com', function(responseText) {
    alert(responseText);
});

Обратите внимание, что вы должны принять во внимание ту же политику происхождения для JavaScript, когда она не работает на localhost. Возможно, вы захотите создать прокси-скрипт в вашем домене.

BalusC
источник
Как нам сделать этот прокси?
Крис - Младший
работает как шарм :)
Anurag
29

Я хотел бы предложить , глядя fetch. Это эквивалент ES5 и использует обещания. Это намного более читабельно и легко настраивается.

const url = "https://stackoverflow.com";
fetch(url)
    .then(
        response => response.text() // .json(), etc.
        // same as function(response) {return response.text();}
    ).then(
        html => console.log(html)
    );

В Node.js вам нужно импортировать fetchиспользуя:

const fetch = require("node-fetch");

Если вы хотите использовать его синхронно (не работает в верхней области):

const json = await fetch(url)
  .then(response => response.json())
  .catch((e) => {});

Больше информации:

Документация Mozilla

Могу ли я использовать (94% окт. 2019)

Мэтт Уолш Учебник

Gibolt
источник
27

Простой способ использования XMLHttpRequestс pure JavaScript. Вы можете установитьcustom header но это необязательно используется в зависимости от требований.

1. Используя метод POST:

window.onload = function(){
    var request = new XMLHttpRequest();
    var params = "UID=CORS&name=CORS";

    request.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            console.log(this.responseText);
        }
    };

    request.open('POST', 'https://www.example.com/api/createUser', true);
    request.setRequestHeader('api-key', 'your-api-key');
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.send(params);
}

Вы можете отправить параметры, используя метод POST.

2. Используя метод GET:

Пожалуйста, запустите приведенный ниже пример и получите ответ JSON .

window.onload = function(){
    var request = new XMLHttpRequest();

    request.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            console.log(this.responseText);
        }
    };

    request.open('GET', 'https://jsonplaceholder.typicode.com/users/1');
    request.send();
}

Mayur S
источник
У меня отлично работает.
Mayur S
Хороший пример. Работает нормально.
16

В XMLHttpRequest, использование XMLHttpRequest.responseTextможет вызвать исключение, как показано ниже

 Failed to read the \'responseText\' property from \'XMLHttpRequest\': 
 The value is only accessible if the object\'s \'responseType\' is \'\' 
 or \'text\' (was \'arraybuffer\')

Лучший способ получить доступ к ответу от XHR следующим образом

function readBody(xhr) {
    var data;
    if (!xhr.responseType || xhr.responseType === "text") {
        data = xhr.responseText;
    } else if (xhr.responseType === "document") {
        data = xhr.responseXML;
    } else {
        data = xhr.response;
    }
    return data;
}

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        console.log(readBody(xhr));
    }
}
xhr.open('GET', 'http://www.google.com', true);
xhr.send(null);
Физер Хан
источник