第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) - PEAR講座
くまっち先生のPEAR講座
Lecutures on PHP
第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) (その3)
レスポンスデータを取り扱う (1)
リクエストが無事成功した場合は、リクエスト先からはレスポンスが返ってきます。このレスポンスされたデータも正しく取り扱う必要があります。
HTTP_Requestでは、レスポンスデータについての処理を行うための専用クラスを別途準備し、そのクラス内にて受信したデータを分析、抽出する仕組みになっています。sendRequestメソッド内でHTTP_Responseという専用クラスを生成し、レスポンスデータに対しての処理を実施します。リスト4がそれら処理を行っているコードの抜粋です。
リスト4. レスポンスデータ処理用クラスを準備する
$this->_response = &new HTTP_Response($this->_sock, $this->_listeners);
$err = $this->_response->process(
$this->_saveBody && $saveBody,
HTTP_REQUEST_METHOD_HEAD != $this->_method
);
接続情報の$this->_sockを引数として渡しつつHTTP_Responseクラスオブジェクトを作成し、その後processメソッドを実行しています。このprocessメソッドにより、レスポンスデータの分析、抽出処理を実施することとなります。
レスポンスデータとは、第4回(*2)、第5回講座(*3)で取り上げたHTTP_Downloadによるダウンロード機能で紹介したとおり、レスポンスヘッダ情報とデータのセットで送信されてきます。ヘッダ内には、サーバ・クライアント間の通信に必要となる情報であったり、送信されてくるデータに関する情報などが含まれています。processメソッドでは、これらヘッダ情報を取得、分析する処理から始まります。リスト5はそのコードの抜粋になります。
リスト5. レスポンスヘッダの抽出
do {
$line = $this->_sock->readLine();
if (sscanf($line, 'HTTP/%s %s', $http_version, $returncode) != 2) {
return PEAR::raiseError('Malformed response.');
} else {
$this->_protocol = 'HTTP/' . $http_version;
$this->_code = intval($returncode);
}
while ('' !== ($header = $this->_sock->readLine())) {
$this->_processHeader($header);
}
} while (100 == $this->_code);

$this->_sockはHTTP_Responseクラスのクラスプロパティですが、このクラスを生成する際に引数として与えられた接続情報、すなわちHTTP_Requestで作成されたNet_Socketと全く同じものです。
do~whileによる反復処理を行っていますが、ここでは最初に行っているNet_Socket($this->_sock)のreadLineメソッドでヘッダ情報を取得しそこで示されているステータスコードが100ならばループするという処理の流れになっており、これはHTTPステータスコードにおける100「リクエストを受け入れ処理を続けている」という仕様によるものをロジック化したコードになっています。
普段ブラウザでステータスコードを確認しながらWebサイトを閲覧することはさほどありませんが、正直なところステータスコードの100に出くわすというものもかなり珍しいケースでしょう。それでもHTTP通信を行うプログラムとして、やはりHTTPの仕様をきちんと盛り込んでコードにする必要はあります。
HTTPデータにおけるヘッダとボディは、一切のデータを含まない一行、すなわち改行のみの行を境に区別する仕組みとなっているため、readLineメソッドで得たデータがブランクになるまでがヘッダ情報ということになります。do~while内で行われているwhile反復処理がそれにあたります。
----
*2) http://www.phppro.jp/school/pear/vol4/1
*3) http://www.phppro.jp/school/pear/vol5/1





ページのトップへ


GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。