Laravel＋Guzzleを使用してAPIトークンを取得する方法

こんにちは、JeffTechです。

# この記事で実現できること
- Guzzleのインストール
- Laravel＋GuzzleでAPIトークンの取得

# 説明
今回はPHPのHTTPクライアントであるGuzzleを使用して、とあるAPIのトークンを取得していきたいと思います。

# 開発環境
- Laravel： 6.2
- Guzzule： 7.2

# 実装の流れ
1. Laravelプロジェクトの作成
1. Guzzleのインストール
1. 日本時間にする
1. データベース設定
1. Route
1. Controller
1. View

# 実装
## 1. Laravelのプロジェクトの作成

```bash:ターミナル
$ composer create-project --prefer-dist laravel/laravel testAPI "6.*"
```
`testAPI`というLaravel6のプロジェクトが作成されます。


## 2. Guzzleのインストール

```bash:ターミナル
$ composer require guzzlehttp/guzzle
```

composer.jsonで確認していきます。

```json:composer.json
{

    ーー省略ーー

    "license": "MIT",
    "require": {
        "php": "^7.2.5|^8.0",
        "fideloper/proxy": "^4.4",
        "guzzlehttp/guzzle": "^7.2", // ここチェック
        "laravel/framework": "^6.20",
        "laravel/tinker": "^2.5"
    },

    ーー省略ーー

}

```
私の場合composer.jsonには`"guzzlehttp/guzzle": "^7.2"`となっていますが、バージョンが多少異なっていても特に問題はありません。


## 3. 日本時間にする
APIトークンの有効期限も画面に出したいので、一応日本時間にしておきます。
`config/app.php`を編集します。

```php:app.php
return [

    ーー省略ーー

    'timezone' => 'Asia/Tokyo',

    ーー省略ーー

]
```


## 4. データベース設定
今回はMySQLを使用していきます。
`mysql -u root -p`などでMySQLに入り、`test_api`というデータベースを作成してください。

```sql
mysql> CREATE DATABASE test_api;
```

`.env`に作成したデータベースの設定をしていきます。

```:.env
// データベース関連のところを抜粋
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test_api // 今回作成したデータベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```


## 5. Route
`routes/web.php`でルートの設定を行っていきます。

```php:web.php
<?php

Route::get('/', 'TestApiController@index'); // ここを追記
```
`http://127.0.0.1:8000/`にアクセスするとこれから作成する`TestApiController`の`indexメソッド`が走るようになりました。

## 6. Controller

```bash:ターミナル
$ php artisan make:controller TestApiController
```
このコマンドで、以下のような`app/Http/Controllers/testApiController.php`が作成されます。

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestApiController extends Controller
{
    //
}
```

今回は例として下記の情報で接続したと過程します。

- ベースURL： `openapi.test.api.jp`
- HTTP リクエスト： `POST openapi.test.api.jp/v2/test`
- API_KEY： `hjfdksaJhjfkdw134fjdklsaKJ93JKL`
- user_id： `user_id`
- password： `password`

先程コマンドで作成した`app/Http/Controllers/testApiController.php`を編集していきます。

```php:TestApiController.php
<?php

namespace App\Http\Controllers;

use Facade\Ignition\QueryRecorder\Query;
use Illuminate\Http\Request;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Header;

class TestApiController extends Controller
{
    public function index()
    {
        // ベースURL
        $base_url = 'openapi.test.api.jp';

        // インスタンス作成
        $client = new Client([
            'base_url' => $base_url,
        ]);

        // API_KEY
        $api_key = 'hjfdksaJhjfkdw134fjdklsaKJ93JKL';

        // オプション
        $options = [
            // デバック（デバックしたい時は記述）
            'debug' => true,

            // 
            // パラメーター（Header）
            'headers' => [
                'api-key' => $api_key,
            ],

            // パラメーター（Query）
            'query' => [
                'user_id' => 'user_id',
            ],

            // パラメーター（Body）
            'json' => [
                'password' => 'password',
            ],
        ];

        // パス
        $path = '/v2/test';

        // リクエストするURL（openapi.test.api.jp/v2/test）
        $send_url = $base_url . $path;

        $response = $client->request('POST', $send_url, $options);

        // JSONデータとして取得
        $json = $response->getBody();
        
        // JSONデータを連想配列にする
        $api_token = json_decode($json, true);

        return view('welcome', compact('api_token'));
    }
}

```
passwordはTypeがBodyだったのですが、json指定だとうまい感じで変換してくれます。

## 7. View

JSONを連想配列で取得しているので、有効期限とAPIトークンをそれぞれ取得していきます。
`resources/views/welcome.blade.php`を下記の通り編集してください。

```html:welcome.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>

    </head>
    <body>
        <p>有効期限：{{ date('Y年m月d日　H時i分s秒', $api_token['expires_at']) }}</p>
        <p>APIトークン：{{ $api_token['token'] }}</p>
    </body>
</html>
```
有効期限はミリ秒で取得されるので、date関数でフォーマットを整えています。
これで、`php artisan serve`してからブラウザで確かめると、無事有効期限とAPIトークンを取得できるかと思います。


# 最後に
少しでも役に立った！という時は、いいねをポチッとして
フォローしてくださると嬉しいです、、、笑

役に立たなかった時は、怒らないでコメント頂けますと幸いです笑

Twitterもやってますので、よかったら見てみてくださいね！
https://twitter.com/jefftechsaku