こんにちはフロントエンドエンジニアのまさにょんです!
今回は、PHPのcurlの使い方(GET・POST・PUT・DELETE・JSONの扱いなど)について解説します。
実際に、APIとHTTP通信をするSampleCode付きなので、実践でも使いやすいはずです。
目次
PHPのcurlでAPIとのHTTP通信を実装する
curlの使い方 GET通信
PHPの curlの基本的な使い方のフローは次のとおりです。
- curl_init関数で、curlの処理を始めるためのコネクションを開く。
- HTTP通信のRequest-設定情報をSetする。
- curl_exec関数で、curl(HTTP通信)を実行する。
- curl_close関数で、curlのコネクションを閉じる。
上記が基本的なフローです。
HTTPステータスコードなどの通信結果となるレスポンスヘッダー情報がほしい場合は、curl_getinfo関数で情報を取得することができます。
それでは、まずREST-APIとのGET通信を実施してみましょう。
// < GET通信編 >
// 1. curlの処理を始めるためのコネクションを開く
$get_curl = curl_init();
$get_http_url = 'https://jsonplaceholder.typicode.com/todos/1';
// 2. HTTP通信のRequest-設定情報をSetする
curl_setopt($get_curl, CURLOPT_URL, $get_http_url); // url-setting
curl_setopt($get_curl, CURLOPT_CUSTOMREQUEST, "GET"); // メソッド指定 Ver. GET
curl_setopt($get_curl, CURLOPT_HTTPHEADER, array("Content-type: application/json")); // HTTP-HeaderをSetting
curl_setopt($get_curl, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書の検証は行わない。
curl_setopt($get_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($get_curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る
// 3. curl(HTTP通信)を実行する => レスポンスを変数に入れる
$get_response = curl_exec($get_curl);
// 4. HTTP通信の情報を得る
$get_http_info = curl_getinfo($get_curl);
// 5. curlの処理を終了 => コネクションを切断
curl_close($get_curl);
// 6. レスポンスを出力する
var_export($get_response);
// < 出力結果 >
// '{
// "userId": 1,
// "id": 1,
// "title": "delectus aut autem",
// "completed": false
// }'
curlの使い方 POST通信
REST-APIとのPOST通信を実施してみます。
SampleCodeは、次のとおりです。
// < POST通信編 >
// 1. POSTしたいParameterを用意する
$post_params = [
"robotama"=> "Kawaii",
"from"=> "Gunma",
];
// 2. JSON形式で、Postするためにencoding
$post_params_json = json_encode($post_params);
$post_url = "http://httpbin.org/post";
// 3. curlの処理を始めるためのコネクションを開く => ここで URL をセットすることもできる!
$post_curl = curl_init($post_url);
// 4. HTTP通信のRequest-設定情報をSetする
curl_setopt($post_curl, CURLOPT_CUSTOMREQUEST, "POST"); // メソッド指定 Ver. POST
// JSONデータを送信するので、Content-type: application/json設定をset!
curl_setopt($post_curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
curl_setopt($post_curl, CURLOPT_POSTFIELDS, $post_params_json); // パラメータをセット
curl_setopt($post_curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない
curl_setopt($post_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($post_curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る
// 5. curl(HTTP通信)を実行する => レスポンスを変数に入れる
$post_response = curl_exec($post_curl);
$post_http_info = curl_getinfo($post_curl);
// 6. curlの処理を終了 => コネクションを切断
curl_close($post_curl);
// 7. レスポンスを出力する
var_export($post_response);
// < 出力結果 >
// '{
// "args": {},
// "data": "{\\"robotama\\":\\"Kawaii\\",\\"from\\":\\"Gunma\\"}",
// "files": {},
// "form": {},
// "headers": {
// "Accept": "*/*",
// "Content-Length": "36",
// "Content-Type": "application/json",
// "Host": "httpbin.org",
// "X-Amzn-Trace-Id": "Root=1-63390244-1bc0b2dd316c135336fa04a5"
// },
// "json": {
// "from": "Gunma",
// "robotama": "Kawaii"
// },
// "origin": "126.247.62.196",
// "url": "http://httpbin.org/post"
// }'
curlの使い方 PUT通信
REST-APIとのPUT通信を実施してみます。
SampleCodeは、次のとおりです。
// < PUT通信編 >
$put_params = [
"robotama"=> "Kawaii",
"purupuru"=> "true",
];
// JSON形式で、Postするためにencoding
$put_params_json = json_encode($put_params);
$put_url = "http://httpbin.org/put";
// 1. curlの処理を始めるためのコネクションを開く => ここで URL をセットすることもできる!
$put_curl = curl_init($put_url);
// 2. HTTP通信のRequest-設定情報をSetする
curl_setopt($put_curl, CURLOPT_CUSTOMREQUEST, "PUT"); // メソッド指定
curl_setopt($put_curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
curl_setopt($put_curl, CURLOPT_POSTFIELDS, $put_params_json);
curl_setopt($put_curl, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書の検証は行わない。
curl_setopt($put_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($put_curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る
// 3. curl(HTTP通信)を実行する => レスポンスを変数に入れる
$put_response = curl_exec($put_curl);
$put_http_info = curl_getinfo($put_curl);
// 4. curlの処理を終了 => コネクションを切断
curl_close($put_curl);
// 5. レスポンスを出力する
var_export($put_response);
// < 出力結果 >
// '{
// "args": {},
// "data": "{\\"robotama\\":\\"Kawaii\\",\\"purupuru\\":\\"true\\"}",
// "files": {},
// "form": {},
// "headers": {
// "Accept": "*/*",
// "Content-Length": "39",
// "Content-Type": "application/json",
// "Host": "httpbin.org",
// "X-Amzn-Trace-Id": "Root=1-63390327-723b23de4f5cf4ed252d51ae"
// },
// "json": {
// "purupuru": "true",
// "robotama": "Kawaii"
// },
// "origin": "126.247.62.196",
// "url": "http://httpbin.org/put"
// }'
curlの使い方 DELETE通信
REST-APIとのDELETE通信を実施してみます。
SampleCodeは、次のとおりです。
// < DELETE通信編 >
$delete_params = [
"robotama"=> "purupuru",
"gunma"=> "teikoku",
];
// JSON形式で、Postするためにencoding
$delete_params_json = json_encode($delete_params);
$delete_url = "http://httpbin.org/delete";
// 1. curlの処理を始めるためのコネクションを開く => ここで URL をセットすることもできる!
$delete_curl = curl_init($delete_url);
// 2. HTTP通信のRequest-設定情報をSetする
curl_setopt($delete_curl, CURLOPT_CUSTOMREQUEST, "DELETE"); // メソッド指定
curl_setopt($delete_curl, CURLOPT_HTTPHEADER, array("Content-type: application/json")); // HTTP-HeaderをSetting
curl_setopt($delete_curl, CURLOPT_POSTFIELDS, $delete_params_json); // PUT-method => PostFieleds => Request-Params: json_encode(value);
curl_setopt($delete_curl, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書の検証は行わない。
curl_setopt($delete_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($delete_curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る
// 3. curl(HTTP通信)を実行する => レスポンスを変数に入れる
$delete_response = curl_exec($delete_curl);
$delete_http_info = curl_getinfo($delete_curl);
// 4. curlの処理を終了 => コネクションを切断
curl_close($delete_curl);
// 5. レスポンスを出力する
var_export($delete_response);
// < 出力結果 >
// '{
// "args": {},
// "data": "{\\"robotama\\":\\"purupuru\\",\\"gunma\\":\\"teikoku\\"}",
// "files": {},
// "form": {},
// "headers": {
// "Accept": "*/*",
// "Content-Length": "41",
// "Content-Type": "application/json",
// "Host": "httpbin.org",
// "X-Amzn-Trace-Id": "Root=1-633904f0-4cee1c065b2fd13c7c4ca92b"
// },
// "json": {
// "gunma": "teikoku",
// "robotama": "purupuru"
// },
// "origin": "126.247.62.196",
// "url": "http://httpbin.org/delete"
// }'
SampleCode全文
<?php
// < PHPでREST-APIとHTTP通信をする | PHPのcurlの使い方(GET・POST・PUT・DELETE・JSON) >
// < GET通信編 >
// 1. curlの処理を始めるためのコネクションを開く
$get_curl = curl_init();
$get_http_url = 'https://jsonplaceholder.typicode.com/todos/1';
// 2. HTTP通信のRequest-設定情報をSetする
curl_setopt($get_curl, CURLOPT_URL, $get_http_url); // url-setting
curl_setopt($get_curl, CURLOPT_CUSTOMREQUEST, "GET"); // メソッド指定 Ver. GET
curl_setopt($get_curl, CURLOPT_HTTPHEADER, array("Content-type: application/json")); // HTTP-HeaderをSetting
curl_setopt($get_curl, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書の検証は行わない。
curl_setopt($get_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($get_curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る
// 3. curl(HTTP通信)を実行する => レスポンスを変数に入れる
$get_response = curl_exec($get_curl);
// 4. HTTP通信の情報を得る
$get_http_info = curl_getinfo($get_curl);
// 5. curlの処理を終了 => コネクションを切断
curl_close($get_curl);
// 6. レスポンスを出力する
var_export($get_response);
// < 出力結果 >
// '{
// "userId": 1,
// "id": 1,
// "title": "delectus aut autem",
// "completed": false
// }'
echo '--------------------------------------------------------'."\n";
// 7. HTTP通信の情報を確認する
var_export($get_http_info);
// < 出力結果 >
// 'array (
// 'url' => 'https://jsonplaceholder.typicode.com/todos/1',
// 'content_type' => 'application/json; charset=utf-8',
// 'http_code' => 200,
// 'header_size' => 974,
// 'request_size' => 104,
// 'filetime' => -1,
// 'ssl_verify_result' => 20,
// 'redirect_count' => 0,
// 'total_time' => 0.288889,
// 'namelookup_time' => 0.012099,
// 'connect_time' => 0.057042,
// 'pretransfer_time' => 0.227764,
// 'size_upload' => 0.0,
// 'size_download' => 83.0,
// 'speed_download' => 287.0,
// 'speed_upload' => 0.0,
// 'download_content_length' => 83.0,
// 'upload_content_length' => 0.0,
// 'starttransfer_time' => 0.288787,
// 'redirect_time' => 0.0,
// 'redirect_url' => '',
// 'primary_ip' => '2606:4700:3033::6815:3a1e',
// 'certinfo' =>
// array (
// ),
// 'primary_port' => 443,
// 'local_ip' => '2400:2200:83:8fa5:cdfa:fb52:20d2:647e',
// 'local_port' => 58760,
// 'http_version' => 3,
// 'protocol' => 2,
// 'ssl_verifyresult' => 0,
// 'scheme' => 'HTTPS',
// 'appconnect_time_us' => 227449,
// 'connect_time_us' => 57042,
// 'namelookup_time_us' => 12099,
// 'pretransfer_time_us' => 227764,
// 'redirect_time_us' => 0,
// 'starttransfer_time_us' => 288787,
// 'total_time_us' => 288889,
// )'
echo '--------------------------------------------------------'."\n";
// < POST通信編 >
// 1. POSTしたいParameterを用意する
$post_params = [
"robotama"=> "Kawaii",
"from"=> "Gunma",
];
// 2. JSON形式で、Postするためにencoding
$post_params_json = json_encode($post_params);
$post_url = "http://httpbin.org/post";
// 3. curlの処理を始めるためのコネクションを開く => ここで URL をセットすることもできる!
$post_curl = curl_init($post_url);
// 4. HTTP通信のRequest-設定情報をSetする
curl_setopt($post_curl, CURLOPT_CUSTOMREQUEST, "POST"); // メソッド指定 Ver. POST
// JSONデータを送信するので、Content-type: application/json設定をset!
curl_setopt($post_curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
curl_setopt($post_curl, CURLOPT_POSTFIELDS, $post_params_json); // パラメータをセット
curl_setopt($post_curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない
curl_setopt($post_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($post_curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る
// 5. curl(HTTP通信)を実行する => レスポンスを変数に入れる
$post_response = curl_exec($post_curl);
$post_http_info = curl_getinfo($post_curl);
// 6. curlの処理を終了 => コネクションを切断
curl_close($post_curl);
// 7. レスポンスを出力する
var_export($post_response);
// < 出力結果 >
// '{
// "args": {},
// "data": "{\\"robotama\\":\\"Kawaii\\",\\"from\\":\\"Gunma\\"}",
// "files": {},
// "form": {},
// "headers": {
// "Accept": "*/*",
// "Content-Length": "36",
// "Content-Type": "application/json",
// "Host": "httpbin.org",
// "X-Amzn-Trace-Id": "Root=1-63390244-1bc0b2dd316c135336fa04a5"
// },
// "json": {
// "from": "Gunma",
// "robotama": "Kawaii"
// },
// "origin": "126.247.62.196",
// "url": "http://httpbin.org/post"
// }'
echo '--------------------------------------------------------'."\n";
// < PUT通信編 >
$put_params = [
"robotama"=> "Kawaii",
"purupuru"=> "true",
];
// JSON形式で、Postするためにencoding
$put_params_json = json_encode($put_params);
$put_url = "http://httpbin.org/put";
// 1. curlの処理を始めるためのコネクションを開く => ここで URL をセットすることもできる!
$put_curl = curl_init($put_url);
// 2. HTTP通信のRequest-設定情報をSetする
curl_setopt($put_curl, CURLOPT_CUSTOMREQUEST, "PUT"); // メソッド指定
curl_setopt($put_curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
curl_setopt($put_curl, CURLOPT_POSTFIELDS, $put_params_json);
curl_setopt($put_curl, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書の検証は行わない。
curl_setopt($put_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($put_curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る
// 3. curl(HTTP通信)を実行する => レスポンスを変数に入れる
$put_response = curl_exec($put_curl);
$put_http_info = curl_getinfo($put_curl);
// 4. curlの処理を終了 => コネクションを切断
curl_close($put_curl);
// 5. レスポンスを出力する
var_export($put_response);
// < 出力結果 >
// '{
// "args": {},
// "data": "{\\"robotama\\":\\"Kawaii\\",\\"purupuru\\":\\"true\\"}",
// "files": {},
// "form": {},
// "headers": {
// "Accept": "*/*",
// "Content-Length": "39",
// "Content-Type": "application/json",
// "Host": "httpbin.org",
// "X-Amzn-Trace-Id": "Root=1-63390327-723b23de4f5cf4ed252d51ae"
// },
// "json": {
// "purupuru": "true",
// "robotama": "Kawaii"
// },
// "origin": "126.247.62.196",
// "url": "http://httpbin.org/put"
// }'
echo '--------------------------------------------------------'."\n";
// < DELETE通信編 >
$delete_params = [
"robotama"=> "purupuru",
"gunma"=> "teikoku",
];
// JSON形式で、Postするためにencoding
$delete_params_json = json_encode($delete_params);
$delete_url = "http://httpbin.org/delete";
// 1. curlの処理を始めるためのコネクションを開く => ここで URL をセットすることもできる!
$delete_curl = curl_init($delete_url);
// 2. HTTP通信のRequest-設定情報をSetする
curl_setopt($delete_curl, CURLOPT_CUSTOMREQUEST, "DELETE"); // メソッド指定
curl_setopt($delete_curl, CURLOPT_HTTPHEADER, array("Content-type: application/json")); // HTTP-HeaderをSetting
curl_setopt($delete_curl, CURLOPT_POSTFIELDS, $delete_params_json); // PUT-method => PostFieleds => Request-Params: json_encode(value);
curl_setopt($delete_curl, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書の検証は行わない。
curl_setopt($delete_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($delete_curl, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で受け取る
// 3. curl(HTTP通信)を実行する => レスポンスを変数に入れる
$delete_response = curl_exec($delete_curl);
$delete_http_info = curl_getinfo($delete_curl);
// 4. curlの処理を終了 => コネクションを切断
curl_close($delete_curl);
// 5. レスポンスを出力する
var_export($delete_response);
// < 出力結果 >
// '{
// "args": {},
// "data": "{\\"robotama\\":\\"purupuru\\",\\"gunma\\":\\"teikoku\\"}",
// "files": {},
// "form": {},
// "headers": {
// "Accept": "*/*",
// "Content-Length": "41",
// "Content-Type": "application/json",
// "Host": "httpbin.org",
// "X-Amzn-Trace-Id": "Root=1-633904f0-4cee1c065b2fd13c7c4ca92b"
// },
// "json": {
// "gunma": "teikoku",
// "robotama": "purupuru"
// },
// "origin": "126.247.62.196",
// "url": "http://httpbin.org/delete"
// }'
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!
PHP / Laravel書籍
参考・引用
- PHP:foreachのループを抜ける方法、又はスキップ