#はじめに
今回はリクルートが提供している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
だったらHotpperController
のindex
アクションへ
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>
#おわりに
はじめてWebAPIを使ってみて、こんな簡単に情報を取得できることに感動しました。
世の中には無料で提供されているAPIがごまんとあるようなので他のものも使ってみたいですね!
#参考
https://qiita.com/crispypanda/items/cdf795c174a25c704e84