PHPで実装する記事はあまりなかったので、備忘録として残しておきます。
今回は楽天APIを叩いて、商品検索が出来る機能を実装します。AmazonやDMMはアフェリエイトアカウントで審査があるので、思い立って直ぐ作るなら楽天がオススメです。
laravel知識がある前提になります。API実装部分以外は簡略化してます、ご了承下さい。
環境
PHP 7.3.8
Laravel 6.18.35
cURL
まずは実装前の下準備
Rakuten Developersで、アプリIDを取得しましょう。
今回叩きに行く楽天市場商品検索APIは入力パラメーターにアプリIDを渡せばOKなので、トークンやアフィリエイトIDは不要です。
次にSDKを導入です。
SDKとはソフトウェア開発キット(Software Development kit)の略で、APIを扱い安くしてくれるライブラリという感じでしょうか。楽天SDKを導入すれば、対応するAPIそれぞれをより手軽に扱う事が出来ます。
まぁSDKを使わなくても実装は難しくはないのですが、今回は用意されているライブラリを使います。
"require": {
(略)
"rakuten-ws/rws-php-sdk": "^1.1"
},
PHP SDKをcomposerでインストールして行きます。ちなみにRuby SDKもあります。
composer install
これで下準備はOKです。
さあ、APIを叩きに行きましょ
お作法でenvに環境変数を書き、configで中継しておきます。
RAKUTEN_APPLICATION_ID=(アプリIDを書いてね)
RAKUTEN_APPLICATION_SEACRET=(application_secretを書いてね、今回は使わないよ)
'rakuten_id' => env('RAKUTEN_APPLICATION_ID', false),
'rakuten_key' => env('RAKUTEN_APPLICATION_SEACRET', false),
コントローラーに欲しいデータを取り出して整形するところまで書きます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
//忘れずにuseしておきましょう
use RakutenRws_Client;
class SearchController extends Controller
{
public function index(Request $request)
{
//楽天APIを扱うRakutenRws_Clientクラスのインスタンスを作成します
$client = new RakutenRws_Client();
//定数化
define("RAKUTEN_APPLICATION_ID" , config('app.rakuten_id'));
define("RAKUTEN_APPLICATION_SEACRET", config('app.rakuten_key'));
//アプリIDをセット!
$client->setApplicationId(RAKUTEN_APPLICATION_ID);
//リクエストから検索キーワードを取り出し
$keyword = $request->input('keyword');
// IchibaItemSearch API から、指定条件で検索
if(!empty($keyword)){
$response = $client->execute('IchibaItemSearch', array(
//入力パラメーター
'keyword' => $keyword,
));
// レスポンスが正しいかを isOk() で確認することができます
if ($response->isOk()) {
$items = array();
//配列で結果をぶち込んで行きます
foreach ($response as $item){
//画像サイズを変えたかったのでURLを整形します
$str = str_replace("_ex=128x128", "_ex=175x175", $item['mediumImageUrls'][0]['imageUrl']);
$items[] = array(
'itemName' => $item['itemName'],
'itemPrice' => $item['itemPrice'],
'itemUrl' => $item['itemUrl'],
'mediumImageUrls' => $str,
'siteIcon' => "../images/rakuten_logo.png",
);
}
} else {
echo 'Error:'.$response->getMessage();
}
}
どんな感じで検索結果が取得出来るかというと
こんな感じ。あとは煮るなり焼くなりです。
割愛しますが、リクエストを渡す検索フォームと結果を表示するbladeを用意すれば完成です(テキトー)
いい感じですね。
おまけ
出力パラメーターに商品画像64x64URL(smallImageUrls)と商品画像128x128URL(mediumImageUrls)がありますが、もう少し大きい画像が欲しかったので、このパラメーター部分(URL)を欲しいサイズに置換する事で実現しています。
あと、検索結果の取得件数はデフォで1ページ30件になっています。ページ数を指定する事は出来ますが、ページあたりの取得件数はMAX30件なので、それ以上取得したい場合は1ページ目30件、2ページ目30件、みたいな処理が必要になりそうです。ページ数は最大100までのようです。