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
以下のページを元に、PHP-JSONをインストール
Do You PHP? - PHPでJSON
http://www.doyouphp.jp/sample/sample_xml_json.shtml
php.iniに
コードがあってるかわかりませんがサンプルコード。
ホントのところはPHP-JSONがうまく動作しなくて最後ら辺はこうなってます。
これでサーバーサイドはとりあえず。
なんだかファイルの日付を見たら去年の11月にサーバー部分はだいたいここまで作ってたようです。
まとまった時間が取れないとか言ってるうちに半年以上過ぎてしまったとは・・・orz
アウトプットしながら頑張ります。
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
アウトプットしながら頑張ります。
コメントする