フレームワークを使わずに、PHPのファイル1つで最小限のWeb APIを作ります。組み込みやC言語での開発経験がある人向けに、C言語と比べながら説明します。
Web APIは、C言語でいえば「ソケットで決まった形式(JSON)のデータを受け取り、処理して結果を送り返す」処理に近いものです。まずは最小限のコードと、状態ごとの応答を確かめます。
最小限のAPIのコード(api.php)
GET と POST を受け取り、JSONで結果を返します。それ以外のメソッドや、壊れたJSONが来たときはエラーを返します。
<?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() を呼ぶのを忘れる心配がなくなります。
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言語と比べると
| PHP | C言語でいえば |
|---|---|
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)
curl -i "http://localhost:8000/api.php?name=Taro"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)
curl -i "http://localhost:8000/api.php" \
-H "Content-Type: application/json" \
-d '{"sensor_id": 101, "value": 23.5}'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として正しくないデータを送ったときです。
curl -i "http://localhost:8000/api.php" \
-H "Content-Type: application/json" \
-d '{"sensor_id": 101,}'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 ヘッダーで、使えるメソッドを伝えています。
curl -i -X DELETE "http://localhost:8000/api.php"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などを用意しなくても試せます。
- ターミナルで
api.phpを置いたフォルダーに移る - 次のコマンドでサーバーを起動する
- 別のターミナルから、上の curl コマンドを実行する
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 と打ちます。
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はファイルで渡す



コメント