※ソースコードに一部間違いがあったため、訂正いたしました。(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タグを無効化して返します。
ユーザーからの入力値をブラウザ上に表示する場合、
クロスサイトスクリプティング対策としてこの関数を使います。
次回はいよいよ商品情報の表示です。