Backbone Send Post数据编码为查询字符串

时间:2012-07-10 15:13:48

标签: rest backbone.js http-post url-encoding

我正在创建一个连接到RESTful后端的骨干应用程序。当我在模型上调用save()时,它将发布数据作为字符串化JSON发送:

{"firstName":"first","lastName":"last","Email":"email@gmail.com"}

但是我的服务器希望它的格式为querystring:

firstName=first&lastName=last&Email=email@gmail.com

有没有办法让骨干以不同的方式发送它?

6 个答案:

答案 0 :(得分:8)

Backbone不提供开箱即用的任何东西。
但很容易根据您的需要覆盖和定制它。

查看源代码: http://documentcloud.github.com/backbone/docs/backbone.html

并查看调用save,它会在后台触发sync来电。

所以你需要的是用自己的方式覆盖Backbone.sync函数。

我会修改以下部分:

if (!options.data && model && (method == 'create' || method == 'update')) {
      params.contentType = 'application/json'; 
      params.data = JSON.stringify(model.toJSON());
}

if (!options.data && model && (method == 'create' || method == 'update')) {
      params.contentType = 'application/json';
      params.data = $.param(model); // <-- CHANGED 
}

注意我正在使用jQuery param

如果您想使用自定义功能,请检查以下问题: Query-string encoding of a Javascript Object

<强> [更新]
无需直接修改。使用您自己的函数'Backbone.sync'更好地覆盖它 检查Backbone存储库的“TODO”示例。它有一个覆盖Backbone.sync函数https://github.com/documentcloud/backbone/tree/master/examples

localStorage.js文件

答案 1 :(得分:2)

我在工作中遇到了这个问题,Backbone.emulateJSON对我来说也不起作用。在一些帮助下,我能够想出这个解决方法。我们覆盖了Backbone.ajax函数并将contentType更改为“application / x-www-form-urlencoded”并使用$ .param来正确序列化数据。

Backbone.ajax = function() {
    if(arguments[0].data && arguments[0].contentType == "application/json"){
        arguments[0].data = $.param(JSON.parse(arguments[0].data));
        arguments[0].contentType = "application/x-www-form-urlencoded";
    }
    return Backbone.$.ajax.apply(Backbone.$, arguments);
}

答案 2 :(得分:0)

也许这可以帮助你,尝试: http://backbonejs.org/#Sync-emulateJSON

答案 3 :(得分:0)

我是通过覆盖模型的同步功能来完成的:

var MyModel = Backbone.Model.extend({ 
    "sync": function(method, model, options) {
        if (method == "update" || method == "create") {
            options = options ? _.clone(options) : {};
            options['data'] = $.param(this['attributes']);
        }
        var arguments = [method, model, options];
        return Backbone.sync.apply(this, arguments);
    }
});

答案 4 :(得分:0)

我找到了解决方案,请参阅:

  1. 我用

    Backbone.emulateJSON = true;

  2. 我写了“更新”案例:

    options.url = "/user/"+Math.random(1, 1000);
    options.type = "POST";
    //.1/2 WORK
    //options.data = (model instanceof Backbone.Model)?model.toJSON():{};
    options.data = model.toJSON();
    break;
    

答案 5 :(得分:0)

Backbone.sync使用jQuery.ajax函数,因此我们可以修改jqXHR或发送给服务器的数据(通过beforeSend)。

var oldSync = Backbone.Model.prototype.sync;
var SomeModel = Backbone.Model.extend({
    url: 'test.json',

    defaults: {
        id: 1,
        foo: 'test'
    },

    sync: function (method, model, options) {
        // options are passed to the jQuery.ajax
        _.extend(options, {
            emulateHTTP: true,
            emulateJSON: false,
            beforeSend: function(xhr, settings) {
                // settings.data is a body of our request.
                if (_.isString(settings.data)) {
                    // settings.data is a JSON-string like '{"id":1, "foo":"test"}'
                    settings.data = Backbone.$.parseJSON(settings.data);
                }

                settings.data = Backbone.$.param(settings.data);
                // settings.data is 'id=1&foo=test'
            }
        });

        oldSync.apply(this, arguments);
    }
});

var model = new SomeModel();
model.save();

实际上我们可以创建一个mixin! :)