ネットワーク・HTTP・セキュリティ

PHP HTTP POSTリクエストの基本と実装方法を解説

PHPでHTTP POSTリクエストを使い、外部サーバへデータを送信する方法を解説します。

curlライブラリやfile_get_contentsを利用した実装例を交えながら、送信処理の基本的な流れやエラーハンドリングのポイントについて説明します。

API連携やフォーム送信の実装に役立つ内容となっています。

cURLを使ったHTTP POST送信

cURLセッションの初期化

セッションの開始と基本オプション設定

まずは、curl_initを利用してcURLセッションを開始し、基本オプションとして戻り値を文字列で受け取る設定を行います。

以下はそのサンプルコードです。

<?php
// cURLセッションを初期化
$curl = curl_init();
// 結果を文字列で取得する設定
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 出力結果はありません。

APIエンドポイントの指定

リクエスト先のURLを指定するために、CURLOPT_URLオプションを利用します。

ここでは仮のAPIエンドポイントを設定しています。

<?php
// APIエンドポイントの指定
curl_setopt($curl, CURLOPT_URL, 'https://api.example.com/endpoint');
// 出力結果はありません。

POSTデータの準備

配列から文字列への変換

POSTデータを連想配列で定義した後、http_build_queryを利用してURLエンコードされた文字列に変換します。

<?php
// POSTデータの配列を用意
$postData = array(
    'username' => 'ユーザー名',
    'password' => 'パスワード'
);
// 連想配列をURLエンコードされた文字列に変換
$postFields = http_build_query($postData);
echo $postFields; // 出力例として結果を確認
username=%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D&password=%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89

JSON形式でのデータ作成

場合によっては、JSON形式でデータを送信するケースもあります。

json_encodeを利用して、配列からJSON文字列に変換します。

<?php
// POST用の配列データ
$dataArray = array(
    'key'   => '値',
    'count' => 123
);
// JSON形式に変換
$jsonData = json_encode($dataArray);
echo $jsonData; // JSON文字列の確認
{"key":"値","count":123}

リクエスト送信とレスポンス取得

実行処理と結果の確認

準備が整ったら、curl_execによりリクエストを実行してレスポンスを受け取ります。

取得したレスポンスはそのまま出力や次処理に利用することが可能です。

<?php
// リクエストを実行しレスポンスを取得
$response = curl_exec($curl);
// レスポンスの確認
if ($response !== false) {
    echo 'レスポンス: ' . $response;
} else {
    echo 'レスポンスの取得に失敗';
}
レスポンス: (APIからの返答内容)

エラー時の処理

リクエスト実行時にエラーが発生した場合、curl_errorを利用してエラー内容を取得します。

エラー検知後はエラーログの記録や適切なエラーメッセージの表示を行うようにしましょう。

<?php
// リクエスト実行後のエラー処理
$response = curl_exec($curl);
if ($response === false) {
    $errorMessage = 'cURLエラー: ' . curl_error($curl);
    echo $errorMessage;
    // 必要に応じて、エラーログの記録などを実施
} else {
    echo 'レスポンス: ' . $response;
}
cURLエラー: (エラー内容が表示されます)

file_get_contentsによるHTTP POST送信

HTTPコンテキストの作成

メソッドとヘッダーの指定

file_get_contentsを利用してPOSTリクエストを行う場合、まずはHTTPコンテキストを作成します。

ここではPOSTメソッドを利用し、Content-Typeapplication/x-www-form-urlencodedに設定した例です。

<?php
// POSTデータの配列
$data = array(
    'username' => 'ユーザー名',
    'password' => 'パスワード'
);
// URLエンコードされた文字列に変換
$postData = http_build_query($data);
// HTTPコンテキストの設定
$options = array(
    'http' => array(
        'method'  => 'POST',
        'header'  => "Content-Type: application/x-www-form-urlencoded\r\n",
        'content' => $postData
    )
);
$context = stream_context_create($options);
// 出力結果はありません。

コンテンツの組み立て

POSTデータを準備する際、URLエンコードやJSON形式の選択など、送信内容に応じた形式を決定します。

ここではURLエンコード形式を利用する例を示しましたが、必要に応じてContent-Typeapplication/jsonに変更し、JSON文字列を利用することも可能です。

<?php
// JSON形式のデータ作成例
$dataArray = array(
    'key'   => '値',
    'count' => 123
);
$jsonData = json_encode($dataArray);
// JSON形式の場合のHTTPコンテキスト設定
$optionsJson = array(
    'http' => array(
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\n",
        'content' => $jsonData
    )
);
$contextJson = stream_context_create($optionsJson);
// 出力結果はありません。

データ送信とレスポンスの受信

送信処理の実装例

設定したHTTPコンテキストを使って、指定したURLへPOSTリクエストを送信します。

ここではfile_get_contentsを利用しています。

<?php
// 送信先のURL
$url = 'https://api.example.com/endpoint';
// POSTリクエストの送信とレスポンスの受信
$response = file_get_contents($url, false, $context);
echo $response;
(APIからの返答内容)

取得データの簡易チェック

取得したレスポンスに対して、falseかどうかのチェックを行い、リクエストの成否を確認します。

<?php
if ($response === false) {
    echo 'リクエストの送信に失敗しました。';
} else {
    echo '受信データ: ' . $response;
}
受信データ: (APIからの返答内容)

実用例と注意点

サンプルコードの構成確認

コードの分割と連携方法

実装が複雑になる場合、HTTPリクエスト部分を関数として分割し、再利用できる形にまとめると便利です。

以下の例では、POSTリクエスト送信用の関数を定義し、別の場所から呼び出す方法を示しています。

<?php
// HTTP POSTリクエスト送信用の関数
function sendHttpPost($url, $data) {
    // POSTデータをURLエンコード
    $postFields = http_build_query($data);
    // HTTPコンテキストの設定
    $options = array(
        'http' => array(
            'method'  => 'POST',
            'header'  => "Content-Type: application/x-www-form-urlencoded\r\n",
            'content' => $postFields
        )
    );
    $context = stream_context_create($options);
    // file_get_contentsでPOSTリクエストを送信
    $result = file_get_contents($url, false, $context);
    return $result;
}
// サンプルデータとエンドポイント
$dataArray = array('key' => 'value');
$result = sendHttpPost('https://api.example.com/endpoint', $dataArray);
echo $result;
(APIからの返答内容)

実装時の共通留意点

複数のHTTPリクエスト実装方法を併用する場合、処理の一貫性と可読性を保つために、以下の点に注意してください。

・共通のエラーチェックやログ出力の仕組みを導入する

・機能毎にファイルやクラスで分割して管理する

・サンプルコードとしても、実際の処理で利用可能な状態とする

エラー処理とセキュリティ対策

エラー検知とログ出力の方法

通信エラー発生時には、エラーメッセージを取得し、error_log関数を用いてログに記録することが望ましいです。

以下の例は、cURLを利用した場合のエラー処理を示しています。

<?php
// cURLリクエスト実行
$response = curl_exec($curl);
if ($response === false) {
    $errorMessage = 'cURLエラー: ' . curl_error($curl);
    // エラー内容をログに出力
    error_log($errorMessage);
    echo '通信中にエラーが発生しました。';
} else {
    echo 'レスポンス: ' . $response;
}
通信中にエラーが発生しました。

入力データの検証とサニタイズ方法

外部から受け取ったデータは、そのまま使用せず、適切なフィルタリングやサニタイズ処理を行う必要があります。

以下の例では、ユーザー入力のサニタイズ方法として、filter_inputを利用しています。

<?php
// ユーザーからのPOST入力をサニタイズして取得
$userInput = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
if (empty($userInput)) {
    echo '適切な入力が行われていません。';
} else {
    echo 'ユーザー入力: ' . $userInput;
}
ユーザー入力: (サニタイズされた入力値)

まとめ

この記事では、cURL と file_get_contents を利用して HTTP POST リクエストを実装する方法と、エラー処理やセキュリティ対策などの基本手法を紹介しました。

全体を通じて、PHP による HTTP 通信の実装手順が簡潔に理解できる内容となっています。

ぜひ自身のプロジェクトでこれらの方法を試してみて、知識を実践に活かしてください。

関連記事

Back to top button