Amazon Web Service と PHP で JSONP

| コメント(0) | トラックバック(0)
AsociateHelperのバージョンアップに備えて、Amazonの商品情報をJSONPで呼び出す方法をメモっておきます。

JSONPって何よ?って方は以下を参照。

hail2u.net - Weblog - JSONP
http://hail2u.net/blog/coding/jsonp.html

JSONをJavascriptでより扱いやすくするものっぽいです。


JSONPサンプル
http://amazie.jp/la/json.php?mode=Books&keyword=harry&callback=loaded

※これは、サンプルで公開サービスではないです。予告なく停止することがあります。


これを使ったAmazon検索
http://amazie.jp/la/jsonp/new.htm


コードのせいなのか、うちのサーバーが重いのか、今ひとつレスポンスがよくない感じ。


PHPを使うことで、いくつかメリットがあります。

・Amazon Web Service の REST+XSL のトラブルを回避できる。

REST+XSLはトラブルが生じると素のXMLを返すことがあります。最近も、ありましたね。
amazieはこの方法を使ってるので、動かなくなったり。そういうリスクを回避できます。

・Services_Amazonにキャッシュする機能があるので、1秒間1コールの制限にひっかからずに済む。

キャッシュされたものは素早く表示でされます。


ひとつ問題は、JSONはクロスドメイン可で、誰でも利用できてしまうので、サーバーのリソースが心配なことです。
こういうのリファラで制限するべきなんでしょうか?リファラを送らないUAの場合どうすれば?教えて偉い人。


以下、ライブラリのインストール方法とPHPのサンプルコード


PHPからAWSを扱うライブラリのインストール。

PEAR :: Package :: Services_Amazon
http://pear.php.net/package/Services_Amazon
wget http://pear.php.net/get/Services_Amazon-0.6.0.tgz
pear install Services_Amazon-0.6.0.tgz


以下のページを元に、PHP-JSONをインストール

Do You PHP? - PHPでJSON

http://www.doyouphp.jp/sample/sample_xml_json.shtml
wget http://www.aurore.net/projects/php-json/php-json-ext-1.2.1.tar.bz2
tar jxf php-json-ext-1.2.1.tar.bz2 -C /usr/local/src/
cd /usr/local/src/php-json-ext-1.2.1/
./configure
make
make install

php.iniに
extension=json.so


コードがあってるかわかりませんがサンプルコード。
require_once 'PEAR.php';
require_once 'Services/AmazonECS4.php';
require_once 'Cache.php';

$amazon = new Services_AmazonECS4('DEVELOPER_ID', 'ASSOCIATE_ID');
$amazon->setLocale('JP');
$amazon->setCache('file', array('cache_dir' => 'cache/'));
$amazon->setCacheExpire(3600);

$options = array();
$options['Keywords'] = htmlspecialchars($_GET['keyword']);
$options['ResponseGroup'] = 'Large,EditorialReview';
$result = $amazon->ItemSearch(htmlspecialchars($_GET['mode']), $options);

$callback = ($_GET['callback'])?htmlspecialchars($_GET['callback']):'loaded';

$data = array();
if($result[TotalResults] == '1'){
$data = array(array(
Title => $result[Item][ItemAttributes][Title],
Artist => $result[Item][ItemAttributes][Creator][1],
ASIN => $result[Item][ASIN],
));

} else {

for($i=0;$i
array_push( $data,
array(
Title => $result[Item][$i][ItemAttributes][Title],
Artist => $result[Item][$i][ItemAttributes][Creator][0][_content],
ASIN => $result[Item][$i][ASIN],
)
);
}

}

header('Content-Type: application/x-javascript');

if (PEAR::isError($result)) {
echo 'loaded({error:\"".$result->message."\"});';
} else {
$output = json_encode($data);
echo $callback.'('.$output.');';
}


ホントのところはPHP-JSONがうまく動作しなくて最後ら辺はこうなってます。

if (PEAR::isError($result)) {
echo 'loaded({error:\"".$result->message."\"});';
} else {
//echo $amazon->getProcessingTime() . 'sec';
//var_dump($result);
if (!extension_loaded('json')) {
if (!dl('json.so')) {
exit;
}else{
//$output = json_encode($result);
$output = json_encode($data);
echo $callback.'('.$output.');';
//echo $output;
}
}
}

これでサーバーサイドはとりあえず。

なんだかファイルの日付を見たら去年の11月にサーバー部分はだいたいここまで作ってたようです。
まとまった時間が取れないとか言ってるうちに半年以上過ぎてしまったとは・・・orz
アウトプットしながら頑張ります。

トラックバック(0)

トラックバックURL: http://a-h.panepon.com/mt5/mt-tb.cgi/171

コメントする

このブログ記事について

このページは、AUSGANG SOFTが2006年8月31日 17:43に書いたブログ記事です。

ひとつ前のブログ記事は「AmazonのURL変更に伴いAsociateHelperを更新」です。

次のブログ記事は「LDR、IMEをオフにするGreasemonkeyスクリプト(Windows限定)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ