CakePHPでResponse HeadersのContent-Typeを変更する
こんにちは、結構前に書いたScrapyについての記事が地味にはてブがついたり、
Tweetされていたりして密かに喜んでいる、@ij_spitzです。
今回はCakePHPでAjaxを実装したときに半日ほど躓いてしまったポイントについて書きたいと思います。
CakePHPは2.5系を使用しています。
CakePHPからAjaxを使うという記事はたくさんあるので、自分の体験談を書いていきます。
ハマりポイントは主に2つありました。
まず、こちらがjQueryを使って書いたJSのスクリプトです。
$.ajax({ url: 'http://hoge.com/controller/action', type: 'POST', dataType: 'json', data: { id: $('#ajax_id').val() }, success: function(data, status){ if (data.message == 'success') { var ret = parseInt($('p#thanks').text()) + 1; $('p#thanks').text(ret); } console.log(data.message); }, error: function(xhr, status, err) { alert('エラーが発生しました.'); } });
1. CakePHPでのAjaxパラメータの受け取り方
CakePHPではAjaxで送られてきたパラメーターは単純に、
$this->request->data['id']; というように取ることができます。
ですが、jQueryからjson形式で送られてきているので、パースしないと
なんて思って余計な処理をしていてなかなか値が取れませんでした。
これは簡単に解決したのですが、ここからが問題です。。。
2. CakePHPでResponse HeadersのContent-Typeを変更する
これがまじでしんどかったです。
http://weble.org/2011/11/29/cakephp-2-0-change-thecontent-type
http://nichiyoubi.ch/post/2839
上記の2つの記事を参考に
・ヘッダーの直書き
header("Content-Type: application/json; charset=UTF-8");
・Cakeのheaderメソッド
$this->header('Content-Type: application/json')
・RequestHandlerを使う
$this->RequestHandler->setContent('json');
$this->RequestHandler->respondAs('application/json; charset=UTF-8');
・responseオブジェクトを使う
$this->response->type('json');
・上記の処理をbeforeFilterの中でやってみる
以上のようにいろいろやってみたのですが、全く上手くいきませんでした。
Cakeのバージョンによって変更があったのかもしれません。
まあjsonでAjaxしなくてもtextで諦めるか〜と思っていたのですが、解決策が見つかりました。
それがこちらです。
$this->autoRender = false; return new CakeResponse(array('type' => 'json', 'body' => json_encode(array('message' => $message))));
参考にしたのは下記のURLです、この記事を見つけられてほんとよかったです。笑