こんにちは、
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の使い方の具体例を見ていきたいと思います。