こんにちは、
XMLHttpRequestとは
XMLHttpRequestはブラウザ上でサーバーとHTTP通信を行うためのAPIです。
名前にXMLが付いていますがXMLに限ったものではなく、
仕様としてはW3CよりXMLHttpRequestとして定義されており、
XMLHttpRequestの機能と特徴
前回のJSONPと比べると機能的には大きな違いはありません。ただ、
XMLHttpRequestの簡単な歴史
XMLHttpRequestは元々はIE 5において、
Mozillaがすぐさま追従してXMLHttpRequestを実装し、
XMLHttpRequestの使い方
まずはXMLHttpRequestの簡単なサンプルを見てみましょう。次のコードは現在みているページをXMLHttpRequestで取得して、
var btn1 = document.getElementById('xhr-btn1');
btn1.onclick = function(){
var xhr = new XMLHttpRequest();
xhr.open('GET', location.href, true);
xhr.onreadystatechange = function(){
// 本番用
if (xhr.readyState === 4 && xhr.status === 200){
var result1 = document.getElementById('xhr-result1');
result1.value = xhr.responseText;
}
// ローカルファイル用
if (xhr.readyState === 4 && xhr.status === 0){
var result1 = document.getElementById('xhr-result1');
result1.value = xhr.responseText;
}
};
xhr.send(null);
};
このようにXMLHttpRequestの基本的な使い方は、
- new XMLHttpRequestでオブジェクトを作る
- openメソッドで送信時のメソッド、送信先URL、非同期通信か同期通信か真偽値で設定
- onreadystatechangeで読み込み時の動作を指定
- sendメソッドでリクエストを送信、引数はGETの場合nullを、POSTの場合はデータを&で繋げた文字列にして渡す。
openメソッドの第3引数で同期通信にすることも可能ですが、
なお、
レスポンスの処理
onreadystatechangeで
まず、
そして、
読み込みが完了していてステータスが200なら、
レスポンスとしてはresponseXMLというプロパティもありますが、
JSONを受け取った場合
XMLHttpRequestのレスポンスとしてJSONを受け取った場合、
JSONのパースに対応しているのは各ブラウザの比較的新しいバージョンに限られます。そのため、
json2.
var data = JSON.parse(xhr.responseText);
IE 6対応
IE 7からXMLHttpRequestに対応したと書きましたが、
if (!window.XMLHttpRequest){
XMLHttpRequest = function () {
try {
return new ActiveXObject("Msxml2.XMLHTTP.6.0");
} catch (e) {}
try {
return new ActiveXObject("Msxml2.XMLHTTP.3.0");
} catch (e) {}
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {}
throw new Error("This browser does not support XMLHttpRequest.");
};
}
var btn2 = document.getElementById('xhr-btn2');
btn2.onclick = function(){
var xhr = new XMLHttpRequest();
xhr.open('GET', location.href, true);
xhr.onreadystatechange = function(){
if (xhr.readyState === 4 && xhr.status === 200){
var result2 = document.getElementById('xhr-result2');
result2.value = xhr.responseText;
}
if (xhr.readyState === 4 && xhr.status === 0){
var result2 = document.getElementById('xhr-result2');
result2.value = xhr.responseText;
}
};
xhr.send(null);
};
XMLHttpRequestオブジェクトの作り方以外はIE 6もほぼ同様に扱うことができます。
XMLHttpRequest Level 2
XMLHttpRequest Level 2についても簡単に触れておきます。XMLHttpRequest Level 2は従来のXMLHttpRequestをより使いやすく・
- onreadystatechangeの代わりにonloadを使用できる
- クロスオリジン通信が可能になった
- アップロード・ダウンロード時の進捗をイベントとして把握することができるようになった
- overrideMimeTypeによってMIMEタイプ・文字コードを制御可能になった
- バイナリを受信可能になった
Level 2で定義されたonload、
クロスオリジン通信については、
従来はオリジンの異なるURLに対してはsendメソッドを呼んだ段階でエラーになりリクエスト自体が発生しないという動作でしたが、
つまり、
XMLHttpRequestの実装状況
最後に、
| メソッド/プロパティ | Level | Firefox | Chrome | Safari | Opera |
|---|---|---|---|---|---|
| abort | 1 | ○ | ○ | ○ | ○ |
| getAllResponseHeaders | 1 | ○ | ○ | ○ | ○ |
| getResponseHeader | 1 | ○ | ○ | ○ | ○ |
| open | 1 | ○ | ○ | ○ | ○ |
| send | 1 | ○ | ○ | ○ | ○ |
| setRequestHeader | 1 | ○ | ○ | ○ | ○ |
| onreadystatechange | 1 | ○ | ○ | ○ | ○ |
| readyState | 1 | ○ | ○ | ○ | ○ |
| responseText | 1 | ○ | ○ | ○ | ○ |
| responseXML | 1 | ○ | ○ | ○ | ○ |
| status | 1 | ○ | ○ | ○ | ○ |
| statusText | 1 | ○ | ○ | ○ | ○ |
| withCredentials | 2 | ○ | ○ | ○ | |
| upload | 2 | ○ | ○ | ○ | |
| responseBody | 2 | ||||
| onloadstart | 2 | ○ | ○ | ○ | |
| onprogress | 2 | ○ | ○ | ○ | |
| onabort | 2 | ○ | ○ | ○ | |
| onerror | 2 | ○ | ○ | ○ | |
| onload | 2 | ○ | ○ | ○ | ○ |
| onloadend | 2 | ○ | ○ | ○ | |
| overrideMimeType | 2 | ○ | ○ | ○ | ○ |
続いて、
| メソッド/プロパティ | Level | IE 6 (XMLHTTP) | IE 8 (XMLHttp Request) | IE 8 (XDomain Request) |
|---|---|---|---|---|
| abort | 1 | ○ | ○ | ○ |
| getAllResponseHeaders | 1 | ○ | ○ | |
| getResponseHeader | 1 | ○ | ○ | |
| open | 1 | ○ | ○ | ○ |
| send | 1 | ○ | ○ | ○ |
| setRequestHeader | 1 | ○ | ○ | |
| onreadystatechange | 1 | ○ | ○ | |
| readyState | 1 | ○ | ○ | |
| responseText | 1 | ○ | ○ | ○ |
| responseXML | 1 | ○ | ○ | |
| status | 1 | ○ | ○ | |
| statusText | 1 | ○ | ○ | |
| withCredentials | 2 | |||
| upload | 2 | |||
| responseBody | 2 | ○ | ○ | |
| onloadstart | 2 | |||
| onprogress | 2 | ○ | ||
| onabort | 2 | |||
| onerror | 2 | ○ | ||
| onload | 2 | ○ | ||
| onloadend | 2 | |||
| overrideMimeType | 2 | |||
| contentType | IE only | ○ | ||
| timeout | IE only | ○ | ○ | |
| ontimeout | IE only | ○ | ○ |
まとめ
今回はXMLHttpRequestの基礎を解説しました。XMLHttpRequestは高度なアプリケーションを作る上では欠かせない技術です。次回からはXMLHttpRequestの使い方の具体例を見ていきたいと思います。
