私の運営しているサイトで APIが必要になったので、 作り方を調べつつ JSONレスポンスを返却するAPIを開発してみました。
DBの準備
下のものは、説明用のアプリです。DBは以下のようなものを用意しました。
id | title | artist | lyric |
---|---|---|---|
1 | 崖の上のポニョ | 藤岡藤巻と大橋のぞみ | ポーニョポーニョポニョ... |
2 | だんご三兄弟 | 速水けんたろう | くしにささって だんご だんご... |
3 | およげ!たいやきくん | 子門真人 | まいにち まいにち ぼくらは てっぱんの... |
APIを作っていく
まずは楽曲の一覧を通常通り画面で表示させますと
以下の通りになります。
これらの楽曲をJSON形式で取得するAPIを作成します。
JSON形式のレスポンスを返す際のコードのポイントは3つで
- 画面の表示はいらないのでオートレンダリングをOFFにする。・・・①
- レスポンスオブジェクトにレスポンス形式をセットする。・・・②
- レスポンスBodyにJSONデータを格納する。・・・③
になります。
以下、コードです。
define('BAD_REQUEST_CODE',400);
define('NORMAL_REQUEST_CODE',200);
define('AUTHORIZED_API_TOKEN','authorized_key_string');
class SongsController extends AppController
{
// index , view などのメソッドは割愛
・
・
・
public function getSongs(){
// ①HTMLの表示はいらないため自動レンダリングをOFFにする
$this->autoRender = false;
// レスポンスの形式をJSONで指定
$this->response->type('application/json');
// 認証キーを取得
$key = $this->get_query_parmas('key');
$auth = true;
// 認証キーと合わない場合
if ($key != AUTHORIZED_API_TOKEN) {
// レスポンス用JSONを生成するための連想配列を生成
$data = $this->create_response_data($key, BAD_REQUEST_CODE, 'bad request');
// ③レスポンスのBodyにjsonをセット
$this->response->body(json_encode($data));
$auth = false;
}
// 認証成功の場合
if ($auth) {
// Tableから楽曲の一覧を取得
$records = $this->Songs->find('all')->toArray();
// レスポンス用JSONを生成するための連想配列を生成
$data = $this->create_response_data($key, NORMAL_REQUEST_CODE, 'success' , $records);
$this->log(json_encode($data),LOG_DEBUG);
// ③レスポンスのBodyにjsonをセット
$this->response->body(json_encode($data,JSON_UNESCAPED_UNICODE));
}
}
private function create_response_data($key, $status, $message , $data = null)
{
if ($status === NORMAL_REQUEST_CODE){
$data = ['parmas' => ['key' => '[MASK]'],
'result' => ['status' => $status, 'message' => $message],
'data' => $data];
}else{
$data = ['parmas' => ['key' => $key],
'result' => ['status' => $status, 'message' => $message]];
}
return $data;
}
}
これで、簡単にCakeでJSONを返すAPIを作成できます。
APIを使用する場合は、 普通リクエストに含まれる認証キーと照合してデータを 返すので、 そこも実装しています。 不正な場合は不正な旨の結果を返してあげると良いかと思います。 (ちゃんとやるならStatusCodeを変えてやるんだと思います。)
以下、実行結果です。
$ # 失敗パターン
$curl http://localhost:8765/Songs/getSongs?key=hogehoge
{"parmas":{"key":"hogehoge"},"result":{"status":400,"message":"bad request"}}
$
$# 成功パターン
$curl http://localhost:8765/Songs/getSongs?key=authorized_key_string
{"parmas":{"key":"[MASK]"},"result":{"status":200,"message":"success"},"data":[{"id":1,"title":"崖の上のポニョ","artist":"藤岡藤巻と大橋のぞみ","lyric":"ポーニョポーニョポニョ..."},{"id":2速水けんたろう","lyric":"くしにささって だんご だんご..."},{"id":3,"title":"およげ!たいやきくん","artist":"子門真人","lyric":"まいにち まいにち ぼくらは てっぱんの..."}]}
以上です!!