[PR] 本記事にはプロモーションが含まれています。

【PHP】フレームワークなしで作る最小限のWeb API|GETとPOST、JSONの受け取りとエラーを、C言語と比べながら

PHP

フレームワークを使わずに、PHPのファイル1つで最小限のWeb APIを作ります。組み込みやC言語での開発経験がある人向けに、C言語と比べながら説明します。

Web APIは、C言語でいえば「ソケットで決まった形式(JSON)のデータを受け取り、処理して結果を送り返す」処理に近いものです。まずは最小限のコードと、状態ごとの応答を確かめます。

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

GET と POST を受け取り、JSONで結果を返します。それ以外のメソッドや、壊れたJSONが来たときはエラーを返します。

PHP
<?php
// 1. 応答は JSON だと伝えるヘッダー
header('Content-Type: application/json; charset=utf-8');

// 2. リクエストのメソッド(GET、POST など)
$method = $_SERVER['REQUEST_METHOD'];

if ($method === 'GET') {
    // 3. URLの ?name=xxx を受け取る(なければ Guest)
    $name = $_GET['name'] ?? 'Guest';

    $response = [
        'status'  => 'ok',
        'message' => 'Hello, ' . $name,
    ];
} elseif ($method === 'POST') {
    // 4. リクエストの本文(ボディ)をそのまま読む
    $rawInput = file_get_contents('php://input');

    // JSONの文字列を連想配列にする
    $data = json_decode($rawInput, true);

    // 壊れたJSON、またはオブジェクト({ })ではないJSONはエラー
    if (json_last_error() !== JSON_ERROR_NONE || ! is_array($data)) {
        http_response_code(400); // 400 Bad Request
        $response = ['error' => 'Invalid JSON input'];
    } else {
        $response = [
            'status'   => 'ok',
            'received' => $data,
        ];
    }
} else {
    // 5. それ以外のメソッドは 405。使えるメソッドを Allow で伝える
    http_response_code(405); // 405 Method Not Allowed
    header('Allow: GET, POST');
    $response = ['error' => 'Method Not Allowed'];
}

// 6. 連想配列をJSONにして返す(日本語を \u3042 の形にしない)
echo json_encode($response, JSON_UNESCAPED_UNICODE);

json_decode() は、123 や null のような値も正しいJSONとして受け付けます。このAPIは { } の形のデータを受け取るつもりなので、is_array() で連想配列になったかも確かめています。

例外で受ける書き方

PHP 7.3 以降は、JSON_THROW_ON_ERROR を付けると、壊れたJSONのときに例外(JsonException)になります。json_last_error() を呼ぶのを忘れる心配がなくなります。

PHP
try {
    $data = json_decode($rawInput, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
    http_response_code(400);
    echo json_encode(['error' => 'Invalid JSON input']);
    exit;
}

C言語と比べると

PHPC言語でいえば
file_get_contents('php://input')受信バッファ(char buf[])からデータを読む。受信したボディがそのまま文字列で入る
json_decode() / json_encode()受信データの解析と、送信データの組み立て。自分でパーサーを書いたり sprintf で組み立てたりしなくてよい
http_response_code(400)応答の先頭に入れるエラーコード
1リクエストごとにスクリプトが最初から実行される前のリクエストの変数は残らない。malloc と free のようなメモリの管理もいらない

続けて使いたいデータは、ファイルやデータベースに保存します。

状態ごとの応答

curl -i で送ったときの、応答のヘッダーと本文の例です。下の「動かし方」のように php -S localhost:8000 で動かしている前提です。

① GET(200 OK)

Bash
curl -i "http://localhost:8000/api.php?name=Taro"
Plaintext
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 "http://localhost:8000/api.php" \
  -H "Content-Type: application/json" \
  -d '{"sensor_id": 101, "value": 23.5}'
Plaintext
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}}

-d を付けると自動で POST になるので、-X POST は書かなくても同じです。

③ 壊れたJSON(400 Bad Request)

最後に余分な , があるなど、JSONとして正しくないデータを送ったときです。

Bash
curl -i "http://localhost:8000/api.php" \
  -H "Content-Type: application/json" \
  -d '{"sensor_id": 101,}'
Plaintext
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)

処理を書いていない DELETE や PUT で送ったときです。Allow ヘッダーで、使えるメソッドを伝えています。

Bash
curl -i -X DELETE "http://localhost:8000/api.php"
Plaintext
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
Allow: GET, POST
Content-Type: application/json; charset=utf-8

{"error":"Method Not Allowed"}

動かし方

PHPの組み込みサーバーで動かす

PHPには開発用のWebサーバーが入っていて、Apacheなどを用意しなくても試せます。

  1. ターミナルで api.php を置いたフォルダーに移る
  2. 次のコマンドでサーバーを起動する
  3. 別のターミナルから、上の curl コマンドを実行する
Bash
php -S localhost:8000

このサーバーは開発用です。公開するサーバーでは使わず、Apache や Nginx で動かします。

XAMPPで動かす

XAMPPを使っているなら、C:\xampp\htdocs\api-test\api.php のように置いて Apache を起動すれば、http://localhost/api-test/api.php で試せます。そのときは、curl コマンドの http://localhost:8000/api.php をこのURLに置き換えます。

Windowsで curl を使うとき

この記事の curl コマンドは Linux・macOS の書き方で、行末の \ と ' で囲んだJSONは、Windows ではそのままでは動きません。JSONをファイル(data.json)に書いて、1行で送ると確実です。PowerShellでは curl.exe と打ちます。

Plaintext
curl.exe -i http://localhost:8000/api.php -H "Content-Type: application/json" -d @data.json

詳しくは「curlコマンドの基本と使い方」の「Windows で使うときの注意」で紹介しています。画面で試したいときは、Postman でも同じように送れます(「Postmanの使い方」)。

この先に足すもの

このコードは仕組みを確かめるための最小限のものです。実際に使うAPIにするには、次のようなものを足していきます。

  • 入力のチェック:
    sensor_id が数字か、必要な項目がそろっているかを確かめ、合わなければ 400 や 422 を返す
  • データベースへの保存:
    PDO のプリペアドステートメントを使い、受け取った値をSQLに直接つなげない
  • 認証:
    誰でも書き込めないように、トークンなどで確かめる

こうした部分をまとめて用意しているのが Laravel などのフレームワークです。Laravel では、ルートを routes/api.php に書き、入力のチェックはフォームリクエストで行います。

まとめ

  • $_SERVER['REQUEST_METHOD'] でメソッドを見て、GET は $_GET、POST の JSON は php://input から読む
  • json_decode() のあとは、エラーと一緒に is_array() も確かめる
  • エラーは http_response_code() で番号を返す。405 のときは Allow ヘッダーも付ける
  • php -S は開発用。XAMPP なら htdocs に置いても試せる
  • Windows では curl の書き方が違うので、1行で書いてJSONはファイルで渡す
ほかの開発・プログラミングの記事は、開発・プログラミングメモの目次から、テーマ別に探せます。

このブログは、にほんブログ村と人気ブログランキングに参加しています。記事が役に立ったら、下のランキングのバナーのどれかを押して応援してもらえると励みになります。

ブログランキング・にほんブログ村へにほんブログ村

サーバー構築・運用ランキング プログラムランキング

PHP
watasoftdevをフォローする

コメント