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();
こちらもおススメ