ウェブサービスセンターの日記
楽天商品検索SOAP API PHPサンプルコード解説
楽天商品検索SOAP APIを利用するPHPの簡単なサンプルコードを紹介します。
■動作環境
- PHP5動作環境
PHP5インストール時に--enable-soapと--enable-mbstringの2つのオプションが指定されている必要があります。
例)
./configure --with-apxs2=/usr/local/apache/bin/apxs --enable-soap --enable-mbstring
■サンプルソースご利用の際の注意事項
・ここで掲載するプログラムに関するサポートは一切しておりません。
・ここで掲載するプログラムで発生した直接的及び間接的に生じた損害について
弊社は一切責任を負いませんのでご了承ください。
■楽天商品検索API/サンプルコード概要
すべてのサンプルコードは こちら
・検索フォーム
8行目から11行目で、検索を行うHTMLのフォームを記述しています。
1: <html>
2: <head>
3: <title>商品検索</title>
4: </head>
5: <body>
6:
7: <!-- 検索キーワードの入力 -->
8: <form action="" method="post">
9: <input type="text" name="search_keyword" value="商品検索">
10: <input type="submit">
11: </form>
|
・検索キーワードの取得
13行目〜20行目で、POSTされた検索キーワードを取得し、UTF-8でデコードしています。
13: <?php
14:
15: // リクエストから検索キーワードをセット
16: if (isset($_REQUEST['search_keyword'])) {
17: $keyword = mb_convert_encoding($_REQUEST['search_keyword'], "UTF-8", "auto");
18: } else {
19: $keyword = "";
20: }
|
・SoapClinetの作成
23行目でSOAPクライアントを生成しています。SoapClientのコンストラクタの引数にはwsdlのURLを指定します。今回は商品検索を行うサンプルなので商品検索のwsdlを取得するURLです。
22: // SoapClientを生成
23: $client_itemsearch=new SoapClient("http://api.rakuten.co.jp/rws/soap/ItemSearch/2007-10-25?wsdl");
|
・パラメータの設定
リクエストに設定するパラメータを作成します。44行目から63行目でパラメータの連想配列を作成しています。
25: // パラメータの値
26: $dev_id = "自分のディベロッパーIDを指定してください"; // developerId
27: $aff_id = "自分のアフィリエイトIDを指定してください"; // affiliateId
28:
29: $api_ver = "1.11"; // apiVersion
30: $version = "2007-10-25"; // version
31: $hit_cnt = "30"; // hits
32: $page_cnt = "1"; // page
33: $sort = "+itemPrice"; // sort
34: $min_price = "0"; // minPrice
35: $max_price = "10000"; // maxPrice
36: $avail = "1"; // availability
37: $field = "1"; // field
38: $carrier = "0"; // carrier
39: $img_f = "1"; // imageFlag
40: $or_f = "0"; // orFlag
41: $gen_info = "1"; // genreInformationFlag
42:
43: # パラメータの連想配列
44: $params = array(
45: 'param' => array(
46: 'affiliateId' => $aff_id,
47: 'developerId' => $dev_id,
48: 'keyword' => $keyword,
49: 'apiVersion' => $api_ver,
50: 'version' => $version,
51: 'hits' => $hit_cnt,
52: 'page' => $page_cnt,
53: 'sort' => $sort,
54: 'minPrice' => $min_price,
55: 'maxPrice' => $max_price,
56: 'availability' => $avail,
57: 'field' => $field,
58: 'carrier' => $carrier,
59: 'imageFlag' => $img_f,
60: 'orFlag' => $or_f,
61: 'genreInformationFlag' => $gen_info
62: )
63: );
|
・APIの呼び出し
67行目でAPIの呼び出しを行っています。引数には上で作成したパラメータの連想配列を指定します。
65: // APIの呼び出し
66: try {
67: $result = $client_itemsearch->operationItemSearch($params);
68: } catch (SoapFault $e) {
69: // 呼び出しに失敗した場合
70: print_r($e);
71: exit(0);
72: }
|
・結果の表示
76行目でステータスのチェックを行い、ステータスがSuccessの場合に、78行目から商品毎にループします。今回のサンプルでは画像と、商品名、店舗名を表示しています。
74: // 結果のHTML表示
75: print_r("<table width=\"100%\" border=\"0\">");
76: if ($result->return->status === "Success") {
77: // 取得に成功した場合
78: foreach ($result->return->itemArray as $value) {
79: print_r("<tr>");
80: print_r(" <td width=\"90\">");
81: print_r("<a href=\"$value->affiliateUrl\"><img src=\"$value->mediumImageUrl\" border=\"0\"></a>");
82: print_r(" </td>");
83: print_r(" <td align=\"left\">");
84: print_r(" 商品名 :<a href=\"$value->affiliateUrl\">$value->itemName</a>");
85: print_r(" <br />");
86: print_r(" 店舗名 :<a href=\"$value->shopUrl\">$value->shopName</a>");
87: print_r(" <br />");
88: print_r(" </td>");
89: print_r("</tr>");
90: }
91: } else {
92: // 取得に失敗した場合
93: // ("NotFound","ServerError","ClientError","Maintenance")
94: print_r($result->return->statusMsg);
95: }
96: print_r("</table>");
97:
98: ?>
99:
100: </body>
101: </html>
|
以上、今回はPHPで、SOAPの商品検索APIを利用する簡単なサンプルを紹介いたしました。
SOAPを利用する際、参考にしていただければ幸いです。
楽天商品検索API Javaサンプルコード解説
楽天商品検索APIを利用したJavaの簡単なサンプルコードを紹介します。
■動作環境
- Java実行環境
- Javaサーブレットコンテナ
■サンプルソースご利用の際の注意事項
・ここで掲載するプログラムに関するサポートは一切しておりません。
・ここで掲載するプログラムで発生した直接的及び間接的に生じた損害について
弊社は一切責任を負いませんのでご了承ください。
■楽天商品検索API/サンプルコード概要
・ファイル構成
WEB-INF/src/shopping/ItemSearchServlet.java
WEB-INF/itemSearch.xsl
WEB-INF/web.xml
■ItemSearchServlet.java
検索キーワードを取得して、XSLT処理を行うサーブレットクラスです。
この全ソースコードは こちら
・解説1 keywordパラメータの取得
26: // パラメータを取得
27: String keyword = request.getParameter("keyword");
28: if (keyword == null) {
29: keyword = "";
30: } else {
31: keyword = new String(keyword.getBytes("ISO-8859-1"),
32: "JISAutoDetect");
33: }
|
27行目でkeywordパラメータを取得し、
31行目で文字コード変換をしています。
・解説2 XML Transformerの作成
今回のサンプルではXSLTでXMLをHTMLに変換してページを表示します。
実際に、変換処理を行うJavaのTransformerオブジェクトを作成します。
36: TransformerFactory factory = TransformerFactory.newInstance();
37: Transformer transformer = factory.newTransformer(new StreamSource(
38: this.getServletContext().getRealPath(
39: "/WEB-INF/itemSearch.xsl")));
40:
41: transformer.setOutputProperty(OutputKeys.METHOD, "html");
42: transformer.setOutputProperty(OutputKeys.ENCODING, "EUC-JP");
43: transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,
44: "yes");
45: transformer.setOutputProperty(OutputKeys.INDENT, "yes");
46: transformer.setParameter("keyword", keyword);
|
36行目でファクトリを作成し、37行目でファクトリから新しいTransformerオブジェクトを作成し、
41〜45行目でTransformerオブジェクトのプロパティを設定し、46行目でXSLファイルで使用するkeywordパラメータの値を設定しています。
・解説3 APIからの入力ストリームを取得
49: String requestPath = "http://api.rakuten.co.jp/rws/1.11/rest?developerId="
50: + DEVELOPER_ID
51: + "&operation=ItemSearch&version=2007-10-25&keyword="
52: + URLEncoder.encode(keyword, "UTF-8");
53:
54: URL requestUrl = new URL(requestPath);
55: URLConnection connection = requestUrl.openConnection();
56: InputStream input = connection.getInputStream();
57: BufferedReader reader = new BufferedReader(new InputStreamReader(
58: input, "UTF-8"));
|
49行目でリクエストするAPIのパスを作成し、54行目でそのURLオブジェクトを作成しています。
55行目から57行目で実際にAPIに接続し入力ストリームを取得しています。
・解説4 XSLT処理の実行
61: transformer.transform(new StreamSource(reader), new StreamResult(
62: response.getOutputStream()));
|
61行目でTransformerオブジェクトのtransformメソッドでXMLからHTMLへの変換を行っています。
■itemSearch.xsl
XMLからHTMLへの変換方法が記述されているXSLファイルです。このファイルをいろいろいじることによって画面に表示するデータやレイアウトを自由に変えることができます。
今回のサンプルは画像と商品名のみの表示を行う簡単なものです。
全ソースコードは こちら
・解説1 パラメータの取得
4: <xsl:param name="keyword" />
|
4行目でサーブレットで設定されたkeywordパラメータの値を取得しています。
・解説2 APIのステータスの取得
21: <xsl:variable name="status" select="Response/header:Header/Status" />
|
21行目でStatus要素の中にあるAPIレスポンスのステータス情報を取得しています。
・解説3 ステータス毎の処理
22: <xsl:choose>
23: <xsl:when test="$status='Success'"> <!-- Successの場合 -->
24: <b>検索結果:<xsl:value-of select="Response/Body/itemSearch:ItemSearch/count" />件
25: <xsl:value-of select="Response/Body/itemSearch:ItemSearch/page" />ページ目を表示</b> <br/>
26:
27: <table border="0">
28: <!-- 商品毎にループ開始 -->
29: <xsl:for-each select="Response/Body/itemSearch:ItemSearch/Items/Item">
30: <tr>
31: <td>
32: <!-- 画像表示 -->
33: <img>
34: <xsl:attribute name="src">
35: <xsl:value-of select="smallImageUrl" />
36: </xsl:attribute>
37: </img>
38: </td>
39: <td>
40:
41: <!-- 商品名表示 -->
42: <a>
43: <xsl:attribute name="href">
44: <xsl:value-of select="itemUrl" />
45: </xsl:attribute>
46: <xsl:value-of select="itemName" /><br/>
47: </a>
48: </td>
49: </tr>
50: </xsl:for-each>
51: <!-- 商品毎にループ終了 -->
52: </table>
53:
54: </xsl:when>
55: <xsl:when test="$status='NotFound'"> <!-- NotFoundの場合 -->
56: 商品は見つかりませんでした
57: </xsl:when>
58: <xsl:when test="$status='ClientError'"> <!-- ClientErrorの場合 -->
59: キーワードを入力してください
60: </xsl:when>
61: <xsl:when test="$status='ServerError'"> <!-- ServerErrorの場合 -->
62: サーバーエラーが発生しました
63: </xsl:when>
64: </xsl:choose>
|
24行目から54行目で、ステータスがSuccess(成功)だった場合の処理を記述しています。
25行目で検索結果件数を表示し、29行目から商品毎にループさせて、商品画像と商品名の表示を行っています。
■web.xml
web.xmlでは、/itemSearchというパスでリクエストを受けたときにItemSearchSearvletで処理するようにサーブレットマッピングの設定をします。
1: <?xml version="1.0" encoding="UTF-8"?>
2: <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
3: <servlet>
4: <servlet-name>itemSearch</servlet-name>
5: <servlet-class>shopping.ItemSearchServlet</servlet-class>
6: </servlet>
7:
8: <servlet-mapping>
8: <servlet-name>itemSearch</servlet-name>
10: <url-pattern>/itemSearch</url-pattern>
11: </servlet-mapping>
12: </web-app>
|
今回は、JavaでXSLTを使用して商品検索を行う簡単なサーブレットを紹介しました。
簡単なサンプルでしたが、XSLTはとても便利な機能ですので、参考にしていただければ幸いです。
前回では楽天商品検索APIから商品情報を取得して
そのリクエスト結果(XML)を簡単な正規表現で要素分解(パース)するところまででした。
いよいよ検索結果をHTMLで返す処理にはいります。
155: #---------------------------------
156: # HTMLコンテンツ
157: #---------------------------------
158: print "Content-type: text/html; charset=UTF-8\n\n";
|
|
上記はこのPerlスクリプトがアクセスしてきたブラウザに返すレスポンスヘッダにになります。
\n\n(改行2文字)まではブラウザ上に表示されません。
文字エンコードの指定はUTF8にします。
159: print <<"EOF";
160: <html lang="ja">
161: <head>
162: <meta http-equiv="content-type" content="text/html; charset=UTF-8">
163: <title>$API_NAME/楽天ウェブサービス</title>
164: </head>
165: <body bgcolor="#ffffff" TEXT="#333333" LINK="#3333cc">
166:
167: <!-- タイトル -->
168: <h1 style="font-size:16px;font-weight:bold;">楽天ウェブサービス</h1>
169: <hr size="1" noshade>$API_NAME<hr size="1" noshade>
170: <!--/タイトル -->
171:
172: <!-- HTMLフォーム表示 -->
173: <form action="item_search.pl" method="get">
174: <table width="80%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt&nbsnbsp;0px;">
175: <tr><td bgcolor="#afafaf">
176: <table width="100%" border=0 cellspacing=1 cellpadding=5 style="font-size:12px;">
177: <tr><td style="background-color: #eeeeee;">検索キーワード</td><td style="background-color:#ffffff;">
178: <!-- キーワード入力テキストボックス --><input type="text" name="keyword" value="$req_params{d}" size="30">
179: </td></tr>
180: <tr><td style="background-color: #eeeeee;">価格</td><td style="background-color: #fffgt;
181: <!-- 最小価格入力テキストボックス -->
182: <input type="text" name="minPrice" value="$req_params{minPrice}" size="20"> 円
183: 〜
184: <!-- 最上価格入力テキストボックス -->
185: <input type="text" name="maxPrice" value="$req_params{maxPrice}" size="20"> 円
186: </td></tr>
187: </table>
188: </td></tr></table><br>
189: <input type="submit" name="submit" value="商品検索">
190: </form>
191: <!-- HTMLフォーム表示 -->
192: EOF
193:
|
|
159行目のEOFはヒア文字の宣言で、
191行目のEOFまでの内容をまとめて1つの文字列(ヒア文字列)として扱います。
ですのでprintでそのまま内容を出力する、といった意味です。
ヒア文字列の中の変数は展開(変数→値)されます。
160行目〜170行目まで通常のHTMLのヘッダ、タイトル等の宣言になります。
172行目はフォームの表示です。ユーザーが入力したキーワードや価格があれば
$rep_param連想配列にはっていますのでその値を表示するようにします。
前回行ったようにURLデコードされ、サニタイズされた値になっています。
以下、商品検索APIの出力結果になります。
194: print <<"EOF";
195: <!-- API検索結果表示 -->
196: <font style="font-size:14px;">
197: EOF
198: if($status) { print "取得結果: $status<br>" };
199: if($statusmsg) { print "取得内容: $statusmsg<br>" };
200: if($count ) { print "取得件数: $count<br>" };
201:
|
|
前々回で取得したAPIからのステータス情報やメッセージ、取得件数を表示します。
以下、取得件数が0以上の場合、商品情報の一覧を表示していきます。
202: if($count > 0 ){
203: print <<"EOF";
204: <table width="80%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt&nbsnbsp;0px;">
205: <tr><td bgcolor="#afafaf">
206: <table width="100%" border=0 cellspacing=1 cellpadding=5 style="font-size:12px;">
207: <tr align="center" style="background-color: #eeeeee;">
208: <td width="8%" >写真</td>
209: <td width="47%">商品名</td>
210: <td width="15%">価格</td>
211: <td width="30%">ショップ名</td>
212: </tr>
213: EOF
214: # ベタな正規表現
215: foreach my $item ( @items ){
216: if($item=~/<itemName>(.+)<\/itemName>/) {$itemname=$1;}
217: if($item=~/<itemPrice>(.+)<\/itemPrice>/) {$itemprice = $1;}
218: if($item=~/<itemUrl>(.+)<\/itemUrl>/) {$itemurl = $1;}
219: if($item=~/<affiliateUrl>(.+)<\/affiliateUrl>/) {$affiliateur;= $1;}
220: if($item=~/<smallImageUrl>(.+)<\/smallImageUrl>/){$smallimageurl&nnbsp;$1;}
221: if($item=~/<shopName>(.+)<\/shopName>/) {$shopname =$1;}
222: if($item=~/<shopUrl>(.+)<\/shopUrl>/) {$shopurl =$1;}
223:
|
|
@items配列には<Item>(</Item>)タグの中の文字列、つまり1商品毎に配列としてはいっています。
今回はXMLパーサは利用しません(XML::Perserモジュール等を利用するといいかもしれません。)
その中で表示に必要なデータを簡単な正規表現で抜き出します。
216行目の商品名から、222行目の店舗URLまでが以下のテーブルの列要素に入ります。
224: print <<"EOF";
225: <tr style="background-color: #ffffff;">
226: <td width="8%" align="center"><a href="$itemurl" target="_top"><img src="$smallil" border=0></a></td>
227: <td width="47%" align="left"> <a href="$affiliateurl" target="_top">$itemname</a></td&
228: <td width="15%" align="right" nowrap>$itemprice 円</td>
229: <td width="47%" align="left"><a href="$shopurl" target="_top"><font size="-1">$shopt;/a></td>
230: </tr>
231: EOF
232: }
233: print <<"EOF";
234: </table>
235: </td></tr></table>
236: EOF
237: }
238: print <<"EOF";
239: </font>
240: <!-- /API検索結果表示 -->
241: EOF
242:
243: exit 0;
|
|
上記で商品検索一覧の表示が終了です。
以上、Perlで呼び出す楽天商品検索APIのサンプルコード解説になります。
以前に紹介したPHP版と実装方法はほとんど変わりません。
XMLパースやWWWアクセスライブラリについては
CPAN等で探してみてください。CPANには数々の便利なPerlライブラリがあります。
これらを利用するともっと実装がシンプルで美しくなるはずです!
・ CPAN
※ソースコードに一部間違いがあったため、訂正いたしました。(2007/5/25 9:54)
122行目 訂正前:if($data =~/<tems>(.+)<\/Items>/){
122行目 訂正後:if($data =~/<Items>(.+)<\/Items>/){
前回では商品検索APIへのURLを生成するところまで行いました。
今回はAPIにそのURLを投げてXMLを取得します。
96: #---------------------------------
97: # ウェブサービスAPIに問合せ
98: #---------------------------------
99: if(urldecode($req_params{'submit'}) eq "商品検索"){
100: # レスポンスコンテンツ
101: my $data = get($api_url);
102:
|
|
99行目は"商品検索"ボタンがおされた時に商品検索APIにアクセスする処理に行く様、
リクエストパラメタのsubmit値を参照して分岐させています。
LWPライブラリのget関数を利用します。これは引数($url)の
コンテンツをWEBサイトから取得し、戻り値(ここでは$data)
としてその内容を返してくれるのです。
変数$dataに商品検索APIからの情報がすでに入っています。
$dataにはいっているXMLの内容は こんな形になります。
103: #---------------------------------
104: # ステータス判断
105: #---------------------------------
106: # 必要な情報だけ簡易な正規表現で取得
107: if($data){
108: $data =~s/\n//g;
109: # ステータス
110: if($data =~/<Status>(.+)<\/Status>/){
111: $status = $1;
112: }
113: # メッセージ
114: if($data =~/<StatusMsg>(.+)<\/StatusMsg>/){
115: $statusmsg = $1;
116: }
117: # 件数
118: if($data =~/<count>(.+)<\/count>/){
119: $count = $1;
120: }
121: # 商品のリスト
122: if($data =~/<Items>(.+)<\/Items>/){
123: @items = split(/<\/Item>/,$1); # ITEMの配列
124: }
125: }else{
126: $statusmsg = "$API_NAMEからのデータの取得に失敗しました";
127: }
128: }
129:
|
|
今回はXMLパーサ(XMLを要素毎に分解)のライブラリを利用しません。
簡単な正規表現で共通出力パラメタである要素を取得していきます。
110行目、$dataの中で<Status&bt;</Status&bt;で囲まれている箇所をみつけ(/正規表現/によるマッチング)
その中の値を共通パラメタStatusの変数、$statusの値
($1はマッチングした値が入っている特殊変数です)として格納しています。
114行目、118行目も同様です。
商品のリスト<Items></Items>にかこまれた部分はその要素をごっそりぬきとり(122行目
その中に商品<Item></Item>要素が複数はいっていますので
少々強引ですが</Item>で文字列を分割して1商品とし、@item配列に格納(123行目)しています。
以上で商品検索APIからXMLの取得と簡単な正規表現をつかった要素の切り分けが完了しました。
130: # フォーム入力値の表示
131: $req_params{keyword} = htmlspecialchars((urldecode($req_params{keyword})));
132: $req_params{minPrice} = htmlspecialchars((urldecode($req_params{minPrice})));
133: $req_params{maxPrice} = htmlspecialchars((urldecode($req_params{maxPrice})));
134:
|
|
上記は検索結果後のフォームに表示するフォーム入力値をURLデコード(urldecode関数)して
HTMLエスケープ(htmlspecialchars関数)する処理になっています。
下記がその関数宣言になっています。
135: #---------------------------------
136: # 関数
137: #---------------------------------
138: # 文字列にURLデコード処理をする
139: sub urldecode{
140: my $str=shift;
141: $str=~tr/+/ /;
142: $str=~s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg;
143: return $str;
144: }
|
|
上記はURLデコード関数です。
145: # 文字列をHTMLエスケープ
146: sub htmlspecialchars{
147: my $str = shift;
148: $str =~ s/&/&\;/g;
149: $str =~ s/"/"\;/g;
150: $str =~ s/'/\&\#39\;/g;
151: $str =~ s/</\<\;/g;
152: $str =~ s/>/\>\;/g;
153: return $str;
154: }
|
|
上記はHTMLエスケープ関数です。引数のHTMLタグを無効化して返します。
ユーザーからの入力値をブラウザ上に表示する場合、
クロスサイトスクリプティング対策としてこの関数を使います。
次回はいよいよ商品情報の表示です。
前回では商品検索のHTMLフォームを表示させました。
今度はこのフォームに実際にキーワードと価格を入力して
「商品検索ボタン」を押してみます。
商品検索結果一覧が表示されます。
今回は入力された内容が
楽天商品検索APIにどういった形で投げられているのかをみていきます
■商品検索APIへのURL生成
サンプルコード全文は こちら
1: #!/usr/bin/perl
2: #---------------------------------------------------------------
3: # 楽天1商品検索API の利用サンプルコード (Perl)
4: #---------------------------------------------------------------
5: # 以下を変更してPerlの実行環境におくだけでOK
6: # 詳細な仕様は以下を参照
7: # - 楽天ウェブサービス- http://webservice.rakuten.co.jp/
8:
9: #---------------- 以下、変更部分 ------------------------------#
10: # 自分のディベロッパーID
11:
12: $DEVELOPER_ID = "自分のディベロッパーID";
13:
14: # 自分のアフィリエイトID
15:
16: $AFFILIATE_ID = "自分のアフィリエイトID";
17:
18: #---------------- 以上、変更部分 ------------------------------#
|
|
上記ですが楽天ウェブサービスで取得したディベロッパID,アフィリエイトIDを
入れるようにしてください。IDは楽天会員に登録すれば誰でも無料で取得できます。
デベロッパーIDの取得(楽天会員登録もこちらから)
今回は楽天商品検索APIへの接続通信にlibwww-perlライブラリ(通称LWP)を利用します。
LWPはPerlでHTTP通信を行うためのライブラリ群で、今回はLWP::Simeleモジュールを
利用しますので、ここでそのモジュールの利用宣言をします。
ここでuse strict;等を宣言しておくと変数のタイプミスや不要な宣言を防ぐことが
出来ますが今回は省略しています。
21: #---------------------------------
22: # 定数
23: #---------------------------------
24: # API名
25: $API_NAME = "楽天商品検索API";
26:
27: # APIのURL
28: $API_BASE_URL = "http://api.rakuten.co.jp/rws/1.4/rest";
29:
30: # APIのタイプ
31: $OPERATION = "ItemSearch";
32:
33: # APIのバージョン
34: $API_VERSION = "2007-03-22";
|
|
上記は特に変更の必要はありません。
楽天APIはバージョン毎に半永久的に利用できるようになっていますが
最新のバージョンについては こちらをご確認ください。
36: #---------------------------------
37: # メイン処理
38: #---------------------------------
39: # APIステータス
40: $status = "";
41:
42: # APIからのメッセージ
43: $statusmsg = "";
44:
45: # 取得件数
46: $count = 0;
47:
48: # 商品リスト
49: @items = ();
50:
51: # APIへのパラメタの連想配列
52: %api_params = (
53: "keyword" => "",
54: "version" => $API_VERSION,
55: "shopCode" => "",
56: "genreId" => "",
57: "catalogCode" => "",
58: "hits" => "",
59: "page" => "",
60: "sort" => "",
61: "minPrice" => "",
62: "maxPrice" => "",
63: "availability"=> "",
64: "field" => "",
65: "carrier" => "",
66: "imageFlag" => ""
67: );
68:
|
|
まずはこのPerlスクリプトで利用する変数の宣言から行います。
39行目は楽天商品検索APIからの出力共通パラメタのステータス、
42行目は出力共通パラメタのステータスメッセージ、
46行目は出力サービス固有パラメタのヒット件数、
が入ります。
48行目には後ほど解説しますが、各商品のXML文字列の配列がはいります。
52行目の連想配列は楽天商品検索APIになげることができる入力パラメタ名のキーになります。
値はバージョン以外は今は空文字列になっています。
69: #---------------------------------
70: # フォーム値からのパラメタ取得
71: #---------------------------------
72:
73: # リクエストURL生成
74: $api_url = sprintf("%s?developerId=%s&affiliateId=%s&operation=%s",$API_BASE_URL,$DEVELOPER_ID,$AFFILIATE_ID,$OON);
75:
76: # GETメソッドの場合
77: if( $ENV{'REQUEST_METHOD'} eq "GET" ) {
78: $buffer = $ENV{'QUERY_STRING'};
79: # POSTメソッドの場合
80: } else {
81: read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );
82: }
83:
84: # リクエストパラメタを連想配列に入れる
85: my %req_params = map { /([^=]+)=(.+)/ } split /&/, $buffer;
86:
87:
88: # APIのクエリ生成
89: while ( ( $key, $value ) = each ( %api_params ) ) {
90: if($req_params{$key} ne ""){
91: $api_url = sprintf("%s&%s=%s",$api_url, $key, $req_pakey});
92: }elsif($api_params{$key} ne ""){
93: $api_url = sprintf("%s&%s=%s",$api_url, $key, $api_pakey});
94: }
95: }
|
|
69行目からはフォームに入力された値を取得しています。
74行目ではまず楽天商品検索APIに投げるURLになるベースの文字列を生成しています。
sprintfは文字列を第2引数以降で与えられた変数でフォーマットする関数です。
76行目からは実際のフォーム値の取得、GETの場合とPOSTの場合ではやり方が違います。
GETの場合は78行目でクエリパラメタを環境変数($ENV)から取得しています。
POSTの場合は81行目でリクエストの内容を標準入力から取得しています。
CGIモジュールが利用できるのであればそれぞれのパラメタ毎に
$cgi = new CGI;
$keyword = $cgi->param->('keyword');
|
|
みたいにしてもいいかもしれません。
それぞれ受け取った内容を84行目でリクエストのパラメタのキーと値毎に
連想配列にいれています。
88行目からは52行目で定義したAPIのパラメタ毎に
フォームからのリクエストパラメタ値(90行目)
もしくはAPIのデフォルトのパラメタ値(92行目)で有効な値があれば
74行目で生成した楽天商品検索のURLに追加していくようにしています。
これで楽天商品検索APIへのURL生成は完了です。
次回は実際に上記をLWPを利用して楽天商品検索APIになげてみます!
楽天商品検索APIを利用したPerlの簡単なサンプルコードを紹介します。
■動作環境
- Perl5の実行環境
- Perlライブラリ libwww-perl(通称LWP、PerlでのWEBアクセスライブラリ)がインストールされていること(LWPのダウンロードは http://search.cpan.org/~gaas/libwww-perl-5.805/から可能です。)
■サンプルソースご利用の際の注意事項
・ここで掲載するプログラムに関するサポートは一切しておりません。
・ここで掲載するプログラムで発生した直接的及び間接的に生じた損害について
弊社は一切責任を負いませんのでご了承ください。
■楽天商品検索API/サンプルコード概要
[全文は こちら]
・Perlが動作するCGI実行環境(cgi-bin等)に置いて実行(アクセス)します。
・拡張子は.plとなっていますが適宜WEBサーバの仕様にあわせて変更してください。(.cgi等)
・サンプルコードのファイルは文字エンコーディングをUTF-8で保存するようにしてください。
・サンプルコードに実行権限を付与(モードは755)するようにしてください。
サンプルコードの動作の流れは以下になります。
1) 商品検索キーワード等を入力するHTMLフォームをブラウザ上に表示します
2) 商品検索キーワードが入力された場合、楽天商品検索APIに対して
所定のフォーマットでリクエストを送ります
3) 楽天商品検索APIから受け取ったレスポンス内容から、
ステータス(状態)情報や商品情報の切り分けを行います。
4) 検索結果の商品情報をHTMLでブラウザ上に表示します。
■はじめに
まずは上記のサンプルコードを実行領域において、アクセスしてみましょう。
以下のような入力フォームが表示されます。
こちらはHTMLのフォームですので、PHP版で表示される内容と変更はありません。
[ 第1回 楽天商品検索API PHPサンプルコード解説]
ユーザーにフォームから入力してもらうのは
・商品の検索キーワード[フォームの要素名'keyword']---- 18行目
・商品の下限価格 [フォームの要素名 'minPrice' ] ---- 22行目
・商品の上限価格 [フォームの要素名 'maxPrice' ] ---- 25行目
になります。
このフォームで入力された値がPerlでどういった風に楽天商品検索APIに
受け渡され処理されるのか、次回以降でみていきます。
前回では楽天商品検索APIから商品情報を取得し、
返ってきたXMLのデータを配列にいれるところまでを行いました。
いよいよ最後の仕上げ、商品情報を取り出して、HTMLに表示させます。
[サンプルコード全文は こちら]
[楽天商品検索APIの仕様は こちら]
■配列から商品情報の取り出しと表示
94// 連想配列から値を取得
95if($values){
96 $item_temp = null;
97 foreach ($values as $data) {
98 if(isset($data['tag'])){
99 // タグ名のよって分岐
100 switch ($data['tag']) {
101 case 'STATUS'://共通パラメータ:Status
102 if(isset($data['value'])){
103 $status = $data['value'];
104 }
105 break;
106 case 'STATUSMSG': //共通パラメータ:Statusに特化したメッセージ
107 if(isset($data['value'])){
108 $statusmsg = $data['value'];
109 }
110 break;
111 case 'COUNT'://全体情報:検索数
112 if(isset($data['value'])){
113 $count = $data['value'];
114 }
115 break;
116 case 'ITEM': //商品情報:ITEMタグ開始
117 if($data['type'] == 'open'){
118 $item_temp = array();
119 }else if($data['type'] == 'close'){ //商品情報:ITEMタグ終
120 array_push($item_array,$item_temp);
121 $item_temp = null;
122 }
123 break;
124 default:
125 if(is_array($item_temp)){ //商品情報:ITEMタグ終了
126 if(isset($data['value'])){
127 $item_temp['tag']ata['value'];
128 }
129 }
130 break;
131 }
132 }
133 }
134}
135 }
136// 以下からHTML表示部分
|
|
前回でXMLから生成した配列構造体の各要素についてみていきます。
(配列構造体の中にはXMLの要素名'tag'、値'value'、タイプ'type'が含まれています。)
97行目でタグ名をまずみます。
100行目のswitch文で、必要なタグ要素の値を取り出しています。
101行目、106行目の判定で共通パラメタとなるStatus,StatusMsgの値取得を行います。
商品情報に関しては、<Item></Item>の中にはいっていますので
117行目、ITEMタグの開始(タグのtypeがopen)と同時に配列を宣言し、
119行目、ITEMタグの終了(タグのtypeがclose)までは
127行目でそれぞれのタグ毎に商品情報を連想配列$item_tempに格納しています。
連想配列$item_tempには各商品情報(<Item></Item>)毎に、
それぞれの商品がItemの中の要素名'tag'をキーとしてその値が格納されます。
120行目では、ITEMタグの終了(close)となりますので、
商品情報の連想配列を通常の配列(item_array)に1商品として追加しています。
これ以降は検索結果のHTML表示となります。
138 header("Content-type:text/html;charset=UTF-8");
|
|
138行目ですが、ブラウザに返す、ヘッダ情報にコンテンツタイプの指定(text/html)と
文字エンコーディングの指定(UTF-8)を入れます。
172行目以降は楽天商品検索APIにリクエストを投げた結果をHTMLのテーブルタグで
1件ずつ一覧表示をする部分になります。
172 <!-- API検索結果表示 -->
173 <font style="font-size:14px;">
174 <?php if($status != ""){ ?>取得結果: <?=$status?><br><? } ?>
175 <?php if($statusmsg != ""){ ?>取得内容: <?=$statusmsg?><br><? } ?>
176 <?php if($count > 0){ ?>取得件数: <?=$count?><br>
177 <table width="80%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt 0pt 0px;">
|
|
174行目,175行目,176行目で共通パラメタ(Status,StatusMsg)からの情報を表示します。
取得件数も0以上であれば表示します。
178 <tr><td bgcolor="#afafaf">
179 <table width="100%" border=0 cellspacing=1 cellpadding=5 style="font-size:12px;">
180 <tr align="center" style="background-color: #eeeeee;">
181 <td width="8%" >写真</td>
182 <td width="47%">商品名</td>
183 <td width="15%">価格</td>
184 <td width="30%">ショップ名</td>
185 </tr>
186 <?php foreach ($item_array as $item){ ?>
187 <tr style="background-color: #ffffff;">
188 <td width="8%" align="center"><a href="<?=$item['ITEMURL']?>" target="_top"><img src="<?=$item[IMAGEURL']?>" border=0></a></td>
189 <td width="47%" align="left"><a href="<?=$item['AFFILIATEURL']?>" target="_top"><font size="-1"><?['ITEMNAME']?></a></td>
190 <td width="15%" align="right" nowrap> <?=$item['ITEMPRICE']?> 円</td>
191 <td width="47%" align="left"><a href="<?=$item['SHOPURL']?>" target="_top"><font size="-1"><?=$itePNAME']?></a></td>
192 </tr>
193 <?php } ?>
194 </table>
195 </td></tr></table>
196 <?php } ?>
197 </font>
198 <!-- /API検索結果表示 -->
|
|
178行目〜185行目はHTMLのテーブルの見出し部分になります。
商品情報は、「写真画像」「商品名」「価格」「ショップ名」を表示させます。
186行目では、商品配列(item_array)にはいっている商品情報の連想配列を1つずつ取り出しています。
XMLをパースした時、すべての商品情報(<ITEM>タグの中の要素と値)が含まれていますから、
商品検索結果のHTMLを表示させるのに必要な情報(itemUrl,itemPrice,shopUrl,shopName,itemName)
を連想配列から取り出して表示させています。
以上でPHPのサンプルソースの解説は終了です。
サンプルソースということでエラー処理や複雑なXMLのパース処理はなるべく簡略化していますが
200行そこそこのソースで、楽天商品検索APIを使ったマッシュアップサイトが
簡単に作成できます。
今すぐ作成してみましょう!
前回、商品検索APIに必要なURLの生成を行いました。
実際に生成したURLを楽天商品検索に投げてみます。
[サンプルコード全文は こちら]
■商品検索APIからレスポンスの(サンプルコード解説)
まずは共通出力パラメタを格納する変数を宣言していきます。
(簡素化のため、最低限の情報しか取得しません)。
71 // --------- API取得処理
72 // API結果ステータス
73 $status = null;
74
|
|
$statusには楽天商品検索APIの共通出力パラメタであるStatusが入ります。
75 // API結果メッセージ
76 $statusmsg = null;
77
|
|
76行目、$statusmsgには楽天商品検索APIの共通出力パラメタであるStatusMsgが入ります。
78 // 商品情報の配列
79 $item_array = array();
80
81 // 結果件数
82 $count = 0;
83
|
|
79行目、上記の配列には商品情報が配列となってはいります。
82行目には楽天商品検索APIの出力パラメタである全体情報の検索数が入ります。
84 // 商品検索ボタンを押された時、APIにリクエストを投げる
85 if( isset($_REQUEST['submit']) && $_REQUEST['submit'] == "商品検索" ){
86
|
|
85行目では商品検索のボタンが押されたとき、
つまりリクエストフォームから"submit"の値が送信されてきたとき
実際に楽天商品検索APIへのリクエスト処理を開始します。
87 $contents = file_get_contents($api_url);
88
|
|
87行目で69行目迄で生成したURLに対して
PHPのfile_get_contents関数(ファイル/URLの内容を全て文字列に読み込む)で
楽天商品検索APIから情報を取得します。
楽天商品検索APIからの情報はXMLというフォーマットで返ってきます。
XMLのフォーマットを各データ要素に分解することをXMLパース、といいます。
89 // XMLをパースして構造体(values)に入れる
90 $parser = xml_parser_create('UTF-8');
91 xml_parse_into_struct($parser,$contents,$values);
92 xml_parser_free($parser);
93
|
|
90行目、xml_parser_create関数は指定した文字エンコーディング('UTF-8')で
XMLパーサーを生成します。
91行目、xml_parse_into_struct関数ではAPIから取得したXMLを配列構造体($values)に
要素毎に格納します。
92行目では90行目で生成したXMLパーサを開放する処理を行っています。
こちらの配列構造体ですが、XMLの各要素毎に
XMLのタグ(要素)名、要素値、タイプ(Open/Close)等が格納されています。
ちなみに検索キーワードを「チーズケーキ」価格の範囲を1800円〜2000円とした場合の楽天商品検索APIからのレスポンスは このようなフォーマットのXMLになります。
次回は上記の配列から値を取り出し、いよいよ商品検索結果の表示を行います。
前回では商品検索のHTMLフォームを表示させました。
今度はこのフォームに実際にキーワードと価格を入力して
「商品検索ボタン」を押してみます。
商品検索結果一覧が表示されます。
今回は入力された内容が
楽天商品検索APIにどういった形で投げられているのかをみていきます
■商品検索APIへのURL生成
サンプルコード全文はこちら
1 <?php
2 //
3 // 楽天商品検索API の利用サンプルコード (PHP)
4 // ---------------------------------------------------------------
5 // 以下を変更してPHP4/5が動作する公開領域におくだけでOK
6 // 詳細な仕様は以下を参照
7 // - 楽天ウェブサービス- http://webservice.rakuten.co.jp/
8 //
9 // UTF-8で保存すること
10 /* ---------------- 以下、変更部分 ------------------------------ */
11
12 // 自分のディベロッパーID
13
14 $DEVELOPER_ID = "自分のディベロッパーID";
15
16 //自分のアフィリエイトID
17
18 $AFFILIATE_ID = "自分のディベロッパーID";
19
20 /* ---------------- 以上、変更部分 ------------------------------ */
|
|
14行目ですが自分で取得したディベロッパIDを入れるようにしてください。
デベロッパーIDの取得(楽天会員登録もこちらから)
18行目ですが自分で取得したアフィリエイトIDを入れるようにしてください。
22 //--------- API毎の固定値
23 // API名
24 $API_NAME = "楽天商品検索API";
25
26 // APIのURL
27 $API_BASE_URL = "http://api.rakuten.co.jp/rws/1.3/rest";
28
29 //オペレーション名
30 $OPERATION = "ItemSearch";
31
32 //バージョン
33 $API_VERSION = "2007-02-14";
34
35 //--------- リクエストパラメタの取得とAPIへのリクエストURL生成
36
|
|
24行目は特に変更の必要はありません。
26行目ですが、楽天商品検索APIへのリクエストURLになります。
楽天商品検索API/オンラインドキュメントのリクエストURLの仕様を確認するようにしてください。
30行目ですが変更の必要はありません。
32行目ですが、現行のバージョンは'2007-02-14'となっています。
37 // リクエストURL生成
38 $api_url = sprintf("%s?developerId=%s&affiliateId=%s&operation=%s", $API_BASE_URL,$DEVELOPER_ID,$AFFILIATE_ID,$OPERATION);
39
|
|
38行目で、楽天商品検索APIへのリクエストURLを生成しています。
PHPのsprint関数は文字列のフォーマット関数です。
商品検索APIの共通パラメタである、1.ディベロッパID、2.アフィリエイトID、3.操作のパラメタを持ったURLを生成しています。
この時点で生成されたURLは以下のようになります。
http://api.rakuten.co.jp/rws/1.3/rest?
developerId=[YOUR_developerID]
affiliateId=[YOUR_affiliateID]
&operation=ItemSearch
40 //APIへのパラメタの連想配列
41 $api_params = array(
42 "keyword" => "",
43 "version" => $API_VERSION,
44 "shopCode" => "",
45 "genreId" => "",
46 "catalogCode" => "",
47 "hits" => "",
48 "page" => "",
49 "sort" => "",
50 "minPrice" => "",
51 "maxPrice" => "",
52 "availability" => "",
53 "field" => "",
54 "carrier" => "",
55 "imageFlag" => ""
56 );
57
|
|
41行目〜56行目ですが、楽天商品検索APIに投げることができる(有効な)
サービス固有パラメタの連想配列になります。
連想配列とは"キー"とそれに紐付く"値"がセットになった配列のことをいいます。
APIバージョン(version)を初期値としてしています。
各パラメタの仕様は 楽天商品検索API/オンラインドキュメントを確認するようにしてください。
58 // リクエストパラメタ取得
59 reset($api_params);
60 while(list ($key, $val) = each($api_params) ){
61 if(isset($_REQUEST[$key]) && $_REQUEST[$key] != ""){
62 // リクエストパラメタにあれば、APIへのURLに追加
63 $api_url = sprintf("%s&%s=%s",$api_url, $key, urlencode($_REQUEST[$key]));
64 $api_params[$key] = $_REQUEST[$key];
65 }else if(isset($api_params[$key]) && $api_params[$key] != ""){
66 // パラメタにあれば、APIへのURLに追加
67 $api_url = sprintf("%s&%s=%s",$api_url, $key, urlencode($api_params[$key]));
68 }
69 }
|
|
59行目で配列の初期化を実施しています。
60行目から、楽天商品検索APIの各固有パラメタについて、処理を行います。
61行目で固有パラメタについて、フォームからの値($_REQUEST[パラメタ名])があれば、
63行目で商品検索APIへのリクエストURLに追加しています。
APIに渡すパラメタの値はurlencode関数を使って
エンコードした値を使うようにしてください。
$_REQUESTはリクエストの内容(フォームからGET,POSTの両方のメソッドで渡ってくる)を取得するPHPのスーパーグローバル変数です。
上記で楽天商品検索APIからのURL生成は終了です。
こちらで検索キーワードを「チーズケーキ」上限価格を3000円とした場合の
楽天商品検索APIへのリクエストURLは以下のように生成されます。
http://api.rakuten.co.jp/rws/1.3/rest?
developerId=[ディベロッパID]
&affiliateId=[アフィリエイトID]
&operation=ItemSearch
&keyword=%E3%83%81%E3%83%BC%E3%82%BA%E3%82%B1%E3%83%BC%E3%82%AD
&version=2007-02-14
&maxPrice=3000
次回では上記で生成したURLを実際に楽天商品検索APIになげてみます!
こちらでは楽天商品検索APIを使ったPHPの実装例について
簡単なサンプルコードを用いて解説を行います。
■動作環境
- PHP4の実行環境
■サンプルソースご利用の際の注意事項
・ここで掲載するプログラムに関するサポートは一切しておりません。
・ここで掲載するプログラムで発生した直接的及び間接的に生じた損害について
弊社は一切責任を負いませんのでご了承ください。
■楽天商品検索API/サンプルコード概要
[全文はこちら]
・PHPが動作するWEBサーバのドキュメント公開領域に設置するとそのまま動作します。
・拡張子は.phpとなっていますが適宜WEBサーバの仕様にあわせて変更してください(.phtml等)
・サンプルコードのファイルは文字エンコーディングをUTF-8で保存するようにしてください
サンプルコードの動作の流れは以下になります。
1) 商品検索キーワード等を入力するHTMLフォームをブラウザ上に表示します
2) 商品検索キーワードが入力された場合、楽天商品検索APIに対して
所定のフォーマットでリクエストを送ります
3) 楽天商品検索APIから受け取ったレスポンス内容から、
ステータス(状態)情報や商品情報の切り分けを行います。
4) 検索結果の商品情報をHTMLでブラウザ上に表示します。
■実行イメージ

■はじめに(サンプルコード解説)
まず、サンプルソースitem_search.phpを利用しているWEBサーバの公開領域においてみましょう。
ファイルの文字エンコーディングの種類はUTF-8で保存するようにしましょう。
ブラウザに以下のような入力フォームをもったHTMLが表示されます。
サンプルコードで最初に表示されるHTMLは以下のような内容になっています。
1 <html lang="ja">
2 <head>
3 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
4 <title>楽天商品検索API/楽天ウェブサービス</title>
5 </head>
6 <body bgcolor="#ffffff" TEXT="#333333" LINK="#3333cc">
7
8 <!-- タイトル -->
9 <h1 style="font-size:16px;font-weight:bold;">楽天ウェブサービス</h1><hr size="1" noshade>楽天商品検索API<hr siz
e="1" noshade>
10 <!--/タイトル -->
11
12 <!-- HTMLフォーム表示 -->
13 <form action="item_search.php" method="post">
14 <table width="80%" border="0" cellspacing="0" cellpadding="0" style="margin: 5px 0pt 0pt 0px;">
15 <tr><td bgcolor="#afafaf">
16 <table width="100%" border=0 cellspacing=1 cellpadding=5 style="font-size:12px;">
17 <tr><td style="background-color: #eeeeee;">検索キーワード</td><td style="background-color: #ffffff;">
18 <!-- キーワード入力テキストボックス --><input type="text" name="keyword" value="" size="30">
19 </td></tr>
20 <tr><td style="background-color: #eeeeee;">価格</td><td style="background-color: #ffffff;">
21 <!-- 最小価格入力テキストボックス -->
22 <input type="text" name="minPrice" value="" size="20"> 円
23 〜
24 <!-- 最上価格入力テキストボックス -->
25 <input type="text" name="maxPrice" value="" size="20"> 円
26 </td></tr>
27 </table>
28 </td></tr></table><br>
29 <input type="submit" name="submit" value="商品検索">
30 </form>
31 <!-- HTMLフォーム表示 -->
32
33 <!-- API検索結果表示 -->
34 <font style="font-size:14px;">
35 </font>
36 <!-- /API検索結果表示 -->
37
38 </body>
39 </html>
|
|
ブラウザ上でユーザーから入力してもらう項目は3つしかありません。
(もちろん楽天商品検索APIはこれ以外の入力パラメタも多数用意されています)。
・商品の検索キーワード [フォーム名 'keyword' ] ---- 18行目
・商品の下限価格 [フォーム名 'minPrice' ] ---- 22行目
・商品の上限価格 [フォーム名 'maxPrice' ] ---- 25行目
また実際にこのフォームを実行する際に押す、submitボタンも配置されています。
・商品検索ボタン [フォームパラメタ名 'submit'] ---- 29行目
このフォームから入力された値(検索、上限・下限価格)が、
実際にどういった形で楽天商品検索APIに渡されて
どういった形式で商品情報が取れるのか、
次回から実際のサンプルソースをみながら解説していきます。
|