【Laravel & Guzzle】APIの呼び出し方法をわかりやすく解説

技術メモ

 

エンジニア
エンジニア

LaravelでAPIを呼び出してみたい

 

と考えている人は多いと思います。

 

外部のAPIを利用する事で、サービスの幅を広げる事ができますし、新しいプロダクトのアイデアも広がります。

 

しかし、初めてAPIを呼び出す場合、呼び出す方法がよくわからないですよね?

 

そこで今回は、LaravelでAPIを呼び出して(HTTP通信を行い)結果を画面に表示する一連の流れを解説していきます。

Laravel6系と5系で動作確認済みです。

 

GETメソッドとPOSTメソッドの二つのパターンでAPI呼び出しを行います。

 

開発環境

  • MacBook Pro (macOS Catalina バージョン10.15.1)
  • PHP 7.3.9
  • Laravel Framework 6.7.0

Composerはすでにインストールしているとします。

 

API呼び出しの前準備

新規プロジェクト作成(すでに作成している人は省略)

まずは新規プロジェクトを作成します。

 

プロジェクトのカレントディレクトリに移動して、ローカル開発サーバを立ち上げます。

 

http://127.0.0.1:8000にアクセスします。

ページが正常に表示されていればOKです。

 

コントローラを作成&ルーティング変更

コントローラも作成しておきます。

 

web.phpを編集します。

 

GuzzleをインストールしてHTTP通信をする

HTTP通信をする方法はいくつかありますが(file_get_contents関数やcurl関数など)、今回は一般的に使用されているGuzzleと呼ばれるパッケージを使用します。

 

guzzle/guzzle
Guzzle, an extensible PHP HTTP client. Contribute to guzzle/guzzle development by creating an account on GitHub.

 

カレントディレクトリに移動して、以下のコマンドを実行してGuzzleをインストールします。

 

 

 

composer.jsonに赤線で示した記載が追記されたらOKです。

 

APIを呼び出してみる

Googleで「API 一覧」と検索してみるとわかりますが、多くのAPIが公開されています。

 

今回はその中から、Qiita APIを使ってみたいと思います。

このAPIはQiitaの記事やユーザー情報を取得できるAPIです。

 

Qiita API v2 documentation - Qiita:Developer
Official API documantation of Qiita API v2.

 

【GET編】コントローラに処理を記載して、viewで表示する

GETメソッドでAPIを利用してみます。

QiitaのAPIを叩いて、Laravelのタグがついた記事を日付順に20件取得してみましょう!

 

作成したPostコントローラに処理を記載します。

 

以下のように記述する事で、APIに対してGETメソッドでHTTP通信を行うことができます。

 

$client = new Client();
$response = $client->request("GET", [アクセスしたいURL]);

 

 

APIとHTTPを行い受け取ったデータに対して、getBody()メソッドを使用してメッセージの本文を取得します。

さらにAPIで取得したデータはJSON形式のため、json_decode()関数を利用してJSON文字列を配列に変換します。

 

$posts = $response->getBody();
$posts = json_decode($posts, true);

 

 

結果を表示するviewは、index.blede.phpを新たに作成します。

取得した値は配列に変換しているため、$post['title'] のような記述で値を表示することが可能です。

 


※本来はheadタグは再利用性を高めるために別ファイルに切り出しますが、今回は簡略化のためそのままです。

 

http://127.0.0.1:8000 にアクセスすると、Qiita APIで取得した値が表示できているのがわかります。

 

【POST編】コントローラに処理を記載して、viewで表示する

次はPOSTメソッドでAPIを利用してみます。

Qiita APIを利用して、記事を投稿してみましょう。

 

流れとしては、

フォームから送信→コントローラ→Qiita API→投稿完了!

という形です。

 

web.phpにルーティングを追加します。

 

投稿用のフォームform.blade.phpを新規作成します。


※本来はheadタグは再利用性を高めるために別ファイルに切り出しますが、今回は簡略化のためそのままです。

 

フォームはこのような見た目です。

 

Postコントローラに処理を記載します。

 

以下のように記述する事で、APIに対してPOSTメソッドでHTTP通信を行うことができます。

 

$client = new Client();
$response = $client->request("POST", [アクセスしたいURL], [オプション(配列)]);

 

 

値を含めてリクエストを送りたい場合は、以下のように渡す値を連想配列にします。

 

$data = [
    "title" => $request->title,
    "body" => $request->body,
    "private" => $request->private === 'private' ? true : false,
    "tags" => [
        [
            "name" => $request->tag,
        ]
    ],
];

 

 

今回は値をJSONで送りたいので、オプションとして渡す配列のキーを 'json' 、値を先ほどの$dataにします。

またQiitaに記事を投稿する場合は、アクセストークンをヘッダーに含める必要があります。

 

$options = [
    'json' => $data,
    'headers' => [
        'Authorization' => 'Bearer ' . [アクセストークン],
        'Content-Type' => 'application/json',
    ]
];

 

 

Qiita APIはレスポンスで自分が投稿した記事の詳細情報を返すので、そこから記事のURLを取得しています。

 

$response = $client->request($method, $url, $options);
$post = $response->getBody();
$post = json_decode($post, true);
//新規記事のURLを取得
$new_post_url = $post['url'];

 

 

それでは、http://127.0.0.1:8000/create にアクセスしてフォームからQiitaに記事を投稿してみます。

 

記事投稿ができました!

 

 

今回はLaravel + Guzzleで外部のAPIとHTTP通信を行いました。

今回紹介した内容以外にもGuzzleは様々な使い方があるので、詳細はドキュメントを参照してください。

Guzzle, PHP HTTP client — Guzzle Documentation

 

他にも解説して欲しい内容があれば、是非ともコメント欄やお問い合わせからメッセージをください!

 

これから「Laravelを勉強したい!」と考えている人は一冊書籍を持っておくと体系的に勉強できます。

Laravelを使用したアプリ開発を学ぶのであれば「青本」がおすすめです。

私もこの書籍から入りました!

 

 

「Webサービスを作りたい!」という方に向けて記事を書きました。

 

業務未経験からポートフォリオなしでWebエンジニアに転職した際の経験談を語りました。

 

30代未経験からのエンジニア転職を成功させるための、プログラミングスクールの選び方について書きました。

技術メモ
スポンサーリンク
スポンサーリンク
のすけをフォローする
やばブロ!

コメント