O'REILLY JavaScript 第5版を飛ばし読む(20章 HTTPの制御)

よく使う Ajax はどのような仕組みで動いているのか、概要をまとめる。

XMLHttpRequest

クライアントとサーバーの間でデータを伝送するための機能を、クライアント側で提供するAPIのこと。Ajaxプログラミングで利用される。

以下の構文で XMLHttpRequest を生成する。

var myRequest = new XMLHttpRequest();

リクエストの送信

myRequest.open("GET", "/bar/foo.txt", true);
myRequest.setRequestHeader("User-Agent, "XMLHttpRequest");
...

open メソッドでリクエストを初期化する。第一引数には使用するHTTPメソッドを指定する、"GET"、"POST"、"PUT"、"DELETE"など。第二引数にはリクエストを送信するURLを指定する。第3引数には非同期で操作を実行するかを指定する。デフォルトは true で非同期実行。

必要であれば setRequestHeader でヘッダを設定する。この時、ブラウザが自動で関連したクッキーをリクエストに追加する。

最後に send 関数でリクエストを送信する。リクエストのボディを send 関数の引数として渡す。GET の場合は null

open メソッドの第三引数に false を指定した場合、同期リクエストとなるのでレスポンスが到着するまで、このメソッドは返らない。

myRequest.send(null);

非同期レスポンスの処理

open メソッドの第三引数に true を指定した場合、send() メソッドはサーバーにリクエストを送信したらすぐにリターンする。

XMLHttpRequest の場合、イベントハンドラonreadystatechange プロパティに登録されるので、readystate の値が変わるたびにイベントハンドラ関数が呼び出される。 readystate はHTTPリクエストの状態を表す整数値で、以下の5つの値のうちいずれかを取る。

  • 0: open() はまだ呼び出されていない
  • 1: open() は呼び出されたが、send() は呼び出されていない
  • 2: send() は呼び出されたが、サーバはまだレスポンスを返していない
  • 3: サーバからデータを受信中である
  • 4: サーバのレスポンスの受信が完了した

サーバから返されたHTTPのステータスコードを調べたい場合は、send() 呼び出しのあとで XMLHttpRequest オブジェクトの status プロパティを調べる。 その他のレスポンス等のプロパティについては、以下の仕様を参照。 https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest

Ajax の注意事項

Ajax は上記の XMLHttpRequest オブジェクトを用いて、Http をスクリプトにより制御し、ページをリロードすることなく Web サーバーと通信する技術である。 ブラウザは表示のためのデータ解析が不要であり、またやりとりするデータ量も少ないため、操作性やレスポンス時間を改善することができる。

ただし、実装時には以下のような注意点がある。

  • レスポンスを待っている間のフィードバックを提供する必要がある。ネットワークの状態やサーバでの処理量によっては、想定外の時間がかかることもありうるが、 ユーザーには通信中であることがわからないため、アニメーション等で状況を適切に通知する必要がある。
  • Ajax による通信では URL が更新されないため、ある特定の状態をブックマークすることができない。これを解決するためには、URL パラメータ等を使って、 URL 中にアプリケーションの状態をカプセル化する必要がある。
  • ブックマークと同様の理由で、ブラウザの戻るボタン等も利用することができない。これを解決するためには、History API 等を使って、 適切なタイミングで URL を更新する必要がある。

感想

Ajaxの動作の仕組みが読む前より具体的にイメージできるようになった気がする。。。

ところでO'REILLY JavaScript 第5版の飛ばし読みはこれで最後の予定。なぜならこの本は会社の先輩から借りていたのですが、返却してしまったから・・・。 というか、第6版がすでに出ているんですね。第5版では最新のjavascriptの仕様が抜けていたので、6版もぜひ読みたいが。