243883 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

楽天ウェブサービスセンターブログ

楽天ウェブサービスセンターブログ

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Keyword Search

▼キーワード検索

Category

Calendar

Archives

2024.09
2024.08
2024.07
2024.06
2024.05

Freepage List

2007.04.20
XML
※ソースコードに一部間違いがあったため、訂正いたしました。(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タグを無効化して返します。

ユーザーからの入力値をブラウザ上に表示する場合、
クロスサイトスクリプティング対策としてこの関数を使います。

次回はいよいよ商品情報の表示です。






お気に入りの記事を「いいね!」で応援しよう

Last updated  2007.05.25 09:55:20
[サンプルソース紹介] カテゴリの最新記事



© Rakuten Group, Inc.
X