[PHP]GuzzleHttpでjsonデータを送信する

カテゴリ: GuzzleHttp

PHPでGuzzleHttpを使用して、jsonのデータを送信したい場合、下記のコードでリクエストを投げることができます。

<?php
require "./vendor/autoload.php";

$client = new \GuzzleHttp\Client();
$url = 'http://localhost/';
$response = $client->post($url, [
    'debug' => true,
    'json' => ['foo' => 'bar']
]);

echo $response->getBody();

動作確認用に送信先サーバを用意する

通信のテストをするときは、送信先のダミーサーバーを作っておくとデバッグが楽になります。送信先のサーバは下記のコードを作で、POSTでの送信データの内容をエコーバックさせることができます。

これは、HTTPのリクエストボディが標準入力から取得できるためです。

<?php
# index.php
$body = file_get_contents('php://input');
echo $body;

デバッグ目的だとApacheなどのWebサーバを用意するのも面倒なので、PHPのインタプリタに内蔵のビルトインサーバを利用します。

ファイルをindex.phpの名前で作成したら、コマンドラインから下記のコマンドでビルトインのWebサーバを起動します

php -S localhost:80

リクエスト内容を確認する

本当にjson形式で送信できているか確認するためには、以下のようにdebugオプションをつけると確認できます。

$response = $client->post($url, [
    'debug' => true,    
    'json' => ['foo3' => 'bar3']
]);

echo $response->getBody();

実行すると下記の様に出力され、確かにContent-Type: application/jsonとして送信が行われていることがわかります。

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 80 (#0)
> POST / HTTP/1.1
Host: localhost
User-Agent: GuzzleHttp/6.2.1 curl/7.51.0 PHP/7.0.18
Content-Type: application/json
Content-Length: 15

GuzzleHttpの、ver4以下を使っている時のjson送信

何らかの理由で、GuzzleHttpのバージョン4以下の使用が必要な場合、'json'のパラメータ指定が行えないため、別の手段をとる必要があります。
以下の様に自分でcontent-typeを指定したうえで、bodyにjsonの文字列を渡さす必要があるようです。

$jsonString = encode_json(array('foo3' => 'bar3'));

$request = $client->post($url,array(
    'content-type' => 'application/json'
));
$request->setBody($jsonString);
$response = $request->send();

Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。