【PHP8.x】CURLOPT_CUSTOMREQUEST定数の使い方
CURLOPT_CUSTOMREQUEST定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLOPT_CUSTOMREQUEST定数は、PHPのcURL拡張機能において、HTTPリクエストのメソッドをカスタマイズするために使用される定数です。通常、ウェブサーバーとの通信では、データの取得にGET、データの送信にPOSTといった標準的なHTTPメソッドが利用されますが、特定のWebサービスAPIや独自のサーバー要件においては、これらの標準メソッド以外のカスタムなリクエストメソッド、または特定の標準メソッドを通常とは異なる方法で指定する必要が生じることがあります。
この定数を利用すると、プログラマーはcURLに対して、送信したいHTTPリクエストのメソッド名を文字列として明示的に指示できます。例えば、RESTful APIでデータを更新する際にPUTメソッド、データを削除する際にDELETEメソッドを使用したい場合や、あるいはHEADメソッドのようにヘッダ情報のみを取得したいが、標準的なHEADリクエストではなくPOSTリクエストの形式でメソッド名を指定したい場合などに非常に有効です。CURLOPT_CUSTOMREQUESTに「PUT」や「DELETE」といった文字列値を設定することで、cURLは指定されたカスタムメソッド名でリクエストを構築し、送信します。
この定数はcurl_setopt()関数を使ってcURLセッションのオプションとして設定され、これによりcURLがHTTPリクエストをどのように処理するかの動作を細かく制御できます。特に、CURLOPT_POSTやCURLOPT_PUTなどの他のリクエストメソッドを設定するオプションがすでに指定されている場合でも、CURLOPT_CUSTOMREQUESTで設定された値が最終的に優先されるため、より柔軟かつ高度なHTTPリクエストの制御を実現することが可能です。
構文(syntax)
1<?php 2$ch = curl_init(); 3curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 4curl_close($ch);
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
CURLOPT_CUSTOMREQUESTでGETリクエストする
1<?php 2 3/** 4 * CURLOPT_CUSTOMREQUEST を 'GET' に設定してHTTP GETリクエストを実行します。 5 * 6 * この関数は、CURLOPT_CUSTOMREQUEST オプションを使用して、明示的にHTTP GETリクエストを送信する方法を示します。 7 * これは通常、他の cURL オプションでGETリクエストが暗黙的に処理される場合でも、 8 * HTTPメソッドをカスタムで指定する必要がある場合に利用されます。 9 * 10 * @param string $url リクエストを送信するターゲットURL。 11 * @return string|false 成功した場合はレスポンスの本文を文字列で、失敗した場合は false を返します。 12 */ 13function performCustomGetRequest(string $url): string|false 14{ 15 // cURLセッションを初期化します。 16 // curl_init() は、成功した場合は cURL ハンドルを、失敗した場合は false を返します。 17 $ch = curl_init(); 18 19 if ($ch === false) { 20 // cURLの初期化に失敗した場合の処理 21 error_log("cURLセッションの初期化に失敗しました。"); 22 return false; 23 } 24 25 // cURLオプションを設定します。 26 // CURLOPT_URL: リクエスト先のURLを設定します。 27 curl_setopt($ch, CURLOPT_URL, $url); 28 29 // CURLOPT_CUSTOMREQUEST: HTTPリクエストメソッドをカスタムで設定します。 30 // ここでは 'GET' メソッドを指定しています。 31 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); 32 33 // CURLOPT_RETURNTRANSFER: curl_exec() がレスポンスを文字列として返すように設定します。 34 // これを true にしない場合、curl_exec() はレスポンスを直接出力します。 35 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 36 37 // CURLOPT_HEADER: レスポンスにヘッダーを含めるかどうかを設定します。 38 // false に設定すると、レスポンスの本文のみが返されます。 39 curl_setopt($ch, CURLOPT_HEADER, false); 40 41 // CURLOPT_SSL_VERIFYPEER と CURLOPT_SSL_VERIFYHOST は、 42 // HTTPS通信におけるSSL証明書の検証を有効にするための設定です。 43 // 本番環境ではセキュリティのために true に設定することを強く推奨します。 44 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 45 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // ホスト名の検証 46 47 // cURLリクエストを実行し、レスポンスを取得します。 48 // 実行に失敗した場合は false が返されます。 49 $response = curl_exec($ch); 50 51 // cURL実行中にエラーが発生したかチェックします。 52 if (curl_errno($ch)) { 53 // エラーが発生した場合、エラーメッセージをログに出力します。 54 $error_msg = curl_error($ch); 55 error_log("cURLエラーが発生しました: " . $error_msg); 56 $response = false; // エラー時は false を返す 57 } 58 59 // cURLセッションを閉じ、リソースを解放します。 60 curl_close($ch); 61 62 return $response; 63} 64 65// サンプルとして、JSONPlaceholder というダミーAPIのURLを使用します。 66// これはGETリクエストでユーザーデータを返します。 67$sampleApiUrl = 'https://jsonplaceholder.typicode.com/posts/1'; 68 69echo "CURLOPT_CUSTOMREQUEST を使ったGETリクエストの実行例:" . PHP_EOL; 70 71// 関数を呼び出し、カスタムGETリクエストを実行します。 72$result = performCustomGetRequest($sampleApiUrl); 73 74// 結果を表示します。 75if ($result !== false) { 76 echo "リクエスト成功!レスポンス:" . PHP_EOL; 77 echo $result . PHP_EOL; 78} else { 79 echo "リクエストが失敗しました。詳細についてはエラーログを確認してください。" . PHP_EOL; 80}
本サンプルコードは、PHPのcURLライブラリを用いてHTTPリクエストを送信する performCustomGetRequest 関数を定義しています。この関数は、指定されたURLに対してカスタムのHTTP GETリクエストを実行します。
特に注目すべきは、CURLOPT_CUSTOMREQUEST オプションです。これは、任意のHTTPリクエストメソッド(GET、POST、PUT、DELETEなど)を明示的に指定するために使用される定数です。このサンプルでは、'GET' を設定することで、GETリクエストであることをサーバーに明確に伝えています。通常のcURL設定でGETリクエストが暗黙的に処理される場合でも、カスタムメソッドを指定することで、より柔軟なリクエストが可能になります。
関数の内部では、まず curl_init() でcURLセッションを開始し、次に curl_setopt() を使って複数のオプションを設定します。これには、リクエスト先のURL (CURLOPT_URL)、レスポンスを文字列として受け取るための CURLOPT_RETURNTRANSFER、そして重要な CURLOPT_CUSTOMREQUEST が含まれます。また、HTTPS通信のセキュリティを高めるために CURLOPT_SSL_VERIFYPEER や CURLOPT_SSL_VERIFYHOST も有効にしています。
設定後、curl_exec() で実際のリクエストが実行され、応答が取得されます。リクエスト中にエラーが発生した場合は、curl_errno() などで検出し、適切なエラー処理が行われます。最後に curl_close() でcURLセッションを終了し、リソースを解放します。
この performCustomGetRequest 関数の引数 $url は、リクエストを送信するターゲットURL(文字列)です。戻り値は、リクエストが成功した場合はサーバーからの応答本文を文字列で返しますが、失敗した場合は false を返します。
このサンプルコードでは、CURLOPT_CUSTOMREQUESTを用いてHTTPメソッドを明示的に指定していますが、GETリクエストの場合、通常は他のオプションで暗黙的に処理されることが多いことを理解してください。cURLを使った通信では、curl_init()やcurl_exec()の結果を常に確認し、curl_errno()を使ってエラーを適切に処理することが極めて重要です。また、CURLOPT_RETURNTRANSFERをtrueに設定しないと、レスポンスが直接出力されてしまうため、変数で受け取る場合は必ず設定してください。HTTPS通信のセキュリティ確保のため、CURLOPT_SSL_VERIFYPEERとCURLOPT_SSL_VERIFYHOSTは本番環境で常に有効にすることを強く推奨します。最後に、cURLセッションが終了したらcurl_close()でリソースを解放するのを忘れないようにしてください。
PHP: CURLOPT_CUSTOMREQUEST でPUTリクエストを送信する
1<?php 2 3/** 4 * CURLOPT_CUSTOMREQUEST の使用例を初心者向けに示します。 5 * 6 * CURLOPT_CUSTOMREQUEST は、GET や POST 以外のカスタム HTTP メソッド 7 * (例: PUT, DELETE, PATCH など) を指定するために使用されます。 8 * これは、RESTful API と連携する際に非常に役立ちます。 9 * 10 * この関数は、指定された URL へ PUT リクエストを送信し、その応答を表示します。 11 * 12 * @param string $url リクエストを送信するURL。 13 * @param array $data リクエストボディとして送信するデータ。連想配列形式で指定し、JSON形式でエンコードされます。 14 * @return void 15 */ 16function sendPutRequestExample(string $url, array $data): void 17{ 18 // 1. cURL セッションを初期化します。 19 // cURL は、さまざまなプロトコルを使用してデータを転送するためのライブラリです。 20 $ch = curl_init(); 21 22 // cURL 初期化が失敗した場合のエラーチェック 23 if ($ch === false) { 24 echo "エラー: cURL セッションの初期化に失敗しました。\n"; 25 return; 26 } 27 28 // 送信するデータをJSON形式にエンコードします。 29 // 多くのRESTful APIはJSON形式のデータを受け取ります。 30 $jsonData = json_encode($data); 31 32 // 2. cURL オプションを設定します。 33 // CURLOPT_URL: リクエストを送信するURL。 34 curl_setopt($ch, CURLOPT_URL, $url); 35 36 // CURLOPT_CUSTOMREQUEST: ここでカスタムHTTPメソッドを指定します。 37 // 今回は「PUT」メソッドを指定しています。 38 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 39 40 // CURLOPT_POSTFIELDS: リクエストのボディとして送信するデータを指定します。 41 // PUT や POST リクエストでデータを送信する際に使用します。 42 curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); 43 44 // CURLOPT_RETURNTRANSFER: 実行結果を文字列として返すように設定します。 45 // true にすると curl_exec() が結果を直接出力せず、戻り値として返します。 46 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 47 48 // CURLOPT_HTTPHEADER: HTTPヘッダーを設定します。 49 // サーバーに送信するデータの形式 (Content-Type) とその長さ (Content-Length) を伝えます。 50 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 51 'Content-Type: application/json', 52 'Content-Length: ' . strlen($jsonData) 53 ]); 54 55 // 3. cURL セッションを実行し、応答を取得します。 56 $response = curl_exec($ch); 57 58 // 4. cURL エラーをチェックします。 59 if (curl_errno($ch)) { 60 echo 'cURL エラー: ' . curl_error($ch) . "\n"; 61 } else { 62 // サーバーからの応答をデコードし、整形して表示します。 63 // httpbin.org は、受け取ったリクエストの詳細をJSONで返します。 64 echo "サーバーからの応答:\n"; 65 $responseData = json_decode($response, true); 66 print_r($responseData); 67 echo "\n"; 68 echo "HTTP ステータスコード: " . curl_getinfo($ch, CURLINFO_HTTP_CODE) . "\n"; 69 echo "上記応答の 'method' フィールドが 'PUT' であることを確認してください。\n"; 70 } 71 72 // 5. cURL セッションを閉じ、リソースを解放します。 73 curl_close($ch); 74} 75 76// --- 使用例 --- 77// httpbin.org は、様々な HTTP リクエストをテストできる公開サービスです。 78// /put エンドポイントは PUT リクエストを受け取り、その内容を返します。 79$targetUrl = "https://httpbin.org/put"; 80$requestData = [ 81 'product_id' => 101, 82 'name' => 'Sample Widget', 83 'price' => 29.99, 84 'available' => true 85]; 86 87echo "PUT リクエストを {$targetUrl} へ送信します。\n"; 88echo "送信データ:\n"; 89print_r($requestData); 90echo "\n"; 91 92sendPutRequestExample($targetUrl, $requestData); 93 94?>
PHPのCURLOPT_CUSTOMREQUESTは、cURLライブラリを使用してHTTPリクエストを送信する際に、GETやPOST以外のHTTPメソッド(例えばPUT, DELETE, PATCHなど)を任意に指定するための定数です。この機能は、RESTful APIと連携し、データの作成、更新、削除といった操作を正確に行う際に非常に役立ちます。
提供されたサンプルコードは、CURLOPT_CUSTOMREQUESTを用いて特定のURLへPUTリクエストを送信し、その応答を表示する具体的な方法を示しています。まず、curl_init()でcURLセッションを初期化し、curl_setopt()関数で各種オプションを設定します。CURLOPT_CUSTOMREQUESTには送信したいメソッド名として"PUT"を設定し、CURLOPT_URLでリクエストの送信先URL、CURLOPT_POSTFIELDSでリクエストボディとして送信するデータをJSON形式で指定します。また、CURLOPT_HTTPHEADERでデータの形式と長さを設定し、CURLOPT_RETURNTRANSFERをtrueにすることで、curl_exec()の実行結果を文字列として取得できるようにします。リクエスト実行後、エラーがなければサーバーからの応答を表示し、最後にcurl_close()でセッションを閉じます。
このsendPutRequestExample関数は、リクエストを送信するURLを$url(文字列)として、リクエストボディとして送信するデータを$data(連想配列)として引数に取ります。$dataは内部でJSON形式にエンコードされて送信されます。関数の戻り値はvoidであり、直接的な値を返さず、処理結果を標準出力に表示します。これにより、カスタムHTTPリクエストの送信方法とAPI連携の基礎を実践的に学ぶことができます。
CURLOPT_CUSTOMREQUESTは、GETやPOST以外のHTTPメソッド(PUT, DELETEなど)でAPIと連携する際に指定します。データを送信するPUTやPOSTでは、CURLOPT_POSTFIELDSでデータを渡し、CURLOPT_HTTPHEADERでContent-TypeやContent-Lengthを正しく設定することが重要です。APIが要求するデータ形式に合わせ、JSON以外の場合は変換方法を変更してください。cURLセッションの初期化失敗や実行エラー(curl_errno)のチェック、セッションの終了(curl_close)は必ず行いましょう。サーバーからの応答は、HTTPステータスコードを確認して処理の成否を判断してください。本番環境では、APIキーなどの認証情報の扱いを含め、セキュリティ対策も考慮が必要です。