ライブラリーとして使うZend Framework - Zend_Http_Client/Zend_Json篇

クイズ研ZendFrameworkのクイズ

携帯特集があったので珍しく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勉強会とかでもできると良いなと思います。

WEB+DB PRESS Vol.45

Trackback URL for this post:

http://nonn-et-twk.net/twk/trackback/214
0