LoginSignup
1
1

Hotpepperのapiを使ってお店の情報を表示してみた

Last updated at Posted at 2021-06-06

#はじめに
今回はリクルートが提供しているhotpepperのAPIを利用して、我が本拠地横浜のレストラン情報を取得してみました。

#そもそもWebAPIとは?
APIとは、「Application Programming Interface」の頭文字をとったもので、インターフェースと言う時からも何となくわかるように、プログラムがサービスを利用する窓口のことを言います。
Web APIの場合、プログラムはWeb上に公開され、外部から呼び出して利用します。その多くは無料で私たちも利用することができます。

#実際にHotpepperのAPIでレストランの情報を取得して表示してみた
###開発環境
PHP:7.3.11
Laravel:7.30.4
Guzzle: 7.3
###リクルートWEBサービスへ新規登録
こちらよりメールアドレス のみで無料登録し、APIキーを取得します。登録したメールアドレス宛にすぐ届きます。
###laravelのプロジェクトを作成

ターミナルから新たにプロジェクトを作成します。
すでに練習用のプロジェクトがある場合は必要ありません。

$ composer create-project --prefer-dist laravel/laravel hotpepperApi "6.*"

###Guzzleのインストール
Guzzle は、HTTP リクエストの送信を容易にし、Web サービスと簡単に統合できる PHP HTTP クライアントです。

$ composer require guzzlehttp/guzzle

APIのの設定をenv.ファイルに追記します。

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

HOTPEPPER_API_KEY=1111a1a1aaaa1a11 // ここにAPI登録時に取得したAPIキーをペースト

本番環境で env.ファイルは読み込まれないので、config配下にhotpepper.phpを作成。
ModelやContorllerから、configメソッドで呼び出せるようにします。

<?php

return [
    'api_key' => env('HOTPEPPER_API_KEY')
];

これでconfig('hotpepper.api_key')でどこからでも呼び出せるようになりました。

###コントローラーに店舗情報を取得できるよう実装していく
GETメソッドでAPIを利用してみます。
HotpepperのAPIを叩いて、横浜のタがついた店舗情報10件取得してみよう

任意のコントーラーを作成して記述してみる。
ひとまずHotpepperControllerを作成。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client; // ここを追記

class HotpepperController extends Controller
{
    // HTTPリクエストを送るURL
    private const REQUEST_URL = 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/';

    // APIキー
    private $api_key;

    public function index()
    {
        // インスタンス生成
        $client = new Client();

        // HTTPリクエストメソッド
        $method = 'GET';

        // APIキーを取得
        $this->api_key = config('hotpepper.api_key');

        // APIキーや検索ワードなどの設定を記述
        $options = [
            'query' => [
                'key' => config('hotpepper.api_key'),
                'keyword' => '浦安',
                'count' => 10,
                'format' => 'json',
            ],
        ];

        // HTTPリクエストを送信
        $response = $client->request($method, self::REQUEST_URL, $options);

        // 'format' => 'json'としたのでJSON形式でデータが返ってくるので、連想配列型のオブジェクトに変換
        $restaurants = json_decode($response->getBody(), true)['results'];
        // dd($restaurants);

        // index.blade.phpを表示する
        return view('index', compact('restaurants'));
    }
   
}

以下のように記述することでAPIに対してGETメソッドでHTTP通信を行うことができる

$client = new Client();
$response = $client->request([メソッド], [アクセスしたいURL]);

ルーティングの設定も忘れずに。
URL/homeだったらHotpperControllerindexアクションへ

web.php
Route::get('/home', 'HotpepperController@index');

###店舗情報を取得してみた

結果を表示するviewは、index.blede.phpを新たに作成します。
取得した値は配列に変換しているため、$restrants['name']のような記述で値を表示することが可能です。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ホットペッパーAPI</title>
</head>
<body>
    <table border="1">
        <tr>
            <th>店舗名</th>
            <th>営業時間</th>
        </tr>
        @for ($i = 0; $i < $restaurants['results_returned']; $i++)
            <tr>
                <td><a href="{{{ $restaurants['shop'][$i]['urls']['pc'] }}}">{{{ $restaurants['shop'][$i]['name'] }}}</a></td>
                <td>{{{ $restaurants['shop'][$i]['open'] }}}</td>
            </tr>
        @endfor
    </table>
</body>
</html>

こんな感じで取得できました!
image.png

#おわりに
はじめてWebAPIを使ってみて、こんな簡単に情報を取得できることに感動しました。
世の中には無料で提供されているAPIがごまんとあるようなので他のものも使ってみたいですね!

#参考
https://qiita.com/crispypanda/items/cdf795c174a25c704e84

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1