【Laravel】超簡単!Guzzel HTTPを使ってAPIのデータを取得する方法。

guzzel Laravel
記事内に広告が含まれていることがあります。

Guzzel HTTPというライブラリを使うと、好きなWEBページのデータを簡単に取得してくることができる。

また、APIのデータをJSON形式で取得することも可能。インストールや使い方はとても簡単。

インストール

プロジェクトのルートディレクトリで以下を実行。(composerがインストールしてあること)

composer require guzzlehttp/guzzle

以上でインストールが完了。

(参考)github公式 Guzzle

任意のWEBページのデータを取得する

次に、任意のページのデータを取得して、Laravelの画面上にデバッグとして表示してみる。

web.phpに以下を記述。

<?php

use Illuminate\Support\Facades\Http;

$resp = Http::get('URL');
dd($resp->body());

use Illuminate\Support\Facades\Http;

GuzzleのHttpファサードを使う宣言をする。これでHttp::とすれば、その中のメソッドを使うことができるようになる。

$resp = Http::get(‘URL’);

Http::getで、Httpファサードのgetメソッドを使う。引数でURLを指定すると、そのページのソースやヘッダーを丸毎取得できる。

例えば以下で、Laravel8.xのHTTPクライアントのページのデータを取得できる。

$resp = Http::get('https://readouble.com/laravel/8.x/ja/http-client.html');

dd($resp->body());

ddはデバッグ用の関数で、引数で渡した変数の中身を画面上に表示する。

取得した$respではヘッダーやソースコードなど多くのデータが入っている。bodyメソッドを使うことで、情報をbodyタグの中身のソースコードのみに限定することができる。

取得結果

プロジェクトサーバーを起動(php artisan serve)して、リロードすれば取得したデータが表示される。

ページの内容をまるごと表示する

上記はddでデバッグしたが、print_r関数を使えば、タグをそのまま出力するので、元のページの内容を自分のサーバーで表示することができる。

use Illuminate\Support\Facades\Http;

$resp = Http::get('https://readouble.com/laravel/8.x/ja/http-client.html');
print_r($resp->body());

APIのデータを取得する

同様にすればAPIのデータも簡単に取得することができる。今回はAPIとして、以下のようなJSON形式のデータを取得する。

https://raw.githubusercontent.com/kubowania/burger-api/main/db.json
use Illuminate\Support\Facades\Http;

$resp = Http::get('https://raw.githubusercontent.com/kubowania/burger-api/main/db.json');
dd($resp->json());

get関数の引数でAPIのURLを指定する。

JSON形式で取得したいので、jsonメソッドを使って、$resp->json() とする。

取得結果

ブラウザをリロードすると、以下のようにJSON形式でデータが取得できていることがわかる。

APIで取得したデータの実用例

例としてルーティング上に記述をしたが、実際に使う場合は、コントローラを使ってビューに渡すのが基本となる。

コントローラーの作成

GuzzelControllerを作成。

$ php artisan make:controller GuzzelController
Controller created successfully.

生成されたファイルを以下のように編集する。

app/Http/Controllers/GuzzelController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http; //追記

class GuzzelController extends Controller //以下追記
{
    public function index(){
        $resp = Http::get('https://raw.githubusercontent.com/kubowania/burger-api/main/db.json');
        $resp = $resp->json();
        $burgers = $resp['burgers'];
        $title = array_keys($resp)[0];

        return view('guzzel-test', [ 'burgers' => $burgers, 'title' => $title ]);
    }
}

取得してきたJSONファイルの中のデータを$burgersと$titleに格納。

ルーティングの設定

routes/web.php に以下を追記。

//guzzel test
Route::get('/guzzel', 'GuzzelController@index');

ビューの作成

resources/views/guzzel-test.blade.php を作成し、以下を追記。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Guzzel Test</title>
</head>
<body>
  <h1>{{ $title }}</h1>
  @foreach ( $burgers as $burger )
  <section>
    <h2>{{ $burger['name'] }}</h2>
    <ul>
      <li>{{ $burger['restaurant'] }}</li>
      <li>{{ $burger['web'] }}</li>
      <li>{{ $burger['description'] }}</li>
    </ul>
  </section>
  @endforeach

</body>
</html>

以上で準備が完了。

ブラウザで開く

http://localhost:8000/guzzel にアクセスする。取得してきたデータを一覧で表示することができる。

以上がAPIの基本的な使い方。

Guzzelの便利機能

Guzzelで取得してきたデータを絞り込みや整形するときに、bodyメソッドやjsonメソッドを使ったが、他にも便利なメソッドが用意されている。

メソッド表示形式取得例
body()string<h1>テスト<h1>
json()array|mixedarray:1 [ “burgers” => array:28 [] ]
collect()Illuminate\Support\Collectioncollection形式
status()int200
ok()booltrue
successful()booltrue
failed()boolfalse
serverError()boolfalse
clientError()boolfalse
headers()array以下

heders()はヘッダーレスポンスの中身を表示する。

GETメソッドでパラメータを付与する

パラメータ付きのURLを指定する場合は、URLで直接指定するか、または、第二引数で配列として渡すこともできる。

Http::get('http://example.com/users?name=Taylor&page=1')
Http::get('http://example.com/users', [
    'name' => 'Taylor',
    'page' => 1,
]);

Basic認証を承認する

Http::withBasicAuth('ユーザー名','パスワード')->getget('http://www.server.com/endpoint');

postメソッドで送信する

$response = Http::post('http://example.com/users', [
    'key1' => 'value1',
    'key2' => 'value2',
]);

getの部分をpostに変える。第二引数でKV形式でデータを渡す。

参考リンク

タイトルとURLをコピーしました