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
このように転送データに関する情報が得られる。