こんにちは、Ryohei(@ityryohei)です!

本記事では、PHP HTTPクライアントのGazzleで外部APOにPOSTデータを送信する方法をご紹介しています。

Gazzleで外部APIにPOSTデータを送信するには、どうすればいいんだろう?

上記の疑問にお答えします。

では、解説していきます。

Gazzleをインストールする

ComposerでGazzleパッケージをインストールします。

composer require guzzlehttp/guzzle

2023年7月9日現在のバージョンは下記の通りです。PHPは7.2.5以上が必要になります。

{
    "require": {
        "guzzlehttp/guzzle": "^7.7"
    }
}

参考:https://docs.guzzlephp.org/en/stable/overview.html#installation

Gazzleを読み込む

ComposerでインストールしたGazzleパッケージを読み込みます。Composerでは、autoload.phpuseを使って、インストール済みのパッケージを読み込むことができます。

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

Gazzleでリクエストを作成する

Gazzleでリクエストを作成します。newでクラスをインスタンス化する際に作成するリクエストのオプションを指定することができます。ここではbase_uriオプションで、リクエスト元のベースとなるURLを指定しています。

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'http://localhost',
]);

その他のオプションについては、下記ドキュメントをご参照ください。

参考:https://docs.guzzlephp.org/en/stable/request-options.html

GazzleでPOSTデータを送信する

GazzleでPOSTデータを送信します。オプションのform_paramsに配列を指定してデータを送信します。本記事では動作確認に郵便番号検索APIを使用します。

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'http://localhost',
]);

$api_url = 'http://zipcloud.ibsnet.co.jp/api/search';
$res = $client->request('POST', $api_url, [
    'form_params' => [
        'zipcode' => '8120011'
    ],
]);

参考:https://docs.guzzlephp.org/en/stable/quickstart.html?highlight=post#post-form-requests

Gazzleでレスポンスを確認する

POSTデータを送信後、外部APIからのレスポンスを確認します。レスポンスには多くの情報が含まれていますが、ここではHTTPレスポンスボディからコンテンツを取り出してみます。

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'http://localhost',
]);

$api_url = 'http://zipcloud.ibsnet.co.jp/api/search';
$res = $client->request('POST', $api_url, [
    'form_params' => [
        'zipcode' => '8120011'
    ],
]);

$body = $res->getBody();
$result = $body->getContents();

json_decode($result, true);

$resultの中身は下記となります。

array(3) {
  ["message"]=>
  NULL
  ["results"]=>
  array(1) {
    [0]=>
    array(8) {
      ["address1"]=>
      string(9) "福岡県"
      ["address2"]=>
      string(18) "福岡市博多区"
      ["address3"]=>
      string(12) "博多駅前"
      ["kana1"]=>
      string(18) "フクオカケン"
      ["kana2"]=>
      string(27) "フクオカシハカタク"
      ["kana3"]=>
      string(21) "ハカタエキマエ"
      ["prefcode"]=>
      string(2) "40"
      ["zipcode"]=>
      string(7) "8120011"
    }
  }
  ["status"]=>
  int(200)
}

無事POSTデータを送信してレスポンスを受け取ることができました。

$resultには、取り出したいコンテンツの他、ステータスやメッセージも格納されています。本記事では省略していますが、続く処理となる条件分岐等も簡単に実装できそうですね。

参考:https://docs.guzzlephp.org/en/stable/quickstart.html?highlight=getContents#using-responses

最後に

本記事の執筆にあたって、PHPのHTTPクライアントとして人気のあるGazzleを初めて利用しました。他のパッケージを使用したことがある方であればスムーズに導入できる内容になっていると思います。使いやすいHTTPクライアントをお探しの方、ぜひGazzleを試してみてくださいね。

以上、PHPのGazzleで外部APIにPOSTデータを送信する方法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。