前回では楽天商品検索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