CakePHP

【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 の任意の行(私は末尾あたりにした)に以下を記述します。

[php]
Router::parseExtensions('json');
[/php]

API用のコントローラー「ApisController.php」を作成

今回は分かりやすく、ApisController を作成してみました。
「トピックス」や「よくある質問」用のコントローラーなど、既存のコントローラーへアクションを追記する形でも全く問題ありません。

例として「よくある質問(questionsテーブル)」のデータをjson出力するAPIを作ってみます。
CakePHPでfindして出来上がる配列は以下のような、単純なものとします。

[php]
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] => はい、もちろん承ります。
まず、お寺の方と会食開始の時間をお打ち合わせいただき、お時間が決まりましたらこちらまでご連絡くださいませ。ご指定のお時間に当店の世話人が料理の配膳から片付け、清掃までお世話をさせていただきます。料金など詳細につきましてはご相談くださいませ。
)
)
)
[/php]

内容のテキストは以下のサービス様のものを拝借しております。

[php]
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
));
}
}
[/php]

以下、解説。

※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

-CakePHP
-, , ,