【Laravel】簡単実装、楽天APIで商品検索してみる

PHPで実装する記事はあまりなかったので、備忘録として残しておきます。
今回は楽天APIを叩いて、商品検索が出来る機能を実装します。AmazonやDMMはアフェリエイトアカウントで審査があるので、思い立って直ぐ作るなら楽天がオススメです。

laravel知識がある前提になります。API実装部分以外は簡略化してます、ご了承下さい。

## 環境
PHP 7.3.8
Laravel 6.18.35
cURL

## まずは実装前の下準備
[Rakuten Developers](https://webservice.rakuten.co.jp/)で、アプリIDを取得しましょう。
今回叩きに行く[楽天市場商品検索API](https://webservice.rakuten.co.jp/api/ichibaitemsearch/)は入力パラメーターにアプリIDを渡せばOKなので、トークンやアフィリエイトIDは不要です。

![スクリーンショット 2020-10-02 22.19.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/55623dc1-3e07-385d-ebd0-130ee0e3d8e9.png)

次にSDKを導入です。
SDKとはソフトウェア開発キット（Software Development kit）の略で、APIを扱い安くしてくれるライブラリという感じでしょうか。[楽天SDK](https://webservice.rakuten.co.jp/sdk/)を導入すれば、対応するAPIそれぞれをより手軽に扱う事が出来ます。

まぁSDKを使わなくても実装は難しくはないのですが、今回は用意されているライブラリを使います。

```composer.json
"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を書いてね、今回は使わないよ)
```

```config/app.php
'rakuten_id' => env('RAKUTEN_APPLICATION_ID', false),
'rakuten_key' => env('RAKUTEN_APPLICATION_SEACRET', false),
```

コントローラーに欲しいデータを取り出して整形するところまで書きます。

```SearchController.php
<?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();
          }
        } 
```
どんな感じで検索結果が取得出来るかというと
![スクリーンショット 2020-10-03 0.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/45feecb4-ba31-a201-1491-4d6eb66c8f1e.png)
こんな感じ。あとは煮るなり焼くなりです。
割愛しますが、リクエストを渡す検索フォームと結果を表示するbladeを用意すれば完成です（テキトー）
![スクリーンショット 2020-10-03 0.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/d13b0f46-aff4-ec25-0b0d-cbaaf4b20be4.png)

いい感じですね。

## おまけ
[出力パラメーター](https://webservice.rakuten.co.jp/api/ichibaitemsearch/#outputParameter)に商品画像64x64URL（smallImageUrls）と商品画像128x128URL（mediumImageUrls）がありますが、もう少し大きい画像が欲しかったので、このパラメーター部分（URL）を欲しいサイズに置換する事で実現しています。

あと、検索結果の取得件数はデフォで1ページ30件になっています。ページ数を指定する事は出来ますが、ページあたりの取得件数はMAX30件なので、それ以上取得したい場合は1ページ目30件、2ページ目30件、みたいな処理が必要になりそうです。ページ数は最大100までのようです。