PEAR::HTTP_Requestを使う

わりとよく使うがHELPが見づらかったりサンプルがなかったりするのでメモ。毎回過去の自分のコードを引っ張り出してくるのも効率が悪いし。

導入

$ pear install --alldeps HTTP_Request

–alldepsで用意されると思うが、Netパッケージに依存しているので以下のファイルが必要になる。

  • Net/Socket.php
  • Net/URL.php

基本的な使い方

  1. コンストラクタにリクエスト先URLを指定してインスタンス生成
  2. 拡張ヘッダ、クエリ文字列、POSTパラメータなどを突っ込む
  3. リクエストしてエラーチェック
  4. レスポンスを取得して煮るなり焼くなり
<?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      = 0;
$this->_timeout  = null;
$this->_response = null;
//後略
?>

ということで

自分が次使うとき困らない最低限をまとめてみた。次はXML_Unserializerを書いておこうか。

The PHP Extension and Application Repository
http://pear.php.net/

Manual :: HTTP_Request
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

2 Comments

  1. Bugle Diary 2月 22, 2010 9:38 pm  返信

    [php]POST処理

    PEARのHTTP_Requestを使う際に、どうやってPOST送信するのかなーっと調べました。

  2. 弱小PHPerの憂鬱 4月 19, 2010 11:27 pm  返信

    EC-CUBE LC_Page::sendRedirect()に引数を渡せない

    通常のURLからSSLに移動を行いたいときなど、LC_Page::sendRedirect()にURLを渡せば自動的にセッションIDを付加した上で転送を行ってくれます。
    ところが転送先URLに
    hoge.php?id=100
    とか書いても、転送先では$_REQUEST[''id'']を取得できなかったりします(取得できる場合もある)。
    転送先URLの作成などはPear::Net_URLを使用しています。
    URLにセッションID等を付加する処理は以下のようになっています。

Leave a comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください