楽天検索API用PHP解説(2)
PHPプログラムで、楽天のWEBサービスAPIで商品検索する関数の解説(2)//--------- APIへのリクエストURL生成// リクエストURL生成$rakuten_url = $API_BASE_URL.'?developerId='.$DEVELOPER_ID.'&affiliateId='.$AFFILIATE_ID.'&operation='.$OPERATION.'&version='.$API_VERSION;
ここでは、URLリクエストをAPIサーバーに投げるための基本的なURLを組み立てている。
//送料無料の処理if($shipping == 1){$keywords = $keywords.' 送料無料';
}送料無料で検索したい場合、「検索キーワード」に「送料無料」を付け加える処理。
※これは検索キーワードに「送料無料」を入れるだけで、ハッキリ言って使えなかった。
//検索条件作成$key = urlencode(mb_convert_encoding($keywords,"UTF-8","auto"));
検索キーワードをUTF-8に変換し、さらにURLエンコードしている部分。
$rakuten_c = '&keyword='.$key.'&genreId='.$genreId.'&hits='.$max_num.'&sort='.$sort.'&minPrice='.$minP.'&maxPrice='.$maxP;
検索条件部分を組み立てている部分。
絞り込みが色々あると面倒だが、ソート順を価格昇順に設定する時、最低価格を指定しておかないと、レスポンスが関連商品ばかりになることがよくある。
$api_url = $rakuten_url.$rakuten_c;
APIサーバーに投げるURLがここで完成。
//echo $api_url;
//API情報の取得リクエストURLがちゃんとできているか、確かめるときに使う記述。
「//」のコメントアウト記号を消してプログラムを動かすと、URLが表示される。
$contents = @file_get_contents($api_url);
リクエストを投げて返ってきたレスポンスを変数$contents に入れる。
file_get_contents関数の頭につけている@マークは、失敗したときのエラーコードを表示させないための指定だ。
$Sta = $xml->Header->Status;
if($Sta = "Success"){//echo "G";
}else{echo "失敗1";
sleep(3);
$contents = file_get_contents($api_url);
}
レスポンスのステイタス情報を読み込んで、失敗していたら3秒後にもう一度挑戦する。
$data_size = strlen($contents);
//echo $data_size;
たまに情報数が少なすぎるレスポンスが返ってきたりするので、ここでデータの文字列を数えてみて、少なかったら間隔をあけて再トライする503エラーが頻発しているときに役に立つ
if($data_size < 2000){sleep(3);$xml = simplexml_load_string($contents);
$contents = file_get_contents($api_url);
$data_size = strlen($contents);
if($data_size < 2000){sleep(3);
$contents = file_get_contents($api_url);
$data_size = strlen($contents);
if($data_size < 2000){sleep(3);
$contents = file_get_contents($api_url);
}}}else{}
コンテンツを配列(変数$xml)に格納する。
//print_r($item);
// ★ここからデータを配列$list_riに格納$i = 0;
foreach($item as &$item){$list_ri[$i]['title'] = mb_strimwidth ($item->itemName, 0, 85, "", "UTF-8");
$list_ri[$i]['price'] = $item->itemPrice;
if($item->taxFlag == 0){$list_ri[$i]['tax'] = "税込み";
}else{$list_ri[$i]['tax'] = "税別";
}if($item->postageFlag == 0){$list_ri[$i]['post'] = "送料込み";
}else{$list_ri[$i]['post'] = "送料別";
}if($item->imageFlag == 0){$list_ri[$i]['img'] = "./img/noimage.gif";
}elseif($item->mediumImageUrl){$list_ri[$i]['img'] = $item->mediumImageUrl;
}else{$list_ri[$i]['img'] = "./img/noimage.gif";
}if($item->affiliateUrl){$list_ri[$i]['url'] = $item->affiliateUrl;
}else{$list_ri[$i]['url'] = $item->itemUrl;
}$list_ri[$i]['caption'] = mb_strimwidth ($item->itemCaption, 0, 200, "", "UTF-8");
$list_ri[$i]['reviewCount'] = $item->reviewCount;
$list_ri[$i]['reviewAverage'] = $item->reviewAverage;
$list_ri[$i]['catchcopy'] = mb_strimwidth ($item->catchcopy, 0, 85, "", "UTF-8");
$list_ri[$i]['img_m'] = $item->smallImageUrl;
$i++;
}
この辺りの解説は、解説(5)商品情報をXMLから取り出すのところと同様です。
return $list_ri;
商品情報を配列化した変数$list_riを、返値としてもどす。
}ユーザー関数ここまで。