PHPのcurlを使ってjsonを送信、自作APIでそれを受信する

PHPのcurlを使ってjsonを送信、自作APIでそれを受信するための超簡単なテストです。

環境はmacのMAMPでやってます。

送信側

POSTするデータを配列で作成。

json形式に変換。

curlで送信する準備

$url = ‘http://localhost:8888/test/api.php’;送信先の指定。

CURLOPT_CUSTOMREQUESTでPOST送信を指定する。

CURLOPT_POSTFIELDSでPOSTするデータをセット

CURLOPT_HTTPHEADERで「Content-type」を「application/json」に指定する。

で送信。

‘http://localhost:8888/test/send.php’

send.php

$data = [ 
     'name' => '山田太郎',
     'age' => '35'
];
/*--json_encode--
第二引数にJSON_PRETTY_PRINT(改行とインデントを指定)と、
JSON_UNESCAPED_UNICODE(Unicode文字に変換されない)をパイプでつなげて設定。*/
$json_data = json_encode($params, JSON_PRETTY_PRINT);
$url = 'http://localhost:8888/test/api.php';

//cURLハンドルを取得。
$ch = curl_init($url);

//POST送信する時は、CURLOPT_CUSTOMREQUESTを指定する。
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

//CURLOPT_POSTFIELDSの第三引数に送信するデータを指定。
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//「Content-type」に「application/json」を指定
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
//リクエストの送信とレスポンスの取得。
$result = curl_exec($ch);

//cURLハンドルを閉じる。
curl_close($ch);

//結果表示
print_r($result);

受信側

jsonで来たデータを受け取る。

jsonデータをPOSTするとそのデータは$_POSTでは受け取れない。

file_get_contents('php://input');
これで受け取る

'http://localhost:8888/test/my_api.php'
api.php


$json = file_get_contents('php://input');
print_r(json_decode($json));

受け取る側はこれだけ。

結果は受信したものをそのまま返しただけ。
api.phpが受信したjsonデータを

print_r(json_decode($json))

json_decodeで元にもどして出力したものを
send.phpの$result = curl_exec($ch);で受け取っている。

[
'name' => '山田太郎',
'age' => '35'
];

がそのまま帰ってくる。

HTTPステータスコードなどの転送データに関わる情報

curl_getinfo関数を使用するとHTTPステータスコードなどの転送データに関わる情報を取得することが出来る。

send.phpで、
curl_close($ch);でハンドルを閉じる前に、
$get_info = curl_getinfo($ch);をやる。

$get_infoをvar_dumpすると、

array (size=37)
'url' => string 'http://localhost:8888/test/php/curl/my_api.php' (length=46)
'content_type' => string 'text/html; charset=UTF-8' (length=24)
'http_code' => int 200
'header_size' => int 294
'request_size' => int 181
'filetime' => int -1
'ssl_verify_result' => int 0
'redirect_count' => int 0
'total_time' => float 0.008265
'namelookup_time' => float 0.002102
'connect_time' => float 0.002339
'pretransfer_time' => float 0.002481
'size_upload' => float 51
'size_download' => float 51
'speed_download' => float 6375
'speed_upload' => float 6375
'download_content_length' => float 51
'upload_content_length' => float 51
'starttransfer_time' => float 0.008241
'redirect_time' => float 0
'redirect_url' => string '' (length=0)
'primary_ip' => string '::1' (length=3)
'certinfo' =>
array (size=0)
empty
'primary_port' => int 8888
'local_ip' => string '::1' (length=3)
'local_port' => int 61957
'http_version' => int 2
'protocol' => int 1
'ssl_verifyresult' => int 0
'scheme' => string 'HTTP' (length=4)
'appconnect_time_us' => int 0
'connect_time_us' => int 2339
'namelookup_time_us' => int 2102
'pretransfer_time_us' => int 2481
'redirect_time_us' => int 0
'starttransfer_time_us' => int 8241
'total_time_us' => int 8265

このように転送データに関する情報が得られる。