【问题标题】:Backbone Sync return an empty $_POST arrayBackbone Sync 返回一个空的 $_POST 数组
【发布时间】:2012-07-31 05:54:53
【问题描述】:

我正在尝试使用 Backbone 和 Yii 框架做我的第一个 RESTful 应用程序。 我对 GET 方法没有任何问题,但我现在坚持使用 POST 方法来创建一个新元素。

我在 Backbone 中有一个评论模型:

var commentModel = Backbone.Model.extend({

    urlRoot: "index.php/api/comments",
    idAttribute: 'id',

    defaults: {
        content: "Empty comment",
        status: 1
    }
});

在我看来,我添加了一个函数来创建一个新的评论,传递来自相关表单的值:

on_submit: function(e) {
            var new_comment = new Comment({author_id: this.$('#author_text').val(), content: this.$('#content_text').val(), post_id: this.$("#post_text").val(), status: this.$("#status_text").val()});

         new_comment.save();
        },

用 Firebug 看请求似乎没问题,在 POST 选项卡中我可以看到所有值:

JSON            
author_id "7"   
content "Epic fail"
post_id "7" 
status "2"

Source 
{"content":"Epic fail","status":"2","author_id":"7","post_id":"7"}

但在我的 php Api 中,$_POST 变量是空的!

foreach($_POST as $var=>$value) {

     if($model->hasAttribute($var))
        $model->$var = $value;
     else
        $this->_sendResponse(500);
}

有人有什么想法吗?阅读 Backbone.Sync 的文档,我知道它应该使用 POST 来创建请求。

我找到了一种从以下位置获取值的解决方法:

file_get_contents('php://input') 

但我觉得 id 不合适...

谢谢。

【问题讨论】:

  • $_SERVER['REQUEST_METHOD'] 的值是“POST”,所以值应该在 $_POST 数组中,对吗?
  • 不,方法是POST,但是数据是通过HTTP body发送的。它不会以常规形式发送,将设置参数并将 application/x-www-form-urlencoded 作为 mime 类型。检查此 Fiddle jsfiddle.net/RK7LN 中发送的内容

标签: php javascript rest backbone.js yii


【解决方案1】:

来自Backbone.sync documentation

使用默认实现,当 Backbone.sync 发送请求时 保存模型,它的属性将被传递,序列化为 JSON, 并在 HTTP 正文中发送,内容类型为 application/json。

这意味着您不会像常规形式的帖子那样在参数中接收数据,而是在 HTTP 响应的正文中接收数据。

您有三个选项来处理这种行为:

  1. 修改您的服务器代码以了解 REST 请求,例如,请参阅 Insert Backbone.js model into MySQL database
  2. 看看Backbone.emulateJSON能否满足您的需求
  3. 覆盖 Backbone.sync 并发送数据以更好地适应您的服务器

【讨论】:

  • 好吧,看来我做出了错误的假设。感谢您的澄清,现在我将进行一些测试,看看哪种解决方案更适合我的应用。
猜你喜欢
  • 2015-11-24
  • 2017-07-25
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多