PHP

PHPによるRESTful APIの作成

PHPによるREST fulなAPIの作成について簡単にまとめます。
RESTful APIというのはREST(Representational State Transfer)なAPIということですが、現在のAPIのスタンダードだと思っておけば大丈夫です。

1. APIのURL設計

はじめに、APIのURL設計についてです。
サブドメインパターン
http://api.example.com/v1/method
サブディレクトリパターン
http://example.com/api/v1/method
サブドメインパターンはサブドメインの設定が必要となりますが問題発生時にサーバのログを確認しやすく、問題の切り分けがしやすいという利点があります。(サブドメインの設定の仕方は本題からそれるのでここでは触れません。)
しかしながら、サブディレクトリパターンでも特に問題はないので、サブドメインの設定の仕方がわからないという方はそちらでいいかと思います。
「v1」というのはAPIのバージョンです。なくてもいいのですが、APIというものの特性上、色々なところから呼ばれることを考えると後々のためにバージョンは切っておくことをおすすめします。
「v1」「1.0」などパターンはありますが、v1、v2...とする方がわかりよくて見た目もいいのでおすすめします。

2. ヘッダーの設定

処理内容は当然APIによって異なるので割愛して、APIとして次に必要となるのがheaderの設定です。

header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Allow-Origin: *");

headerは決まりとして何かを出力する前に記述する必要があります。HTMLタグやechoでもheaderの前にあるとエラーとなります。
1行目はjson形式であること(後述)、2行目はドメインをまたいでの呼び出しを許可することを意味しています。
2行目がない場合、他のドメインからアクセスすると
XMLHttpRequest cannot load http://api.example.com/v1/method. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access.
というエラーが出ます。

3. jsonによる出力

APIとして必要となる出力の形式は主に2つあります。$data(配列でも文字列でも)をAPIとして出力する場合は下記になります。
json

echo json_encode($data);

jsonp

echo 'callback(' . json_encode($data) . ')';

基本はjsonによる出力で大丈夫です。jsonpはコールバックという機能を利用したもので、形式によって呼び出し方が異なります。

まとめ

まとめると下記のようになります。

<?php
/**
 * Hello と渡された名前と world が入った配列を出力するAPI
 */
# 処理部分
$name = $_GET['name'];
$arr[] = 'Hello';
$arr[] = $name;
$arr[] = 'world';
# header 設定
header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Allow-Origin: *");
# json出力
echo json_encode($arr);

ね、簡単でしょ?

-PHP