【CakePHP2】CakePHP2でjsonpデータを出力するAPIを作成する方法
2019/07/31
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
http://express.heartrails.com/api.html