PEAR::HTTP_Requestを使う
わりとよく使うがHELPが見づらかったりサンプルがなかったりするのでメモ。毎回過去の自分のコードを引っ張り出してくるのも効率が悪いし。
導入
$ pear install --alldeps HTTP_Request
–alldepsで用意されると思うが、Netパッケージに依存しているので以下のファイルが必要になる。
- Net/Socket.php
- Net/URL.php
基本的な使い方
- コンストラクタにリクエスト先URLを指定してインスタンス生成
- 拡張ヘッダ、クエリ文字列、POSTパラメータなどを突っ込む
- リクエストしてエラーチェック
- レスポンスを取得して煮るなり焼くなり
<?php require_once 'HTTP/Request.php' ; // クエリ文字列がついたURLでリクエスト $request = new HTTP_Request("http://example.jp/check_request.php?guid=ON") ; // クエリパラメータを追加 $request->addQueryString("hoge", "piyo") ; // クエリパラメータを「上書き」 : 名前は似てるが挙動は全然違う $request->addRawQueryString("i_love=you") ; // クエリパラメータを追加 $request->addQueryString("foo", "bar") ; // リクエストを送ってエラーチェック if (PEAR::isError($response = $request->sendRequest())) { // エラー処理 die($response->getMessage()) ; } // レスポンス本文が取得できるのであとは煮るなり焼くなり var_dump($request->getResponseBody()) ; ?>
↑のリクエスト先で var_dump($_GET)とかしてみると…
array(2) { ["i_love"]=> string(3) "you" ["foo"]=> string(3) "bar" }
もともとのクエリ(“?guid=ON”)と最初にaddしたクエリ(“hoge=piyo”)が上書きされているのがわかる。
addQueryStringの第3引数はURLエンコード済みかどうか。デフォルトがfalseなので、指定せずに呼んだ場合はPEAR::Net_URLでrawurlencodeを通される。
POSTしてみる
<?php require_once 'HTTP/Request.php' ; $request = new HTTP_Request("http://hshioya.ct.dsrea.jp/api/hoge.php") ; // メソッドをPOSTに設定 $request->setMethod(HTTP_REQUEST_METHOD_POST) ; // POSTパラメータを積んでいく $request->addPostData("hoge", "piyo") ; // GETと同じようなメソッドがあるので使ってみる $request->addRawPostData("i_love=you") ; // もひとつPOSTパラメータ $request->addPostData("foo", "bar") ; // 後略 ?>
↑のリクエスト先で var_dump($_POST)とかしてみると…
array(2) { ["hoge"]=> string(4) "piyo" ["foo"]=> string(3) "bar" }
今度はaddRawPostDataした結果が無視されている。似たようなメソッド名だが挙動は全然違うので注意。addRawPostDataは値を直接内部変数HTTP_Request._bodyに設定する、一方addPostDataを一度でも使うとHTTP_Request._postDataに値が積まれ、リクエスト時にbodyとして整形したデータが送出される。このとき設定済みの_bodyは上書きされるので無視されてしまう、というわけだ。addRawPostDataはDEPRECATED(非推奨)扱いなのでわざわざ使う必要もないだろうが。
ちなみにaddPostDataの第3引数の仕様はaddQueryStringと同様だが、通るのはurlencodeメソッドである。なんだこの不統一。
ファイルアップロード
これはサンプルどおりで問題ないだろう。Basic認証のサンプルまでついてるので、このページはこのままでいいだろう。addFileメソッドの第3引数はcontentTypeを文字列で指定できるので、必要があれば指定する。
レスポンスの評価
これもサンプルどおり。getResponseCodeとgetResponseHeaderを覚えておけば、レスポンスのチェックに問題は出ないだろう。
コンストラクタのオプション
コンストラクタの第2引数として配列を渡すとクラス変数に引き取ってくれる。用意されている変数はコンストラクタを読めばわかるが備忘録として転記しておく。
<?php //前略 $this->_method = HTTP_REQUEST_METHOD_GET; $this->_http = HTTP_REQUEST_HTTP_VER_1_1; $this->_requestHeaders = array(); $this->_postData = array(); $this->_body = null; $this->_user = null; $this->_pass = null; $this->_proxy_host = null; $this->_proxy_port = null; $this->_proxy_user = null; $this->_proxy_pass = null; $this->_allowRedirects = false; $this->_maxRedirects = 3; $this->_redirects = ; $this->_timeout = null; $this->_response = null; //後略 ?>
ということで
自分が次使うとき困らない最低限をまとめてみた。次はXML_Unserializerを書いておこうか。
●The PHP Extension and Application Repository
http://pear.php.net/manual/ja/package.http.http-request.php
●Manual :: HTTP 経由でファイルをアップロードする
http://pear.php.net/manual/ja/package.http.http-request.file-upload.php
●Manual :: HTTP レスポンスからの情報を評価する
http://pear.php.net/manual/ja/package.http.http-request.response-eval.php