表1 ●XMLHttpRequest オブジェクトの主なメソッドとプロパティ
表1 ●XMLHttpRequest オブジェクトの主なメソッドとプロパティ
[画像のクリックで拡大表示]
リスト1 ●XMLHttpRequest のインスタンスを作るコード
リスト1 ●XMLHttpRequest のインスタンスを作るコード
[画像のクリックで拡大表示]
図3●XMLHttpRequestオブジェクトを使った通信処理の流れ<br>Webサーバーからの応答をバッファに保管し,状況に応じてイベント・ハンドラを呼び出す。readyStateが4のときには受信完了である。このときresponseTextプロパティやresponseXMLプロパティを使って受信データを取得できる
図3●XMLHttpRequestオブジェクトを使った通信処理の流れ<br>Webサーバーからの応答をバッファに保管し,状況に応じてイベント・ハンドラを呼び出す。readyStateが4のときには受信完了である。このときresponseTextプロパティやresponseXMLプロパティを使って受信データを取得できる
[画像のクリックで拡大表示]
表2 ●readyState プロパティ値
表2 ●readyState プロパティ値
[画像のクリックで拡大表示]

 ここからは少し具体的に,実際にクライアント・サイドで実行されるコードの概要を見ていくことにする。

規格外だが事実上の標準

 Ajaxの中心となるのは,Webサーバーと通信する「XMLHttpRequest」オブジェクトである。Webブラウザに備わるほとんどのJavaScriptは標準に準拠していると説明したが,XMLHttpRequestオブジェクトは標準化の対象外である。しかし幸いなことに,IE,Firefox,Netscape,Opera,Safariなど,多数のWebブラウザがXMLHttpRequestオブジェクトをサポートしており,事実上の標準と言える*6表1[拡大表示]には,XMLHttpRequestオブジェクトの代表的なメソッドとプロパティを示した。一部のWebブラウザで挙動は異なるが,表1に示したメソッドやプロパティは,XMLHttpRequestオブジェクトをサポートするWebブラウザならおおむね同じように機能する。 とはいえ,Webブラウザの種類によってXMLHttpRequestオブジェクトの実装方法が異なる。IEはActiveXコントロールで実装されているのに対し,他のWebブラウザでは組み込みクラスとして実装されている。そこで一般には,リスト1[拡大表示]に示すコードでXMLHttpRequestオブジェクトを生成する*7

応答は内部バッファにためてイベント生成

 XMLHttpRequestオブジェクトを使った通信処理の流れは図3[拡大表示]のようになる*8

 まず,「open」メソッドを呼び出してWebサーバーと接続する*9。このときGETメソッドで接続するのか,それともPOSTメソッドで接続するのかを選べる(図3の(1))。

 ちなみにopenメソッドの接続先として選べるのは,JavaScriptのプログラムを送信したWebサーバーだけである。それ以外のWebサーバーを指定すると,実行時エラーが発生する。これはセキュリティ上の理由から,ユーザーの意図しないサーバーに対してJavaScriptが勝手にデータを送信しないようにするためである。

 サーバーに接続したら,受信完了などの通知を受け取るイベント・ハンドラを登録する(同(2))。具体的には,「onreadystatechange」プロパティに設定する。次に「send」メソッドを呼び出せば(同(3)),Webサーバーへの要求が完了する。ここでは話を簡単にするためsendメソッドに引数を与えていないが,引数としてPOST時のパラメータを渡すことができる。

 またsendメソッドを呼び出す前に,「sendRequestHeader」メソッドを呼び出して要求時のヘッダー情報の設定もできる*10。sendメソッドの呼び出しが終われば非同期通信が始まる。非同期通信なので受信が完了するまで待たされることはなく,以降は,ほかの処理をしても構わない。

 サーバーからの応答は内部バッファにためられ,バッファの変化に応じて,あらかじめ指定しておいたイベント・ハンドラが呼び出される。イベント・ハンドラが呼び出されるタイミングは「readyState」プロパティ(表2[拡大表示])の値が変化してイベントが発生したときだが,イベントの発生はWebブラウザによって動きが異なる。確実なのは,readyStateプロパティの値が「4」になったときだけである。「4」になったときには受信が完了している。イベント・ハンドラでは,受信したデータを「responseText」プロパティまたは「responseXML」プロパティで取得できる。前者はテキスト形式のデータで読み取るもの,後者はXML形式のデータで読み取るものである。

◇            ◇            ◇

 Ajaxのポイントは,ユーザーではなく,JavaScriptがWebサーバーへの通信を指示している点にある。これを押さえれば,後は,クライアントとサーバー間でどのようなデータ形式でやり取りするか,そして,クライアントはサーバーから受け取ったデータをどのようにしてユーザーに見せるかを考えればよい。次回は,クライアントとサーバーが,どのような形式でデータをやり取りするかに焦点を当てる予定である。

(大澤 文孝 テクニカル・ライター/プログラマ)