CakePHP2で JSON / JSONP を出力する API を作ってみましたので、備忘録としてポストします。
なお、CakePHP のバージョンは 2.4以上 とします。
CakePHP2でJSON / JSONPを出力するAPIを作成する
必要なことは公式サイトに書いていますので、一通り読んでおきましょう。
routes.phpを編集
末尾が hoge.json や api.json のようなURLを有効にするため、app/config/routes.php の任意の行(私は末尾あたりにした)に以下を記述します。
| 1 | Router::parseExtensions('json'); | 
API用のコントローラー「ApisController.php」を作成
今回は分かりやすく、ApisController を作成してみました。
「トピックス」や「よくある質問」用のコントローラーなど、既存のコントローラーへアクションを追記する形でも全く問題ありません。
例として「よくある質問(questionsテーブル)」のデータをjson出力するAPIを作ってみます。
CakePHPでfindして出来上がる配列は以下のような、単純なものとします。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | Array (     [0] => Array(         [Question] => Array(             [id] => 80             [question] => 法事の送迎はお願いできますか?             [answer] => マイクロバス送迎を承ります。ご注文の際にご送迎の予定時間をお伺いし、当日の朝に改めて正確な送迎時間をご確認させていただきます。     00名様まででしたら当店のマイクロバスをお出しいたしますので、無料でご利用いただけます。1台で乗り切らない場合はバスをチャーターいたしますので、別途料金を頂戴いたします。料金などの詳細につきましては、人数によって変わってまいりますので、まずはご相談くださいませ。         )     )     [1] => Array(         [Question] => Array(             [id] => 81             [question] => 箱膳を注文したいのですが、お膳も一緒に貸し出してくれますか?             [answer] => お膳の貸し出しは、無料でご利用いただけます。 なお、数に限りがございますので、他のお客様のご会食とかち合ってしまった場合、大人数でのご会食ではご利用いただけない場合もございます。ご予約の順に対応させていただいておりますので、お早めにご相談いただけますようお願いいたします。         )     )     [2] => Array(         [Question] => Array(             [id] => 82             [question] => 法事のお世話人をお願いできますか?             [answer] => はい、もちろん承ります。 まず、お寺の方と会食開始の時間をお打ち合わせいただき、お時間が決まりましたらこちらまでご連絡くださいませ。ご指定のお時間に当店の世話人が料理の配膳から片付け、清掃までお世話をさせていただきます。料金など詳細につきましてはご相談くださいませ。         )     ) ) | 
内容のテキストは以下のサービス様のものを拝借しております。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | class ApisController extends AppController {     // モデル ※1     public $uses = array('Question');     // RequestHandlerコンポーネントを使用 ※1     public $components = array('RequestHandler');     // API用アクション     public function faqapi() {         // 条件を適当に設定...         $limit = 10;         $order = array('Question.id' => 'ASC');         $cond = array('is_deleted' => 0);         // 一覧取得         $question_data = $this->Question->find( 'all',             array(                 'conditions' => $cond,                 'limit'      => $limit,                 'order'      => $order,                 'recursive'  => 0,                 'fields'     => array(                     'Question.id',                      'Question.question',                      'Question.answer',                  )             )         );         $this->viewClass = 'Json';              // ※2         $this->set('response', $question_data);         $this->set(array(             '_serialize' => array('response'),  // ※3             '_jsonp'     => true,               // ※4         ));     } } | 
以下、解説。
※1
Model と Component は AppController へ書いておいても良さそうですが、ひとまずこちらへ記述。
RequestHandlerコンポーネントを使用することにより、json と xml が有効となります。
※2
$this->viewClass = ‘Json’;
を記載すると、通常使われるビューは使わず、(真っ白い画面に)jsonデータだけが出力されるようになります。
※3
参考にしたAPIが response というキー名で帰ってくるので同じようにしているだけで、任意のキー名で問題ありません。
※4
trueに設定すると引数で指定したコールバック関数名でラッピングされ jsonp でも出力できるようになります。
CakePHP2.4以上で有効。
アクセスするURL
- JSON: http://example.com/apis/faqapi.json
- JSONP: http://example.com/apis/faqapi.json?callback=hoge
JSONPの場合は、引数「?callback=」に任意のコールバック関数名を指定します。
↑ JSON出力の例
↑ JSONP出力の例(コールバック名:aaa)
参考にしたAPI


 
         
         
         
         
         
         
         
         
         
         
         
         
         
         
  
  
  
  


