PHPでAPIとHTTP通信 | curlの使い方(GET・POST・PUT・DELETE・JSON)

php-curl

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、PHPのcurlの使い方(GET・POST・PUT・DELETE・JSONの扱いなど)について解説します。

実際に、APIとHTTP通信をするSampleCode付きなので、実践でも使いやすいはずです。

PHPのcurlでAPIとのHTTP通信を実装する

curlの使い方 GET通信

PHPの curlの基本的な使い方のフローは次のとおりです。

  1. curl_init関数で、curlの処理を始めるためのコネクションを開く。
  2. HTTP通信のRequest-設定情報をSetする。
  3. curl_exec関数で、curl(HTTP通信)を実行する。
  4. 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書籍

参考・引用

  1. PHP:foreachのループを抜ける方法、又はスキップ

最近の投稿