Laravelで外部のAPIを叩いてみた

## Laravelで外部APIをJSONで受け取って表示する
### 概要
- 占いのAPIを使用します。
- Web.phpに直接書いても良いですが、Controllerを使う方が本格的なのでそっちで実装していきます。
Web.php -> Controller -> blade.php
- API取得についてはGuzzleを使っていきます。
- Laravel10を使っています。

### 占いのAPIについて
占いのAPIは以下を利用させていただきます。
http://jugemkey.jp/api/waf/api_free.php
リクエスト時に日付を指定することで、その日の占い結果を12星座分返してくれるというものになります。
中身は以下のようになっていました。
```
{"horoscope":
{"2023/06/17":[
    {"content":"素晴らしい出会いが期待できそうな日！理想とも思えるような人が、とうとう目の前に姿を表す予感。アンテナを張って。",
    "item":"デニムのスカート",
    "money":5,
    "total":5,
    "job":5,
    "color":"ブルー",
    "day":17,
    "love":4,
    "rank":2,
    "sign":"牡羊座"},

    {"content":"気分が落ち込みがちな一日。ずっと家にいると、イライラしてしまうかも。カフェに行くなどして、上手に気分転換を。",
    "item":"ズッキーニ",
    "money":3,
    "total":2,
    "job":2,
    "color":"オレンジ",
    "day":"",
    "love":2,
    "rank":10,
    "sign":"牡牛座"},...
```

### 今日の日付の占い結果を取得する
#### 前提
Guzzle: API通信やスクレイピングがcurl系の関数より簡単に使えるというもの
今回はFortuneControllerを作成して実装しています。
接続先はhttp://localhost/fortuneになります。
コントローラーの作成コマンドは以下になります。
```
php artisan make:controller FortuneController
```

1. Guzzleをインストールする。(Laravelが入っているところ)
```composer require guzzlehttp/guzzle```
上記コマンドでインストールすると、composer.jsonにGuzzleが追加されます。
2. ルーティングする。(Laravel8以降の記載方法)
``` Web.php
Route::get('/fortune', [FortuneController::class, 'index']);
```

3. GuzzleでAPIリクエストしてデータを取得する。
``` FortuneController.php
use Illuminate\Support\Facades\Http;

public function index() {
    $date = date('Y/m/d');
    $resp = Http::get('http://api.jugemkey.jp/api/horoscope/free/' . $date);
}
```
→ ```dd($resp->json());```を追加して、ローカル環境に接続すると実際に取得できているか確認できます。
date関数で日付を```/```区切りで取得して、GuzzleのリクエストのURLに日付を結合しています。

4. 取得した結果をランキング順にソートしてViewに渡す。
```FortuneController.php
    public function index() {
        $date = date('Y/m/d');
        $resp = Http::get('http://api.jugemkey.jp/api/horoscope/free/' . $date);
        $resp = $resp->json();
        $horoscope = $resp['horoscope'];
        $dateFortune = $horoscope[$date];
        array_multisort(
            array_column($dateFortune, 'rank'), SORT_ASC, $dateFortune
        );

        return view('fortune', compact('dateFortune'));
    }
```
→ ソートしない場合は、array_multisortの部分を削除してください。
取得したJSONが多次元配列になっているため、当日の中身だけを取得するために以下手順を踏んでいます。
```php
$horoscope = $resp['horoscope'];
$dateFortune = $horoscope[$date];
```

5. Viewで表示する。
今回はfortune.blade.phpを作成しました。
以下のコードを記載すると表示されます。(本来はheader等の記載も必要ですが、省略します。)
```fortune.blade.php
  @foreach ( $dateFortune as $fortune )
  <section>
    <h2>{{ $fortune['sign'] }}</h2>
    <ul>
      <li>ランク: {{ $fortune['rank'] }}</li>
      <li>内容: {{ $fortune['content'] }}</li>
      <li>ラッキーアイテム: {{ $fortune['item'] }}</li>
      <li>ラッキーカラー: {{$fortune['color']}}</li>
      <li>---------</li>
    </ul>
  </section>
  @endforeach
```
$dateFortuneから表示したい情報のみを表示しています。
上記で表示される画面は以下のようになります。
![スクリーンショット 2023-06-27 10.22.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1109509/abd7990b-1d31-91fd-1a71-b81dc7b318f3.png)


これで、外部APIから情報を取得することができました。
少しレイアウトを修正して、以下のようにしてみました。
![スクリーンショット 2023-06-28 23.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1109509/5fae781f-f306-ed49-e63e-066a8f85c80b.png)



### 終わりに
Guzzleを使えばとても簡単に外部APIを使うことができます。取得するだけなら
1. Guzzleをcomposerでインストール
2. 下記でAPIを叩く
```
use Illuminate\Support\Facades\Http;

$resp = Http::get('http://api.jugemkey.jp/api/horoscope/free/' . $date);
```

この2行のみなので、とても簡単だと思いました。

Guzzleでの取得がどれだけ楽なのかを確認するために、curlで同じ実装をしてみたいなと思いました。

### 参考文献
【初心者】PHPで星占いAPIを使ってみた: https://qiita.com/mayegg/items/8f53bdd76b8dacfa58a9
【Laravel】超簡単！Guzzel HTTPを使ってAPIのデータを取得する方法: https://prograshi.com/framework/laravel/laravel-guzzel-http/