Help us understand the problem. What is going on with this article?

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

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

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

環境

PHP 7.3.8
Laravel 6.18.35
cURL

まずは実装前の下準備

Rakuten Developersで、アプリIDを取得しましょう。
今回叩きに行く楽天市場商品検索APIは入力パラメーターにアプリIDを渡せばOKなので、トークンやアフィリエイトIDは不要です。

スクリーンショット 2020-10-02 22.19.53.png

次にSDKを導入です。
SDKとはソフトウェア開発キット(Software Development kit)の略で、APIを扱い安くしてくれるライブラリという感じでしょうか。楽天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
こんな感じ。あとは煮るなり焼くなりです。
割愛しますが、リクエストを渡す検索フォームと結果を表示するbladeを用意すれば完成です(テキトー)
スクリーンショット 2020-10-03 0.08.36.png

いい感じですね。

おまけ

出力パラメーターに商品画像64x64URL(smallImageUrls)と商品画像128x128URL(mediumImageUrls)がありますが、もう少し大きい画像が欲しかったので、このパラメーター部分(URL)を欲しいサイズに置換する事で実現しています。

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

shin_moto
都内IT企業でフロントエンドエンジニア1年目。PHP/Laravel/vue.js/Docker/webpackの記事多め。
https://motoike.netlify.app/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away