PHPでAPIを作ってみよう!GET・POST・API認証を初心者向けに解説

開発技術

この記事では、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"
}
APIサンプルのイメージ

今回のサンプルで使用するもの

使用するもの用途
PHPAPIサーバーとAPIを利用するプログラムを作成する
WebサーバーPHPプログラムを実行し、HTTPリクエストを受け付ける(本サイトのサーバ)
JSON情報をやり取り
HTTPAPIサーバーと利用する側でリクエスト・レスポンスプロトコル

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に認証を追加してみよう

先ほどの章で紹介した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サーバーが処理してレスポンスを返す」という基本的な流れを理解すれば、仕組みをイメージしやすくなります。

コメント

タイトルとURLをコピーしました