
CodeIgniter 來當作 REST Server 的朋友們,我相信都會找到 philsturgeon 所寫的 codeigniter-restserver,此套件幫你完成底層 API Response 動作,讓你可以輕易處理 REST URL。但是如果拿這套程式碼來搭配 Backbone.js 你會遇到拿不到 POST 或 PUT 變數問題,作者來一一描述。
使用 Backbone.js 來取代 jQuery AJAX 方式來跟 REST Server 溝通,當然 Backbone.js 底層還是透過 jQuery AJAX API 來傳遞,首先我們建立一個簡易的 Backbone model
// a simple backbone model
var User = Backbone.Model.extend({
urlRoot: '/user',
defaults:{
'name':'appleboy',
'age': 31
}
});
var user1 = new User();
var user2 = new User();
var user3 = new User();
你可以建立多個使用者,或是搭配 Backbone Collection 來顯示,到這邊是沒有問題,接著要跟伺服器做 GET PUT POST DELETE 的動作,也就是透過底下 Backbone 操作user1.fetch() // get user data user1.save() // create or update user user1.destroy() // delete user這邊就會是問題所在,你會發現 backbone 丟給 REST request 的內容不會是像 jQuery AJAX 包在 parameter 內,而是在
Request Payload 內寫入 {’name’:‘appleboy’, ‘age’: 31},所以我們在 REST Server 會一直存取不到任何資料
class User extends REST_Controller
{
public function index_get()
{
echo $this->get(null);
}
public function index_post()
{
echo $this->post(null);
}
public function index_put()
{
echo $this->put(null);
}
public function index_delete($id)
{
echo $this->put(null);
}
}問題出在 REST_Controller.php 處理 POST 函數/**
* Parse POST
*/
protected function _parse_post()
{
$this->_post_args = $_POST;
$this->request->format and $this->request->body = file_get_contents('php://input');
}只要將上面函數改成/**
* Parse POST
*/
protected function _parse_post()
{
$this->_post_args = $_POST;
$this->request->format and $this->request->body = file_get_contents('php://input');
if (!empty($this->request->body)) {
$this->_post_args = array_merge($_POST, json_decode($this->request->body, true));
}
}這樣 POST 就沒有問題了,接著如果 PUT 或 DELETE 也遇到此問題,就按照上述改相關函式。晚點發 pull request 給作者,只是不知道作者會啥時處理。See also
- CodeIgniter 3.0 Release 終於釋出啦
- CodeIgniter 搭配 Homestead 開發環境
- CodeIgniter 終於找到新東家 British Columbia Institute of Technology 英屬哥倫比亞理工學院
- 實戰 CodeIgniter in 成功大學計算機與網路中心
- 升級 PHP Facebook SDK 到 4.0.x 版本
- Backbone.js 1.1.1 Release 釋出 AMD 版本
- CodeIgniter 初始化 Library 流程
- Javscript 18 歲生日歷史演進
- 將 Backbone Framework 升級到 1.1.0 注意事項
- HAProxy 搭配 CodeIgniter 取使用者真實 IP