通常の JavaScript (フレームワークなし) で使用する場合は、XMLHttpRequest
オブジェクトをいじる必要があります。XMLHttpRequest
は、AJAX 実装のコアを提供します。
プレフィックスがあっても、XMLHttp
XML や HTTP に限定されるわけではありません。任意のデータ型 (JSON など) を取得し、FTP などの他のプロトコルを使用できます。
GET
GitHub からユーザー情報を取得したいとします。ブラウザーからhttps://api.github.com/users/funchalにアクセスすることで、簡単にリクエストを行うことができます。JavaScript で HTTP リクエストを送信するのは、次のように簡単XMLHttpRequest
です。
// Create a new request object
var request = new XMLHttpRequest();
// Initialize a request
request.open('get', 'https://api.github.com/users/funchal')
// Send it
request.send()
これを JavaScript コンソールから試してみると、少しがっかりするかもしれません。すぐには何も起こりません。サーバーがリクエストに応答するまで待つ必要があります。readyState
リクエスト オブジェクトのインスタンスを作成してからサーバーが応答するまで、オブジェクトはプロパティの値によって示される一連の状態変化を受けます。
- 0
UNSENT
:open()
呼び出されていない
- 1
OPENED
:send()
呼び出されていない
- 2
HEADERS_RECIEVED
: ヘッダーとステータスは、send()
- 3
LOADING
:responseText
はまだダウンロード中です
- 4
DONE
: ワフー!
すべてが終了したらresponse
、データの属性を確認できます。
request.readyState // => 4 (We've waited enough)
request.response // => "{whatever}"
を使用する場合XMLHttpRequest#open()
、考慮すべきオプションがいくつかあります。メソッドのシグネチャは次のとおりです。
void open(
DOMString method,
DOMString url,
optional boolean async,
optional DOMString user,
optional DOMString password
);
3 番目のパラメーター (デフォルトは true) は、応答を非同期で行うかどうかを指定します。これを に設定するとfalse
、応答が完了するまで待たなければならず、#send()
プログラム全体をブロックする代償を支払うことになります。そのため、待機中もプログラムが応答し続けるように、非同期方式でコーディングします。この非同期性は、イベント リスナー (別名イベント ハンドラー) とコールバック関数を使用することによって実現されます。
応答が到着したら、単純にコンソールにダンプしたいとします。まず、実行したいコールバック関数を作成する必要がありますonload
:
function dumpResponse() {
// `this` will refer to the `XMLHTTPRequest` object that executes this function
console.log(this.responseText);
}
次に、このコールバックをインターフェイスonload
で定義されたイベントのリスナー/ハンドラーとして設定します。XMLHttpRequest
var request = new XMLHttpRequest();
// Set the event handler
request.onload = dumpResponse;
// Initialize the request
request.open('get', 'https://api.github.com/users/funchal', true)
// Fire away!
request.send()
JSON.parse()
データを文字列として受け取るので、何か意味のあることを行うには、文字列を解析する必要があります。あなたが持っている公開リポジトリの数とあなたの名前をデバッグしたいとします。この関数を使用して文字列を JSON に解析し、必要な属性を取得できます。
function printRepoCount() {
var responseObj = JSON.parse(this.responseText);
console.log(responseObj.name + " has " + responseObj.public_repos + " public repositories!");
}
var request = new XMLHttpRequest();
request.onload = printRepoCount;
request.open('get', 'https://api.github.com/users/funchal', true)
request.send()
// => Giovanni Funchal has 8 public repositories!
の詳細については、W3C 仕様とMozilla Developer Networkを参照してくださいXMLHttpRequest
。