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?

Rohan
fonte
possível duplicata de O que estou faltando no XMLHttpRequest?
Noah Witherspoon
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.

BalusC
fonte
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

Gibolt
fonte
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();
}

Mayur S
fonte
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);
Fizer Khan
fonte