ライブラリーとして使うZend Framework - Zend_Http_Client/Zend_Json篇
携帯特集があったので珍しくWEB+DB PRESSを買ったら、下岡さんのステップアップPHP講座にて、
WebサービスAPIにアクセスする方法が記載されていました。
そこではPEAR::HTTP_RequestとPEAR::HTTP_Clientを使った方法が紹介されていましたので、
今回はそれに対抗して、記事と同じコードをZend FrameworkのHttpモジュールとjsonモジュールを使って記述してみます。
Zend Frameworkをフレームワークとして使う必要はありませんのでご安心を。Zend Frameworkは他のフレームワークと組み合わせても使えます。
その他のメリットとしては、json_encode, json_decode関数はPHP5.2での導入ですが、Zend_JsonはPHP5.1.4以降で使えます。あんまり変わらないですね(^^;
まずインストールですが、公式サイトからダウンロードしても良いのですが、
手っ取り早いのは以下の非公式PEARリポジトリーを使う方法です。
# pear channel-discover zend.googlecode.com/svn # pear install zend/zend
インストールが済んだら、さっそくコードです。
はてなのjson apiを取得するコードで、雑誌の208ページ、リスト6とリスト7に相当します。
require_once 'Zend/Http/Client.php';
define('REQUEST_URL', 'http://d.hatena.ne.jp/shimooka/favorites.json');
$client = new Zend_Http_Client(REQUEST_URL);
// レスポンスのオブジェクトを取得
$response = $client->request();
$status_code = $response->getStatus();
if ($status_code !== 200) {
die('failed to get() : ' . $status_code . PHP_EOL);
}
// ステータスコード
printf('HTTP/%s %s' . PHP_EOL, $response->getVersion(), $status_code);
// レスポンスヘッダー
foreach ($response->getHeaders() as $name => $value) {
printf("%s: %s" . PHP_EOL, $name, $value);
}
// レスポンスボディー
var_dump($response->getBody());
// はてなダイアリーのお気に入りAPIから返されるAPIデータが
// JSONの仕様に準拠していないため、データを加工して利用する
$response_body = preg_replace('/(favorites|name)( ?:)/', '"\\1"\\2', $response->getBody());
$response_body = str_replace("'", '"', $response_body);
// JSONデータをオブジェクトの配列に変換
require_once 'Zend/Json.php';
$stdobj = Zend_Json::decode($response_body, Zend_Json::TYPE_OBJECT);
if ($stdobj === null || !isset($stdobj->favorites)) {
die ('failed to Zend_Json::decode()' . PHP_EOL);
}
// ユーザー名を一覧表示
foreach ($stdobj->favorites as $obj) {
echo $obj->name . PHP_EOL;
}
Zend_Http_Requestとほぼ同様に書けることがわかると思います。
謎のpreg_replaceについては、雑誌にも記載がありますがはてなのAPIがおかしいのため付けています。雑誌のない方は下岡さんのページをご覧ください。
Zend_Http_Clientはデフォルトでは内部でSocketを使いますが、アダプターを切り替えることでCurlを使うこともできますし、Proxy経由の接続も初期化時に指定するだけで簡単に切り替えられます。
$httpClientConfig = array(
'adapter' => 'Zend_Http_Client_Adapter_Proxy',
'proxy_host' => 'proxy.int.zend.com',
'proxy_port' => 8000,
'proxy_user' => 'shahar.e',
'proxy_pass' => 'bananashaped'
);
$client = new Zend_Http_Client($url, $httpClientConfig);
Zend_HttpモジュールではHTTP 認証やファイルのアップロード、クッキーへの対応などもできます(私は試したことないですが)。興味をもった方はまずはZend_Httpの日本語オンラインマニュアルをご覧になると良いと思います。
Zend FrameworkはMVCフレームワーク使わなくても役立つよ、と言う辺りの話をそのうちPHP勉強会とかでもできると良いなと思います。
Trackback URL for this post:
いままで幾つかのページでgooglecodeにあるZend Frameworkの野良チャネルをお薦めしてきたわけですが、
セミオフィシャルのサイトが準備されてきたのでそちらに移行しました。
http://pear.zfcampus.

