Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLOPT_HTTPHEADER定数の使い方

CURLOPT_HTTPHEADER定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURLOPT_HTTPHEADER定数は、PHPのcurl拡張機能において、HTTPリクエストに含めるカスタムヘッダーを指定するために使用される定数です。ウェブサイトやAPIとの通信を行う際、通常のリクエスト情報に加えて、特定の付帯情報をサーバーに送る必要が生じることがあります。この定数を用いることで、ユーザーが自由に定義したヘッダー情報をHTTPリクエストに追加できます。

この定数は、curl_setopt() 関数と組み合わせて使用されます。curl_setopt() 関数の最初の引数にCURLOPT_HTTPHEADERを指定し、2番目の引数には、送信したいHTTPヘッダー情報を要素とする配列を渡します。配列の各要素は、「ヘッダー名: 値」という形式の文字列である必要があります。例えば、「Content-Type: application/json」のように記述することで、リクエストボディがJSON形式であることをサーバーに伝えることができます。

具体的には、認証トークンを送信したり、特定のコンテンツタイプを指定したり、キャッシュ制御に関する指示を与えたりする場面で活用されます。HTTPヘッダーは、リクエスト本体とは別に、その内容や処理方法に関する重要なメタデータを提供する役割を担っています。この定数を正しく使用することで、目的のサーバーに対して適切な情報を伝え、多様なウェブサービスやAPIとの連携が可能になります。

構文(syntax)

1<?php
2curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'X-Custom-Header: value']);
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURLでHTTPヘッダーを設定する

1<?php
2
3/**
4 * CURLOPT_HTTPHEADER を使用して、カスタムHTTPヘッダーを含むGETリクエストを送信する関数。
5 *
6 * この関数は、指定されたURLに対し、CURLOPT_HTTPHEADER オプションを使って
7 * 複数のHTTPヘッダー(例: Content-Type, Accept, カスタムヘッダー)を設定し、
8 * リクエストを実行します。
9 *
10 * @param string $url リクエストを送信するターゲットURL。
11 * @return string|false リクエストが成功した場合は応答ボディ、失敗した場合は false。
12 */
13function sendGetRequestWithCustomHeaders(string $url): string|false
14{
15    // 1. cURLセッションを初期化します。
16    // curl_init() は新しいcURLセッションを初期化し、cURLハンドルを返します。
17    // 失敗した場合は false を返します。
18    $ch = curl_init();
19
20    if ($ch === false) {
21        error_log('CURLセッションの初期化に失敗しました。');
22        return false;
23    }
24
25    // 2. HTTPヘッダーを含むオプションを設定します。
26    // CURLOPT_HTTPHEADER は、HTTPリクエストのカスタムヘッダーを設定するために使用します。
27    // 複数のヘッダーを文字列の配列として指定します。
28    $options = [
29        CURLOPT_URL            => $url,                            // リクエスト先のURL
30        CURLOPT_RETURNTRANSFER => true,                            // 実行結果を文字列で返すように設定
31        CURLOPT_TIMEOUT        => 10,                              // 最大実行時間を10秒に設定
32        CURLOPT_FOLLOWLOCATION => true,                            // リダイレクトを自動的に追跡
33        CURLOPT_HTTPHEADER     => [                                // HTTPヘッダーの配列を設定
34            'Content-Type: application/json',                      // 送信するデータのタイプがJSONであることを示す
35            'Accept: application/json',                            // 応答としてJSONを期待することを示す
36            'X-Custom-Header: My-PHP-CURL-Example',                // 独自のカスタムヘッダーを追加
37        ],
38        // オプション: SSL証明書の検証を無効にする場合 (テスト環境向け、本番環境では非推奨)
39        // CURLOPT_SSL_VERIFYPEER => false,
40        // CURLOPT_SSL_VERIFYHOST => false,
41    ];
42
43    // curl_setopt_array() を使用して、複数のcURLオプションを一括で設定します。
44    if (!curl_setopt_array($ch, $options)) {
45        error_log('CURLオプションの設定に失敗しました: ' . curl_error($ch));
46        curl_close($ch);
47        return false;
48    }
49
50    // 3. cURLセッションを実行し、応答を取得します。
51    // curl_exec() は、設定されたcURLセッションを実行し、CURLOPT_RETURNTRANSFERが
52    // trueの場合、結果の文字列を返します。エラーが発生した場合は false を返します。
53    $response = curl_exec($ch);
54
55    // 4. エラー処理とHTTPステータスコードの確認を行います。
56    if ($response === false) {
57        // cURLリクエスト実行中のエラーをログに記録します。
58        $error_message = curl_error($ch);
59        $error_code = curl_errno($ch);
60        error_log("CURLリクエストの実行中にエラーが発生しました (エラーコード: {$error_code}): {$error_message}");
61    } else {
62        // HTTPステータスコードを取得し、400以上のエラーコードがないか確認します。
63        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
64        if ($http_code >= 400) {
65            error_log("HTTPリクエストがエラー応答を返しました (ステータスコード: {$http_code})");
66        }
67    }
68
69    // 5. cURLセッションを閉じ、リソースを解放します。
70    curl_close($ch);
71
72    return $response;
73}
74
75// 関数を実際に使用する例
76// https://httpbin.org/headers は、受け取ったHTTPヘッダーをJSON形式で返すテスト用サービスです。
77$targetUrl = 'https://httpbin.org/headers';
78
79echo "指定のURLにカスタムHTTPヘッダー付きでGETリクエストを送信中...\n";
80
81// 関数を呼び出し、結果を取得します。
82$result = sendGetRequestWithCustomHeaders($targetUrl);
83
84if ($result !== false) {
85    echo "リクエスト成功!応答内容:\n";
86    // JSON形式で返されるヘッダー情報を見やすく整形して表示します。
87    // json_decode(..., true) はJSONを連想配列にデコードします。
88    // json_encode(..., JSON_PRETTY_PRINT) は連想配列を整形されたJSON文字列に戻します。
89    $decoded_result = json_decode($result, true);
90    if ($decoded_result !== null) {
91        echo json_encode($decoded_result, JSON_PRETTY_PRINT) . "\n";
92    } else {
93        echo $result . "\n"; // JSONとしてデコードできなかった場合はそのまま表示
94    }
95} else {
96    echo "リクエストが失敗しました。上記のエラーログを確認してください。\n";
97}
98
99?>

PHPのCURLOPT_HTTPHEADERは、cURL拡張機能を利用してHTTPリクエストに任意のカスタムヘッダーを追加するための定数です。WebサービスやAPIと連携する際に、クライアントが特定の形式のデータを送受信することを伝えたり、認証情報などを渡したりする場合に非常に重要な役割を果たします。

この定数自体に引数や戻り値はありませんが、curl_setopt_array()などのcURLオプション設定関数と組み合わせて使用します。設定する値は、「ヘッダー名: 値」という形式の文字列を要素とする配列です。例えば、'Content-Type: application/json''Accept: application/json'、あるいは独自のカスタムヘッダー'X-Custom-Header: My-Value'などを複数指定できます。

サンプルコードでは、CURLOPT_HTTPHEADERオプションを利用して、指定されたURLへGETリクエストを送信する際に、「Content-Type」「Accept」「X-Custom-Header」といったカスタムHTTPヘッダーを付与しています。これにより、サーバーに対してクライアントがどのようなデータを扱い、どのような応答を期待しているか、または独自の識別情報などを伝達しています。リクエストはcurl_exec()関数で実行され、成功した場合はサーバーからの応答ボディが文字列として返され、何らかの問題で失敗した場合はfalseが返されます。

CURLOPT_HTTPHEADERは、HTTPリクエストにカスタムヘッダーを追加するために、「ヘッダー名: 値」形式の文字列を配列で設定します。Content-TypeAcceptなど一般的なものから独自のヘッダーまで柔軟に追加可能ですが、記述形式が誤るとリクエストが正しく処理されないため注意が必要です。また、サンプルコードでコメントアウトされているSSL証明書の検証無効化は、本番環境で絶対に行わないでください。セキュリティリスクが非常に高く、常に検証を有効にすべきです。cURLを使った通信では、初期化、オプション設定、実行の各段階でエラーが発生する可能性があります。それぞれのステップでエラーチェックを行い、適切なエラーハンドリングを実装することが安全な利用に繋がります。

PHP CURLでカスタムHTTPヘッダーを設定する

1<?php
2
3/**
4 * カスタムHTTPヘッダーを設定してCURLリクエストを送信するサンプル関数。
5 *
6 * PHPのCURLOPT_HTTPHEADER定数を使用して、HTTPリクエストに独自のヘッダーを追加する方法を示します。
7 * 送信されたヘッダーを確認するために、httpbin.org/headersエンドポイントを使用します。
8 *
9 * @param string $url リクエストを送信するURL。例えば 'https://httpbin.org/headers'。
10 * @param array $headers 設定するカスタムHTTPヘッダーの配列 (例: ['Content-Type: application/json', 'X-My-Header: Value'])。
11 * @return string|false リクエストの応答ボディ、またはCURLエラーが発生した場合はfalse。
12 */
13function sendCurlRequestWithHttpHeaders(string $url, array $headers): string|false
14{
15    // 1. CURLセッションを初期化します。
16    // curl_init()は新しいCURLセッションハンドルを返します。
17    $ch = curl_init();
18
19    // 2. CURLオプションを設定します。
20    // curl_setopt()は、CURL転送の特定のオプションを設定するために使用されます。
21    
22    // CURLOPT_URL: リクエストを送信するターゲットURLを設定します。
23    curl_setopt($ch, CURLOPT_URL, $url);
24
25    // CURLOPT_RETURNTRANSFER: curl_exec()が応答を文字列として返すように設定します。
26    // これを設定しない場合、curl_exec()は直接応答を出力します。
27    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
28
29    // CURLOPT_HTTPHEADER: カスタムHTTPヘッダーを設定するための最も重要なオプションです。
30    // 文字列の配列を渡します。各文字列は "Header-Name: Header-Value" の形式である必要があります。
31    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
32
33    // 3. CURLリクエストを実行し、結果を取得します。
34    // curl_exec()は、CURLセッションを実行し、設定されたオプションに基づいて応答を返します。
35    $response = curl_exec($ch);
36
37    // 4. エラーが発生した場合はチェックし、出力します。
38    // curl_errno()は、直前のCURL操作のエラー番号を返します。
39    if (curl_errno($ch)) {
40        echo 'CURLエラー: ' . curl_error($ch) . PHP_EOL;
41        $response = false; // エラーが発生した場合はfalseを返します
42    }
43
44    // 5. CURLセッションを閉じます。
45    // curl_close()はCURLセッションを終了し、使用されていたリソースを解放します。
46    curl_close($ch);
47
48    return $response;
49}
50
51// --- サンプル使用方法 ---
52// httpbin.org は、送られてきたHTTPリクエストの詳細を応答として返す便利なサービスです。
53// これを使って、CURLOPT_HTTPHEADERで設定したヘッダーが実際に送信されているかを確認できます。
54$targetUrl = 'https://httpbin.org/headers';
55
56// 設定したいカスタムHTTPヘッダーの配列を定義します。
57$customHeaders = [
58    'Content-Type: application/json',           // リクエストボディがJSON形式であることを示します
59    'X-Custom-Data: MySecretValue',             // アプリケーション固有のカスタムヘッダー
60    'User-Agent: MyCustomCurlClient/1.0 (PHP)', // ユーザーエージェントをカスタム文字列で上書きします
61    'Accept-Language: ja-JP,en-US;q=0.8,en;q=0.5' // サーバーに優先する言語を伝えます
62];
63
64echo "CURLリクエストを {$targetUrl} へ送信中..." . PHP_EOL . PHP_EOL;
65
66// 定義した関数を呼び出してリクエストを送信します。
67$result = sendCurlRequestWithHttpHeaders($targetUrl, $customHeaders);
68
69if ($result !== false) {
70    echo "リクエスト成功! 送信されたヘッダーを含む応答ボディ:" . PHP_EOL;
71    // httpbin.orgはJSON形式で応答を返すので、デコードして整形すると見やすくなります。
72    $decodedResponse = json_decode($result, true);
73    echo json_encode($decodedResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;
74} else {
75    echo "リクエスト失敗。上記のエラーメッセージを確認してください。" . PHP_EOL;
76}

PHPのCURLOPT_HTTPHEADERは、CURL拡張機能を使用してHTTPリクエストを送信する際に、カスタムのHTTPヘッダーを設定するための定数です。この定数を利用することで、デフォルトのヘッダーに加えて、または既存のヘッダーを上書きして、独自の情報をサーバーに送信できます。

サンプルコードでは、sendCurlRequestWithHttpHeaders関数がこの定数の具体的な使い方を示しています。まずcurl_init()でCURLセッションを開始し、次にcurl_setopt()関数を使ってリクエストの様々なオプションを設定します。ここでCURLOPT_HTTPHEADERに「Header-Name: Header-Value」形式の文字列を要素とする配列を渡すことで、指定されたカスタムヘッダーがリクエストに追加されます。

この関数は、リクエスト先のURLと設定したいヘッダーの配列を引数として受け取ります。CURLOPT_RETURNTRANSFERtrueに設定しているため、curl_exec()が実行された際に、サーバーからの応答ボディが文字列として関数の戻り値となります。エラーが発生した場合は、その旨をコンソールに出力し、戻り値はfalseとなります。

サンプルでは、httpbin.org/headersというサービスを利用して、実際に設定したカスタムヘッダーがサーバーに正しく送信されているかを確認しています。このサービスは、受け取ったヘッダー情報をJSON形式で返すため、応答を確認することで設定の検証が可能です。最後にcurl_close()でCURLセッションを終了し、使用したリソースを解放しています。この定数を使用することで、認証情報や特定のコンテンツタイプなど、アプリケーション固有のデータをHTTPヘッダーとして柔軟に送信できるようになります。

CURLOPT_HTTPHEADERは、HTTPリクエストにカスタムヘッダーを追加する際に使用します。設定するヘッダーは「ヘッダー名: ヘッダー値」という厳密な文字列形式で配列として指定する必要があり、形式を誤ると正しく認識されません。既存のUser-Agentなどの標準ヘッダーもこのオプションで上書きできるため、意図しない挙動に注意が必要です。機密情報をヘッダーに含める場合は、HTTPS通信を必須とし、ログなどからの情報漏洩に細心の注意を払ってください。リクエスト実行後はcurl_errno()curl_error()で必ずエラーを確認し、curl_exec()の戻り値がfalseでないか常に検証してください。また、curl_close()でCURLセッションを終了し、リソースを適切に解放することは、システムの安定性にとって非常に重要です。

関連コンテンツ