APIとは

APIとPHPの関係

「URL+パラメーター群」をインターネット上に送出することにより、該当サーバーのデーターリクエストおよびデータの取得が可能です。この「URL+パラメーター群」の書法を規定したものがAPIであって、その書法に則り、サーバー上の動的な情報を利用する一手段がPHPです。

PHPで利用すると便利なAPI

PHPで刻々と変化する情報に対応

このページでは、「楽天ウェブサービスセンターブログ」から入手した商品検索API利用のサンプルコードを利用していきますが、好みの商品を検索することだけを考えても、千差万別のワードで検索されることを考えれば、検索ワードへの動的対応が必要です。そういった対応はXHTMLでは不能ですので、PHPを使用するのは一つの有効な解決策です。

初心者である私ノテータの失敗録を残すことがこのホームページの目的でありますが、ここでは更にPHPの有効性も表現できればいいなと思います。

とにかくLet's try PHP!

とにかくなにかやらないと始まりませんね。「実益に繋がりつつ、学習にも気合が入りそうなので、楽天のAPIをPHPで利用してみる」とは言いつつ、いっきに0からのコード作成は、手の付けどころが判らないので、サンプルを探しました。

API利用のサンプルコード(小変更有)

楽天ウェブサービスセンターブログから取得したコードに最小限の変更を加えたものが次のコードです。

<?php // --------------------------------------------------------------- // 楽天商品検索API の利用サンプルコード (PHP) // --------------------------------------------------------------- // 以下を変更してPHP4が動作する公開領域におくだけでOK // 詳細な仕様は以下を参照 // - 楽天ウェブサービス- http://webservice.rakuten.co.jp/ // // UTF-8で保存すること /* ---------------- 以下、変更部分 ------------------------------ */ // 自分のディベロッパーID $DEVELOPER_ID = "自分のディベロッパーID"; //自分のアフィリエイトID $AFFILIATE_ID = "自分のアフィリエイトID"; /* ---------------- 以上、変更部分 ------------------------------ */ //--------- API毎の固定値 // API名 $API_NAME = "楽天商品検索API"; // APIのURL //$API_BASE_URL = "http://api.rakuten.co.jp/rws/1.3/rest"; //旧バージョン用のためコメントアウト $API_BASE_URL = "http://api.rakuten.co.jp/rws/3.0/rest"; //オペレーション名 $OPERATION = "ItemSearch"; //バージョン //$API_VERSION = "2007-02-14"; //旧バージョンなのでコメントアウト $API_VERSION = "2010-09-15"; //--------- リクエストパラメタの取得とAPIへのリクエストURL生成 // リクエストURL生成 $api_url = sprintf("%s?developerId=%s&affiliateId=%s&operation=%s",$API_BASE_URL,$DEVELOPER_ID,$AFFILIATE_ID,$OPERATION); //APIへのパラメタの連想配列 $api_params = array( "keyword" =&gt; "", "version" =&gt; $API_VERSION, "shopCode" =&gt; "", "genreId" =&gt; "", "catalogCode" =&gt; "", "hits" =&gt; "", "page" =&gt; "", "sort" =&gt; "", "minPrice" =&gt; "", "maxPrice" =&gt; "", "availability" =&gt; "", "field" =&gt; "", "carrier" =&gt; "", "imageFlag" =&gt; "" ); // リクエストパラメタ取得 reset($api_params); while(list ($key, $val) = each($api_params) ){ if(isset($_REQUEST[$key]) && $_REQUEST[$key] != ""){ // リクエストパラメタにあれば、APIへのURLに追加 $api_url = sprintf("%s&%s=%s",$api_url, $key, urlencode($_REQUEST[$key])); $api_params[$key] = $_REQUEST[$key]; }else if(isset($api_params[$key]) && $api_params[$key] != ""){ // パラメタにあれば、APIへのURLに追加 $api_url = sprintf("%s&%s=%s",$api_url, $key, urlencode($api_params[$key])); } } // --------- API取得処理 // API結果ステータス $status = null; // API結果メッセージ $statusmsg = null; // 商品情報の配列 $item_array = array(); // 結果件数 $count = 0; // 商品検索ボタンを押された時、APIにリクエストを投げる if( isset($_REQUEST['submit']) && $_REQUEST['submit'] == "商品検索" ){ $contents = file_get_contents($api_url); // XMLをパースして構造体(values)に入れる $parser = xml_parser_create('UTF-8'); xml_parse_into_struct($parser,$contents,$values); xml_parser_free($parser); // 連想配列から値を取得 if($values){ $item_temp = null; foreach ($values as $data) { if(isset($data['tag'])){ // タグ名のよって分岐 switch ($data['tag']) { case 'STATUS': //共通パラメータ:Status if(isset($data['value'])){ $status = $data['value']; } break; case 'STATUSMSG': //共通パラメータ:Statusに特化したメッセージ if(isset($data['value'])){ $statusmsg = $data['value']; } break; case 'COUNT': //全体情報:検索数 if(isset($data['value'])){ $count = $data['value']; } break; case 'ITEM': //商品情報:ITEMタグ開始 if($data['type'] == 'open'){ $item_temp = array(); }else if($data['type'] == 'close'){ //商品情報:ITEMタグ終了 array_push($item_array,$item_temp); $item_temp = null; } break; default: if(is_array($item_temp)){ //商品情報:ITEMタグ終了 if(isset($data['value'])){ $item_temp[$data['tag']] = $data['value']; } } break; } } } } // 以下からHTML表示部分 } header("Content-type:text/html;charset=UTF-8"); ?> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title><?=$API_NAME?>/楽天ウェブサービス</title> </head> <body bgcolor="#ffffff" TEXT="#333333" LINK="#3333cc"> <!-- タイトル --> <h1 style="font-size:16px;font-weight:bold;">楽天ウェブサービス</h1><hr size="1" noshade><?=$API_NAME?><hr size="1" noshade> <!--/タイトル --> <!-- HTMLフォーム表示 --> <form action="item_search.php" method="post"> <table width="60%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt 0pt 0px;"> <tr><td bgcolor="#afafaf"> <table width="100%" border=0 cellspacing=1 cellpadding=5 style="font-size:12px;"> <tr><td style="background-color: #eeeeee;">検索キーワード</td><td style="background-color: #ffffff;"> <!-- キーワード入力テキストボックス --><input type="text" name="keyword" value="<?=htmlspecialchars($api_params['keyword'])?>" size="30"> </td></tr> <tr><td style="background-color: #eeeeee;">価格</td><td style="background-color: #ffffff;"> <!-- 最小価格入力テキストボックス --> <input type="text" name="minPrice" value="<?=htmlspecialchars($api_params['minPrice'])?>" size="15"> 円 〜 <!-- 最上価格入力テキストボックス --> <input type="text" name="maxPrice" value="<?=htmlspecialchars($api_params['maxPrice'])?>" size="15"> 円 </td></tr> </table> </td></tr></table><br> <input type="submit" name="submit" value="商品検索"> </form> <!-- HTMLフォーム表示 --> <!-- API検索結果表示 --> <font style="font-size:14px;"> <?php if($status != ""){ ?>取得結果: <?=$status?><br><? } ?> <?php if($statusmsg != ""){ ?>取得内容: <?=$statusmsg?><br><? } ?> <?php if($count > 0){ ?>取得件数: <?=$count?><br> <table width="60%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt 0pt 0px;"> <tr><td bgcolor="#afafaf"> <table width="100%" border=0 cellspacing=1 cellpadding=5 style="font-size:12px;"> <tr align="center" style="background-color: #eeeeee;"> <td width="8%" >写真</td> <td width="47%">商品名</td> <td width="15%">価格</td> <td width="30%">ショップ名</td> </tr> <?php foreach ($item_array as $item){ ?> <tr style="background-color: #ffffff;"> <td width="8%" align="center"><a href="<?=$item['ITEMURL']?>" target="_top"><img src="<?=$item['SMALLIMAGEURL']?>" border=0></a></td> <td width="47%" align="left"><a href="<?=$item['AFFILIATEURL']?>" target="_top"><font size="-1"><?=$item['ITEMNAME']?></a></td> <td width="15%" align="right" nowrap> <?=$item['ITEMPRICE']?> 円</td> <td width="47%" align="left"><a href="<?=$item['SHOPURL']?>" target="_top"><font size="-1"><?=$item['SHOPNAME']?></a></td> </tr> <?php } ?> </table> </td></tr></table> <?php } ?> </font> <!-- /API検索結果表示 --> </body> </html>

赤部は、楽天商品検索APIページより取得したデベロッパーIDとアフィリエイトIDを入れます。

緑部は、同様に楽天商品検索APIページを参照すると最新バージョンの情報がありますので、旧バージョンのものをコメントアウトして、最新バージョンに書き換えました。

そして、ファイル名「test.php」として忘れずにUTF-8で保存してからサーバーにアップロードしました。

そして、上記のPHPファイルを実行

PHPによるAPI利用検索ワード入力

正常に入力フォームが表示されたようですので、検索ワードを入力。^^

検索ボタンをポチッ(ここからが、API実行だと思われ・・・ワクワク)

PHPによるAPI利用サンプル実行時の404エラー

あれれ〜、404エラー画面をここで見るとは><。「ロリポップちゃん何か悪いことしちゃった?ゴメンちゃい」と思いつつ考えるに、何やら「item_search.php」というファイルが無いということらしい。
余談ですが、「item_search.php」なんてワシャ知らんぞ!と、すぐに立ち直る私でありました。

「item_search.php」のファイル名に依存する記述を探す

<!-- タイトル --> <h1 style="font-size:16px;font-weight:bold;">楽天ウェブサービス</h1><hr size="1" noshade><?=$API_NAME?><hr size="1" noshade> <!--/タイトル --> <!-- HTMLフォーム表示 --> <form action="item_search.php" method="post"> <table width="60%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt 0pt 0px;"> <tr><td bgcolor="#afafaf">

あったぞ!ここだ!その行は、フォームに入力された情報を「item_search.php」に送る!だと思いますので、これではだめですね。シンプルな原因でしたね。「item_search.php」なんて無いんですから。

ファイル名依存をPHPで修正する

<!-- HTMLフォーム表示 --> <!--<form action="item_search.php" method="post">ファイル名依存を修正 --> <!--PHPで自己のファイル名を自動取得するようにした --> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <table width="60%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt 0pt 0px;"> <tr><td bgcolor="#afafaf">

該当部を「item_search.php」から「test.php」に書き換えることでも対応できますが、せっかくPHPを学習しているところなので、実行中のファイル名の取得ができないか調べてみたら、
<?php echo $_SERVER['PHP_SELF']; ?>の記述でできることがすぐにネットで出てきましたよ。正確にはドメインのルートからのパス付で取得されますが、動作上は同一になります。

「ファイル名を変えたら、この行も変えるって?><・・・それってPHPじゃないよね!」と言いたい気分。と急に偉そうになる私であった。ま、いっか^^勉強になったしね〜。初心者には良い設問だったのかも。
これで、*.phpならば、自由にファイル名を変えても平気ですよ。^^

お試しとソースのダウンロードは次からどうぞ

楽天検索API(解説部分の変更版)を試してみる
test.php(ZIP版)を入手する。

※お試しの方は、私のデベロッパーIDとアフィリエイトIDが入っております。また、ダウンロードの方はデベロッパーIDとアフィリエイトIDが入っておりませんので、適宜ご変更ください。尚、お試しや、ダウンロードの結果のいかなる損害に対してもノテータ式−ホームページ作成講座は一切の責任を負わないものと致します。

PHPでのAPI利用に嵌ってきました

実は、今回のAPI利用が可能となったことにより、実用上不可欠な2点の問題が浮かびあがってきています。その2点につきましては、お試しをされるとお判りいただけると思いますが、「商品画像とショップリンクが直リンクになっている」点、そして「折角多量のデータを取得しても限られた1ページ分しか表示できない(ページング機能が無い)」件です。それらについては、「PHPでAPIを利用2」以降で公開いたします。

なにぶん、PHPもAPIも勉強しながらなので、期日のお約束はできませんが、ご了承ください。

講座メニュー

テーマを決めよう

ツールを準備しよう

サーバーを準備しよう

ウェブデザイン

検索エンジン最適化

PHP

HP公開:
2011/07/23
最終更新:2014/07/16