Jak uzyskać odpowiedź XMLHttpRequest?

187

Chciałbym wiedzieć, jak używać XMLHttpRequest w celu załadowania zawartości zdalnego adresu URL i przechowywania kodu HTML witryny, do której uzyskano dostęp, w zmiennej JS.

Powiedz, jeśli chciałbym załadować i zaalarmować () kod HTML http://foo.com/bar.php , jak mam to zrobić?

Rohan
źródło
możliwy duplikat Czego brakuje mi w XMLHttpRequest?
Noah Witherspoon
2
jeśli jesteś otwarty na biblioteki JS, jQuery naprawdę upraszcza to za pomocą metody .load
scunliffe
20
dzięki Bogu, w końcu wynik Google, który nie odnosi się do jQuery: |
Sam Vloeberghs

Odpowiedzi:

277

Można ją uzyskać przez XMLHttpRequest.responseTextw XMLHttpRequest.onreadystatechangepodczas XMLHttpRequest.readyStaterówna XMLHttpRequest.DONE.

Oto przykład (niezgodny z 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);

Dla lepszej kompatybilności crossbrowser, nie tylko z IE6 / 7, ale także w celu uwzględnienia niektórych wycieków lub błędów pamięci specyficznych dla przeglądarki, a także dla mniejszej szczegółowości przy uruchamianiu żądań ajaxical, możesz użyć jQuery .

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

Pamiętaj, że musisz wziąć pod uwagę tę samą zasadę pochodzenia dla JavaScript, gdy nie jest uruchomiony na localhost. Możesz rozważyć utworzenie skryptu proxy w swojej domenie.

BalusC
źródło
Jak zabrać się do tworzenia tego proxy?
Chris - Jr
działa jak urok :)
Anurag
29

Proponuję zajrzeć do fetch. Jest to odpowiednik ES5 i wykorzystuje obietnice. Jest o wiele bardziej czytelny i łatwy do dostosowania.

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)
    );

W Node.js musisz zaimportować, fetchużywając:

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

Jeśli chcesz używać go synchronicznie (nie działa w najwyższym zakresie):

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

Więcej informacji:

Dokumentacja Mozilli

Czy mogę korzystać (94% października 2019 r.)

Samouczek Matta Walsha

Gibolt
źródło
27

Prostym sposobem korzystania XMLHttpRequestz pure JavaScript. Możesz ustawić, custom headerale jest opcjonalny używany w zależności od wymagań.

1. Przy użyciu metody 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);
}

Możesz wysyłać parametry za pomocą metody POST.

2. Przy użyciu metody GET:

Uruchom poniższy przykład, a otrzymasz odpowiedź 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.
źródło
Działa dobrze dla mnie.
Mayur S
Dobry przykład. Pracować w porządku.
16

W XMLHttpRequestużyciu XMLHttpRequest.responseTextmoże pojawić się wyjątek, taki jak poniżej

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

Najlepszy sposób na uzyskanie dostępu do odpowiedzi z XHR w następujący sposób

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);
Fizer Khan
źródło