この記事では、PHPを使って簡単なWeb APIを実際に作成し、GETリクエストによるデータ取得、POSTリクエストによるデータ送信、APIキーを使った認証までを初心者向けに解説します。
APIサーバーとAPIクライアントの両方を作成することで、API通信の仕組みを実際に確認してみましょう。
本記事は、APIの基礎が理解でいている方が対象です。APIの基礎を学びたい方は「APIの基礎(仕組み・使い方)」を参照ください。
APIを実際に作って使ってみよう
実際にAPIを作り、別のプログラムからそのAPIを利用してみましょう。
今回は、ユーザー情報を取得するシンプルなAPIを作ります。
今回作るAPIの仕組み
実際にシンプルなAPIを使って解説します。
使用する言語やデータ形式は次の通りです。
- APIサーバー側:PHP
- APIを利用する側:PHP
- データ形式:JSON
- 通信:HTTP
- API:ユーザー情報取得API
今回は、ユーザーIDを指定すると、そのユーザーの情報を返すAPIを作ります。
例えば、下のようなユーザーID「123」を指定したリクエストを送るとします。
GET /api/users/123
※「/api/users/123」 の 123 は実際のフォルダ名ではなく、取得するユーザーを識別するためのIDです。
APIサーバーはリクエストを受け取り、ユーザー情報をJSON形式で返します。
{
"id": 123,
"name": "佐藤花子",
"email": "sato@example.com"
}
今回のサンプルで使用するもの
| 使用するもの | 用途 |
|---|---|
| PHP | APIサーバーとAPIを利用するプログラムを作成する |
| Webサーバー | PHPプログラムを実行し、HTTPリクエストを受け付ける(本サイトのサーバ) |
| JSON | 情報をやり取り |
| HTTP | APIサーバーと利用する側でリクエスト・レスポンスプロトコル |
APIサーバー側の処理を作ってみよう
今回作るAPIは、ユーザーIDを指定すると、そのユーザーの情報をJSON形式で返すAPIです。
APIサーバ側プログラム(PHP)の内容
実際はデータベースからユーザ情報を読んでJSON形式で返すような処理になると思いますが、今回はAPIの仕組みを理解することを優先するため、データベースは使用せず、シンプルな配列からデータを返す処理です。
<?php
$users = [
[
'id' => 123,
'name' => '佐藤花子',
'email' => 'sato@example.com'
],
[
'id' => 456,
'name' => '鈴木一郎',
'email' => 'suzuki@example.com'
]
];
// ユーザーIDを取得
$userId = (int)($_GET['id'] ?? 0);
// ユーザーIDが一致するユーザーを探し、見つかったらJSON形式で返す
foreach ($users as $user) {
if ($user['id'] === $userId) {
header('Content-Type: application/json; charset=utf-8');
echo json_encode($user, JSON_UNESCAPED_UNICODE);
exit;
}
}
// ユーザーが見つからなかった場合の処理
http_response_code(404);
header('Content-Type: application/json; charset=utf-8');
echo json_encode(
['error' => 'User not found'],
JSON_UNESCAPED_UNICODE
);「GET /api/users/123」のように、このPHPが実行されると、APIのレスポンスとして次のようなJSONが返ります。
{
"id": 123,
"name": "佐藤花子",
"email": "sato@example.com"
}サーバの.htaccess編集
今回はブラウザから、URL「https://pc1995lab.com/sample/api/users/123」にアクセスすると、サーバー内部では次のPHPファイルが呼び出されるようにします。
/samplepg/users.php?id=123
そのために、サーバの.htaccessへ以下の追記をしました。
RewriteEngine On
RewriteRule ^sample/api/users/([0-9]+)/?$ /samplepg/users.php?id=$1 [L,QSA]
APIサーバ側プログラムの結果確認
今回のプログラムを用意しました。実際にアクセスしてみて結果を確認してみてください。
URL:https://pc1995lab.com/samplepg/users.php?id=123

APIに認証を追加してみよう
先ほどの章で紹介したAPIは、URLを知っていれば誰でもアクセスできる状態です。
実際のシステムでは、ユーザー情報などのデータを保護するために、APIに認証を設定することがあります。
APIキーを使った認証
APIキー認証では、APIを利用する側がAPIキーを送信し、APIサーバーがそのキーを確認します。
API利用者側のプログラム
API利用者側のプログラムです。
<?php
$url = 'http://localhost/api/users/123';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: abc123xyz456'
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;APIサーバ側のプログラム
$apiKey = $_SERVER['HTTP_X_API_KEY'] ?? '';
//APIキーが正しくない場合はエラーを返す
if ($apiKey !== $validApiKey) {
http_response_code(401);
echo json_encode([
'error' => 'Unauthorized'
]);
exit;
}APIでPOSTリクエストを試してみよう
ここまでは、GETを使ってユーザー情報を取得しましたが、POSTを使ってユーザー情報をAPIへ送信する処理も確認してみましょう。
API利用者側のプログラム
PHPのcURLを使うと、POSTリクエストを送信できます
<?php
$url = 'http://localhost/api/users';
$data = [
'name' => '鈴木一郎',
'email' => 'suzuki@example.com'
];
$json = json_encode($data);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;APIサーバ側のプログラム
APIサーバー側のPOSTリクエストのボディからJSONを受け取るプログラムです。
このサンプルではデータベースを使用していないため、実際にユーザー情報を保存しているわけではありません。
APIが受け取ったデータを使って、登録結果を返すところまでを確認するサンプルです。
<?php
header('Content-Type: application/json; charset=utf-8');
$json = file_get_contents('php://input');
$data = json_decode($json, true);
// 実際にはここでデータベースなどへ登録する
$response = [
'message' => 'ユーザーを登録しました',
'user' => [
'id' => 124,
'name' => $data['name'],
'email' => $data['email']
]
];
echo json_encode($response);APIでPUTメソッドを試してみよう
PUTでは、ユーザー情報をまとめて更新します。
API利用者側のプログラム
<?php
// 更新対象のAPI URL
$url = 'https://pc1995lab.com/sample/api/users/123';
// 更新するユーザー情報
$data = [
'name' => '佐藤次郎',
'email' => 'jiro@example.com'
];
// 配列をJSON形式に変換
$jsonData = json_encode(
$data,
JSON_UNESCAPED_UNICODE
);
// cURLを初期化
$ch = curl_init($url);
// cURLの設定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// HTTPメソッドをPUTに指定
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
// JSONをリクエストボディに設定
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
// HTTPヘッダーを設定
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
]);
// APIへリクエストを送信
$response = curl_exec($ch);
// cURLを終了
curl_close($ch);
// レスポンスを表示
header('Content-Type: application/json; charset=utf-8');
echo $response;APIサーバ側プログラム
本来は、受け取ったメソッドやJSONの形式が正しいかなどのチェック処理を設けますが、本サンプルはチェックを省略しています。
<?php
header('Content-Type: application/json; charset=utf-8');
// サンプルユーザーデータ
$users = [
[
'id' => 123,
'name' => '佐藤花子',
'email' => 'sato@example.com'
],
[
'id' => 456,
'name' => '鈴木一郎',
'email' => 'suzuki@example.com'
]
];
// HTTPメソッドを取得
$method = $_SERVER['REQUEST_METHOD'];
// URLの?id=123からユーザーIDを取得
$userId = (int)($_GET['id'] ?? 0);
// リクエストボディのJSONを取得
$input = file_get_contents('php://input');
// JSONをPHPの連想配列に変換
$data = json_decode($input, true);
if ($method === 'PUT') {
foreach ($users as $user) {
if ($user['id'] === $userId) {
//更新処理
$updatedUser = [
'id' => $userId,
'name' => $data['name'],
'email' => $data['email']
];
exit;
}
}
}FAQ
- POSTメソッドでも更新や削除はできるのでは?
サーバー側のプログラムをそのように作れば、POSTリクエストを使ってデータの更新や削除を行うこともできます。
しかしHTTPには、GET、POST、PUT、PATCH、DELETEなど、目的に応じたメソッドが用意されています。
これらを適切に使い分けることで、APIのURLとHTTPメソッドを見るだけで「データを取得するのか」「更新するのか」「削除するのか」が分かりやすくなります。 - パスパラメータとクエリパラメータはどう使い分けますか?
APIでは、URLを使って値を指定する方法として、パス部分を利用する方法とクエリを利用する方法があります。
まとめ
今回は、PHPを使ってAPIサーバーとAPIクライアントを作成し、実際にAPI通信を試しました。
APIを利用すると、異なるシステム間でデータや機能をやり取りできます。GETメソッドではデータを取得し、POSTメソッドではデータを送信して登録などの処理を行えます。
また、実際のAPIでは誰でも自由にアクセスできる状態ではなく、APIキーなどを使って利用者を認証する仕組みも重要です。
APIという言葉だけを見ると難しく感じるかもしれませんが、「クライアントがリクエストを送り、APIサーバーが処理してレスポンスを返す」という基本的な流れを理解すれば、仕組みをイメージしやすくなります。


コメント