XMLHttpRequestの応答を取得する方法は?


187

XMLHttpRequestを使用してリモートURLのコンテンツをロードし、アクセスしたサイトのHTMLをJS変数に格納する方法を知りたいです。

たとえば、http://foo.com/bar.phpのHTMLをロードしてalert()したい場合、どうすればよいでしょうか。



2
JS Librariesを利用している場合、jQueryは.load()メソッドでこれを本当に簡素化します。api.jquery.com/ load
scunliffe

20
最後に、jQueryに対応していないGoogleの結果に感謝します:|
Sam Vloeberghs 2014

回答:


277

あなたはでそれを得ることが可能XMLHttpRequest.responseTextXMLHttpRequest.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だけでなく、ブラウザー間の互換性を高めるためだけでなく、ブラウザー固有のメモリリークやバグをカバーするため、また、アジャクショナルリクエストを発生させる際の冗長性を減らすために、jQueryを使用できます。

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

localhostで実行していない場合は、JavaScriptの同じ生成元ポリシーを考慮する必要があることに注意してください。ドメインでプロキシスクリプトを作成することを検討してください。


そのプロキシを作成するにはどうすればよいですか?
クリス

魅力のように動作します:)
Anurag

29

を調べることをお勧めしfetchます。ES5と同等であり、Promiseを使用します。より読みやすく、簡単にカスタマイズできます。

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ドキュメント

使用できます(2019年10月94%)

Matt Walshチュートリアル


27

使用するための簡単な方法XMLHttpRequestpure 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

良い例え。正常に動作しています。

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.