CakePHP3 でJSONレスンポンスを返すAPIを作成

2018年8月26日

 

 

私の運営しているサイトで
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":"まいにち まいにち ぼくらは てっぱんの..."}]}

 

 

 

以上です!!