PHPを使ってWEBサーバにAPIリクエストを送信したい場合、Guzzleパッケージを利用することができます。

本文書ではGuzzleを使用方法を理解するために既存のシステムやフレームワークでの使用方法ではなく単独でGuzzleパッケージのインストールを行い使用手方法を説明しています。

Guzzleの設定方法

Guzzle/Guzzleパッケージのインストール

PHPではパッケージ管理のComposerを利用してGuzzleのインストールを行います。そのためシステムには事前にComposerをインストールしておく必要があります。

システム上に任意の名前でディレクトリを作成します。

作成したディレクトリの中でcomposer requireコマンドを利用してguzzlehttp/guzzleパッケージのインストールを行います。


$ composer require guzzlehttp/guzzle
Using version ^3.9 for guzzle/guzzle
パッケージ名の似た古いバージョンのguzzle/guzzleパッケージもあるので名前を間違えないようにguzzlehttp/guzzleをインストールしてください。
fukidashi

インストールが完了するとcomposer requireを実行したディレクトリには、composer.json, composer.lock, vendorディレクトリの3つが作成されます。composer.jsonファイルには、インストールしたGuzzleパッケージの情報が記述されます。


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

GETリクエストを使った動作確認

Guzzleパッケージのインストールが完了したら、test.phpファイルを作成してインストールしたGuzzleが動作するか確認します。

test.phpファイルを作成して、下記の内容を記述します。


<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client();

$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/posts/1');

echo $response->getBody();

require ‘vendor/autoload.php’は忘れずに記述してください。

GETリクエストを実行して、WEBサーバから情報を取得したい場合は下記のように記述します。


$response = $client->request('GET', URL);

requestメソッドを利用していますが、下記のgetメソッドで記述することも可能です。


$response = $client->get(URL);

GuzzleのGETリクエストを使って情報を取得できるか確認するためにテスト動作確認用のJSONPLACEHOLDERを利用しています。 JSONPLACEHOLDERはダミーでJSONデータを戻してくれる無料のサービスです。外部のサービスへのアクセスが正常に行われているかなどのテストの動作確認等で利用することができます。

URLにhttps://google.comやhttps://yahoo.co.jpを指定することも可能です
fukidashi

$responseの中身をgetBodyメソッドで確認すると下記のJSONデータがJSONPLACDHOLDERから戻ってきていることを確認できます。


$ php test.php
{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

わずか数行のコードを記述するだけで外部のサーバからGETメソッドを利用して簡単にデータを取得できることがわかります。

メソッドについて

getbodyを使ってレスポンスの中身を確認しましたが、getStatusCodeやgetHeaderLineなどのメソッドもあります。


<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client();

$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/posts/1');

echo 'Content-Type:'.$response->getHeaderLine('content-type');
echo 'StatusCode:'.$response->getStatusCode();

実行するとContent-Typeとステータスコードを確認することができます。ステータスコードが200なのでデータの取得が正しく行われたことがわかります。


$ php test.php
Content-Type:application/json; charset=utf-8S
StatusCode:200

その他の使用方法

POSTリクエストによる送信

データを外部から取得するGETリクエストだけではなくform_paramsを利用することでPOSTリクエストを送信することができます。


require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client();

$options = [
'form_params' => [
    "foo" => "bar"
   ]
];

$response = $client->request('POST', 'http://127.0.0.1:8000/api/test', $options);

echo $response->getBody();

POSTでのリクエスト方法の記述はpostメソッドを使用しても可能です。


$response = $client->post('http://127.0.0.1:8000/api/test', $options);

アクセストークンの送信方法

DropboxやSlackなどAPIを公開し、アクセストークンを利用してアクセスできるサービスが増えてきています。その場合にもGuzzleHttpを活用することができます。正しい認証情報でアクセスを行うとサービス側からアクセストークンが戻されます。戻したアクセストークンはサービスにアクセスするために必須の情報となります。下記のようにヘッダーのAuthorizationにアクセストークンを行うことでアクセス制限のあるサービスにもアクセスが可能となります。


$response = $client->request('GET', URL, [
    'headers' => [
        'Content-Type' => 'application/json',
        'Authorization' => 'Bearer '.$accessToken,
    ],
]);

PHPで外部サービスからのデータ取得、データ送信にGuzzleが利用できることが一連の流れで理解することができました。単独で利用するよりもフレームワーク内にインストールされているGuzzleを利用する機会もあるかと思いますが単独の利用方法が理解できていたらどこで利用する場合も利用方法に困ることはないはずです。