Como obter a resposta do XMLHttpRequest?


187

Gostaria de saber como usar o XMLHttpRequest para carregar o conteúdo de uma URL remota e manter o HTML do site acessado armazenado em uma variável JS.

Digamos, se eu quisesse carregar e alertar () o HTML de http://foo.com/bar.php , como eu faria isso?



2
se você está aberto para bibliotecas JS, o jQuery realmente simplifica isso com o método .load
scunliffe

20
graças a deus, finalmente, um resultado do google que não trata do jQuery: |
precisa saber é o seguinte

Respostas:


277

Você pode obtê-lo por XMLHttpRequest.responseTextem XMLHttpRequest.onreadystatechangequando XMLHttpRequest.readyStateigual a XMLHttpRequest.DONE.

Aqui está um exemplo (não compatível com o 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);

Para uma melhor compatibilidade entre navegadores, não apenas com o IE6 / 7, mas também para cobrir alguns vazamentos ou bugs de memória específicos do navegador, e também para obter menos detalhamento ao disparar solicitações ajaxicais, você pode usar o jQuery .

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

Observe que você deve levar em consideração a política de mesma origem do JavaScript quando não estiver executando no localhost. Você pode querer criar um script de proxy no seu domínio.


Como vamos fazer esse proxy?
Chris - Jr

funciona como um encanto :)
Anurag

29

Eu sugiro olhar fetch. É o equivalente do ES5 e usa Promises. É muito mais legível e facilmente personalizável.

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

No Node.js, você precisará importar fetchusando:

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

Se você deseja usá-lo de forma síncrona (não funciona no escopo superior):

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

Mais informações:

Documentação Mozilla

Posso usar (94% out 2019)

Matt Walsh Tutorial


27

A maneira mais simples de usar XMLHttpRequestcom pure JavaScript. Você pode definir, custom headermas é opcional usado com base nos requisitos.

1. Usando o método 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);
}

Você pode enviar parâmetros usando o método POST.

2. Usando o método GET:

Por favor, execute o exemplo abaixo e obterá uma resposta 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();
}


Funciona bem para mim.
Mayur S

Bom exemplo. Trabalhando bem.

16

Em XMLHttpRequest, usando XMLHttpRequest.responseTextpode gerar a exceção como abaixo

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

Melhor maneira de acessar a resposta do XHR da seguinte maneira

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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.