[Laravel8]APIからデータを取得する方法(Guzzleを使ってみる)

2022年1月5日

はじめに

Laravel8でAPI等https経由でデータを取得する方法について解説していきます。

Laravel8ではGuzzleというHTTP用ライブラリのラッパーが使え、
非常に簡単にAPI等Web経由でデータを取得できます。

※ラッパー = 元のコード(ライブラリ)を使いやすいように拡張したもの

Guzzleとは

GuzzleとはPHPのHTTPクライアントです。
Guzzleを使えば、簡単にWeb経由でデータを取得することができます。

本家Github

事前準備

Laravel8にすでに入っているので事前準備は不要です。
クラスを読み込むだけで使えます。
もし以前にライブラリを消したことがある場合は、再度インストールが必要です。

インストール方法

※以前アンインストールした人のみ必要

composer経由でインストールします。

composer require guzzlehttp/guzzle

基本的な使い方

ここではサンプルを元に基本的な使い方を説明します。

※コントローラーで使うことを前提としています。
HTTPのメソッド GET,POST,PUT,DELETE,PATCHそれぞれ対応しています。

GET以外で使いたい場合

今回のサンプルはGETのみですが、他POSTのURLにアクセスしたい場合は、
Http::get($url);のgetの部分を各メソッド名に置き換えてもらえればOKです。

パターン1パラメータなしのURLにアクセス

http://example.com にアクセス

//このクラスを読み込んでください
use Illuminate\Support\Facades\Http; 
//http://example.comにGETでアクセスしています
$url = "http://example.com";
$response = Http::get($url);
//$response->body()でサイトのHTMLを取得
var_dump($response->body());

パターン2パラーメータありのURLにアクセス

http://example.com?aaa=bbb にアクセス

//このクラスを読み込んでください
use Illuminate\Support\Facades\Http; 
//http://example.com?aaa=bbbにGETでアクセスしています
    $url = "http://example.com";
    $response = Http::get($url,[
           'aaa' => "bbb"
       ]);
    //$response->body()でサイトのHTMLを取得
    var_dump($response->body());

サンプルコード

Controller:app/Http/Controllers/ExtractController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
//HTTPクラスを読み込む
use Illuminate\Support\Facades\Http;
use Carbon\Carbon;

class ExtractController extends Controller
{
   public function index() {

        $data = $this->dataExtractfromAPI();

        //APIから取得したデータをViewに渡す
        return view('index', compact('data')); 


   } 
   /*APIからデータを取ってくる*/ 
   public function dataExtractfromAPI() {

       //過去日のデータが取れないのでとりあえず今日の日付をセットする
       $date = Carbon::now()->format("Y-m-d");
       $url = "https://api.nhk.or.jp/v2/pg/genre/260/e1/0409/" . $date. ".json";

       //パラメータは連想配列で渡す。POSTや他メソッドも同じ形式
       $response = Http::get($url,[
           'key' => "XXXXXXXXXXXXXXXX"
       ]); 

       //アクセスした後データの確認。
       //HTTPステータスに問題がなければそのままデータを返す、
       //問題があれば空の配列を返す。
       if ($response->ok() === TRUE ) {
           return $response->json();
       } else {
           return array();
       }  

   }


}

NHKさんの番組情報取得APIにアクセスしているコードです。

URLはGET形式で
https://api.nhk.or.jp/v2/pg/genre/260/e1/0409/YYYY-MM-DD.json?key=XXXXXXです。

パラメータは連想配列に入れて渡してあげます。

渡し終えたら、返却値の受け取りです。

まず、$response->ok()これでとりあえずデータ取得元にエラーが起きていないか確認します。

Laravel8では以下2つほど、
レスポンスが正常かチェックできるメソッドが用意されています。

データ取得元のシステムに不具合を起きている時は、
データが正しくない可能性があるのでデータを取得すべきではありません。
(障害時はデータの中身が取得できないことがほとんどですが。)

Webサービスは障害等起こりやすいものでもあるので、
本格稼働するシステムであればデータ取得元のステータスチェックは必須です。
用途に合わせて使ってみてください。
※その他API独自でステータスチェックの方法が実装されていることがありますので、
仕様書等合わせてご確認ください。

データ取得元にエラーが起きていないかチェックするメソッド

  1. $response->ok() : bool;
  2. $response->successful() : bool;

$response->ok() $response->successful() の違い

$response->ok() $response->successful() と似たようなものが二つあります。
違いはなんでしょうか。

$response->ok() はHTTPステータスコードが200のみをOKとしているのに対し
$response->successful()はHTTPステータスコードが200番台のものを全部OKとしています。

Laravelのコード

Laravelのライブラリ内で実際に書かれているコードを追ってみます。

↓Laravel内のコード vendor/laravel/framework/src/Illuminate/Http/Client/Response.php

     /**
     * Determine if the request was successful.
     *
     * @return bool
     */
    public function successful()
    {
        return $this->status() >= 200 && $this->status() < 300;
    }

    /**
     * Determine if the response code was "OK".
     *
     * @return bool
     */
    public function ok()
    {
        return $this->status() === 200;
    }

JSONデータの受け取り方法について

話を少し戻して、JSONデータの受け取り方法について

このAPIではJSON形式で値の返却をします。

$response->json();はjson形式で返却されたものをArray(配列)で返却してくれます。
Arrayの中身をうまいことForeachで抜き出してあげれば値を取ることができます。
json型で返却されてもPHPでは扱いにくく、
一手間必要なのでArrayで返却してくれるあたり非常に使いやすいライブラリですね。

サンプルコードではレスポンスが正常であれば取得したデータをそのまま、
レスポンスが異常であれば空の配列を返すようにしています。

View:resources/views/index.blade.php

少しおまけですが、コントローラーからViewにデータを渡した後どう処理するかも書いてみます。

サンプルコードです。

{{-- APIに異常があったりデータが空の時はforeachしないようにする --}} 
@if(isset($data["list"])) 
<p>@foreach ($data["list"]["e1"] as $value)</p>
{{-- とりあえず番組名を表示 --}} 
<p>{{$value["title"]}}</p>
@endforeach
@else
<p>データなし</p>
@endif

Viewに渡したデータを処理します。
ちゃんと有効なデータが取れた時はdata[“list"]に何かしら値が入ってくるので、
入っている場合はデータをそのまま使います。
空の場合は有効データなしと判断しデータなしと表示します。

APIやWebサイトの場合、
異常なデータが入ってきてるのにそのまま表示したり、
DBにデータを入れたりするとひどい目に遭ってしまいます。

APIやWebサイトが正常に稼働していることを何かしらの方法で判断し、
正常時異常時とも受け取り側のサイトの処理を正常に継続できるようにケアします。

他の使い方についてはLaravel公式サイトを確認ください

まとめ

Laravel8ではHTTP経由でデータを取得する際、
GuzzleというHTTPクライアントをラッパーしたクラスが使えます。

非常に簡単にアクセス、データ取得後の処理が行えるのでぜひ使ってみてください。

参考文献

Laravel8本家 http-clientについて https://readouble.com/laravel/8.x/ja/http-client.html

$response->ok() $response->successful() の違いについて https://laracasts.com/discuss/channels/laravel/difference-between-response-ok-and-response-successful

関連記事

Posted by karaagelovers