2013年9月23日

CakePHPでJSONPに対応させる

 CakePHPは、レスポンスをJSONで戻しても、JSONPに対応することができません。
バージョン2.4以降では、対応しているようです。

 今使っているCakePHPのバージョンは、2.3なので調べました。
同じことを調べて対応している方がいたのでサイトをメモしておきます。

be-hase.comさんのサイトです。

対応方法を抜粋すると以下のとおりです。

  1. lib/Cake/View/JsonView.phpをapp/View/JsonpView.phpへコピーする。
  2. コピーしたJsonpView.phpの改造する(後述)。
  3. json形式でレスポンスする時のviewClassを"jsonp"に変更する。
    コーディング方法は、CakePHPでjson形式でレスポンスする方法参照。

JsonpView.phpの抜粋
変更点は、クラス名とrenderメソッドのみです。

クラス名の変更
JsonpViewに変更する。

renderメソッドの変更
赤字の部分が変更した箇所です。
レスポンスデータをjson形式にした後に、Queryパラメータにcallbackが付いていたら、Content-typeをJavaScriptに変更し、レスポンスデータをCallBack関数の引数にするという処理を記述します。

public function render($view = null, $layout = null) {
$return = null;
if (isset($this->viewVars['_serialize'])) {
$return = $this->_serialize($this->viewVars['_serialize']);
}else if ($view !== false && $this->_getViewFileName($view)) {
$return = parent::render($view, false);
}
if(isset($this->request->query['callback'])) {
$return = sprintf('%s(%s)', h($this->request->query['callback']), $return);
$this->response->type('js');
}
return $return;
}

ちなみに、呼び元は、JQueryの$.ajaxを使っています。


これで、サーバーサイドのアプリケーションは、ますます、CakePHPで作ることが多くなりそうです。
WebAPIは簡単に作れますね。

参考図書

0 件のコメント:

コメントを投稿