【Pure PHP】 最小限のWeb API開発入門

PHP

組み込み制御やC言語での開発経験がある方向けに、フレームワークを使わずにPure PHP 1ファイルで構築する最小限のWeb APIサンプルコードを解説します。

Web APIの仕組みは、C言語における「ソケット通信を通じて特定のフォーマット(JSON)でパケットを受信し、処理結果を返送する処理」と非常に近いです。まずは最小構成からコードとレスポンスの挙動を確認していきましょう。

1. 最小限のAPIコード (api.php)

以下のコードは、GET/POSTリクエストの受け取り、JSONデコード・エンコード、およびエラーハンドリングを含んだ最小限のAPI実装例です。

PHP
<?php
// 1. レスポンスのHTTPヘッダーを設定
header('Content-Type: application/json; charset=utf-8');

// 2. HTTPメソッドの取得
$method = $_SERVER['REQUEST_METHOD'];

// 3. GETリクエストの処理(クエリパラメータの取得)
if ($method === 'GET') {
    // $_GET はURLパラメータ(?name=xxx)を格納した連想配列
    $name = $_GET['name'] ?? 'Guest';

    $response = [
        'status'  => 'ok',
        'message' => 'Hello, ' . $name
    ];
} 
// 4. POSTリクエストの処理(送信されたJSONボディの解析)
elseif ($method === 'POST') {
    // 生のリクエストボディ(バイト列)を読み込む
    $rawInput = file_get_contents('php://input');

    // JSON文字列をPHPの連想配列にデコード
    $data = json_decode($rawInput, true);

    // JSONデコード失敗(構文エラー等)のチェック
    if (json_last_error() !== JSON_ERROR_NONE) {
        http_response_code(400); // 400 Bad Request
        $response = ['error' => 'Invalid JSON input'];
    } else {
        $response = [
            'status'   => 'ok',
            'received' => $data
        ];
    }
} 
// 5. サポート外のメソッドへのエラー返却
else {
    http_response_code(405); // 405 Method Not Allowed
    $response = ['error' => 'Method Not Allowed'];
}

// 6. 連想配列をJSON文字列に変換して出力(クライアントへ送信)
echo json_encode($response, JSON_UNESCAPED_UNICODE);

2. C言語経験者が押さえるべきポイント

  • php://input (生データの取得)
    file_get_contents('php://input') は、HTTPリクエストのボディ部分をそのまま文字列として読み込みます。
    C言語でソケットバッファ(char buffer[])からデータを受信する操作に対応します。
  • json_encode / json_decode
    PHPの連想配列とJSON文字列の相互変換を行う標準関数です。
    C言語のように手動で文字列整形(sprintf等)を行ったりパーサーを書く必要はありません。
  • メモリと状態の管理
    PHPは1リクエストごとにスクリプトが起動・終了するステートレスな構造です。
    malloc/free のような動的メモリ管理を意識する必要はありません。

3. 各状態におけるレスポンスヘッダーと出力例

curl -i コマンドでリクエストを送信した際の、実際の生のHTTPレスポンス(ヘッダー+ボディ)の出力例です。

① GET リクエスト成功(200 OK)

実行コマンド:

Bash
curl -i "http://localhost:8000/api.php?name=Taro"

レスポンス例:

HTTP
HTTP/1.1 200 OK
Host: localhost:8000
Date: Mon, 17 Aug 2026 10:00:00 GMT
Connection: close
X-Powered-By: PHP/8.x.x
Content-Type: application/json; charset=utf-8

{"status":"ok","message":"Hello, Taro"}

② POST リクエスト成功(200 OK)

実行コマンド:

Bash
curl -i -X POST "http://localhost:8000/api.php" \
     -H "Content-Type: application/json" \
     -d '{"sensor_id": 101, "value": 23.5}'

レスポンス例:

HTTP
HTTP/1.1 200 OK
Host: localhost:8000
Date: Mon, 17 Aug 2026 10:00:05 GMT
Connection: close
X-Powered-By: PHP/8.x.x
Content-Type: application/json; charset=utf-8

{"status":"ok","received":{"sensor_id":101,"value":23.5}}

③ 不正なJSONデータの送信(400 Bad Request)

構文エラー(文末の余分なカンマなど)を含むJSONを送信した場合の動作です。

実行コマンド:

Bash
curl -i -X POST "http://localhost:8000/api.php" \
     -H "Content-Type: application/json" \
     -d '{"sensor_id": 101,}'

レスポンス例:

HTTP
HTTP/1.1 400 Bad Request
Host: localhost:8000
Date: Mon, 17 Aug 2026 10:00:10 GMT
Connection: close
X-Powered-By: PHP/8.x.x
Content-Type: application/json; charset=utf-8

{"error":"Invalid JSON input"}

④ サポート外メソッドでのアクセス(405 Method Not Allowed)

DELETEPUT など、処理を定義していないメソッドでアクセスした場合です。

実行コマンド:

Bash
curl -i -X DELETE "http://localhost:8000/api.php"

レスポンス例:

HTTP
HTTP/1.1 405 Method Not Allowed
Host: localhost:8000
Date: Mon, 17 Aug 2026 10:00:15 GMT
Connection: close
X-Powered-By: PHP/8.x.x
Content-Type: application/json; charset=utf-8

{"error":"Method Not Allowed"}

4. 動作確認手順(ローカル環境)

PHP組み込みのWebサーバー機能を使うことで、ApacheやNginxを構築せずに即座にローカル環境でテストできます。

  1. ターミナルで api.php を保存したディレクトリへ移動
  2. サーバーを起動:
    Bashphp -S localhost:8000
  3. 別のターミナルから上記の curl コマンドを実行して挙動を確認

コメント