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

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

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

#実際にHotpepperのAPIでレストランの情報を取得して表示してみた
###開発環境
PHP：7.3.11
Laravel：7.30.4
Guzzle: 7.3
###リクルートWEBサービスへ新規登録
[こちらより](#https://webservice.recruit.co.jp/register/)メールアドレス のみで無料登録し、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
<?php

return [
    'api_key' => env('HOTPEPPER_API_KEY')
];
```
これで`config('hotpepper.api_key')`でどこからでも呼び出せるようになりました。

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

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

```php
<?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通信を行うことができる

```php
$client = new Client();
$response = $client->request([メソッド], [アクセスしたいURL]);
```
ルーティングの設定も忘れずに。
URL`/home`だったら`HotpperController`の`index`アクションへ

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

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

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

```php
<!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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632035/97474b51-5c09-81a6-ec77-215187a4e5a2.png)


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

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

https://yaba-blog.com/laravel-call-api/