Backbone发送请求有效负载而不是FormData

时间:2014-06-19 08:08:01

标签: javascript jquery http rest backbone.js

我正在尝试使用骨干集合的创建方法将一些数据发布到服务器:

this.collection.create(modelData,
{
wait:true,
contentType:"application/x-www-form-urlencoded"
});

此处模型数据包含格式良好的JSON对象。问题是邮件请求总是被取消。发送的数据采用requestpayload的形式。

使用一些REST客户端 我可以轻松发布,因为它使用formData而不是requestPayload发送数据。

任何参赛者?

修改

这是我在网络控制台中获得的:

Request URL:http://myendpointurlhere.com/
Request Headers CAUTION: Provisional headers are shown.
Accept:application/json, text/javascript, */*; q=0.01
Cache-Control:no-cache
Content-Type:application/x-www-form-urlencoded
Origin:http://localhost:8888
Pragma:no-cache
Referer:http://localhost:8888/case/12345
User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Form Dataview sourceview URL encoded
model:{"startDate":"19/5/2014","acute":"true","terminal":"true","comment":"","name":"Hypothyroidism","caseId":"4872585904914432"}

编辑2

出于某种原因,这对我有用。让我知道你对此的看法:

this.collection.create({},
{
  data:modelData,
  wait:true,
  emulateJSON:true
});

2 个答案:

答案 0 :(得分:1)

如果您需要以formData形式发送请求,则应在您的请求中使用emulateJSON:true选项。 From the docs:

  

如果您正在使用无法处理编码为application / json的请求的旧版Web服务器,请设置Backbone.emulateJSON = true;将导致JSON在模型参数下被序列化,并且使用application / x-www-form-urlencoded MIME类型进行请求,就好像来自HTML表单一样。

this.collection.create(modelData,
{
    wait:true,
    emulateJSON:true
});

或者,如果您的所有请求都需要使用emulateJSON,则可以使用Backbone.emulateJSON=true;

全局设置

更新

如果您确实需要将FormData对象发送到服务器,则需要修改模型/集合的同步,以便在将其发送到服务器之前自行生成。这是你可以尝试的东西(未经测试):

var YourModel = Backbone.Model.extend({
    sync: function(method, model, options){
        options = options || {};
        var formData = new FormData();

        var json = model.toJSON();
        _.each(json, function(value, key){
             formData.append(key, value);
        });     

        options.data = formData;
        options.emulateJSON = true; // Important because your sending formdata
        return Backbone.Model.prototype.sync.call(this, method, model, options);           
    }
});

http://mrjoelkemp.com/2013/09/backbone-js-model-save-without-the-emulatejson-model-attribute/提供了一个很好的例子。

答案 1 :(得分:0)

是的,如果您希望FormDatadata而不是{$.ajax向您发送数据,则必须手动创建自己的FormData商店并将其发送为Request payload {1}}。

你可以这样做:

var formData = new FormData();

for ( key in modelData ) {
    data.append(key, modelData[key]);  
}

this.collection.create(modelData, {
    wait:true,
    data: formData,
    processData: false
});

您可以查看JsBin demo here只需打开开发人员工具,看看您在请求的FormData中是否拥有所需内容。