【问题标题】:Backbone sends request payload instead of FormDataBackbone 发送请求有效负载而不是 FormData
【发布时间】:2014-06-19 08:08:00
【问题描述】:

我正在尝试使用骨干集合的 create 方法将一些数据发布到服务器,如下所示:

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
});

【问题讨论】:

    标签: javascript jquery http rest backbone.js


    【解决方案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/ 提供了一个很好的例子来说明这是如何工作的。

    【讨论】:

    • 请查看我的第二次编辑并提供您的评论。
    【解决方案2】:

    是的,如果您希望 $.ajaxFormData 而不是 Request payload 的形式向您发送数据,您必须手动创建自己的 FormData 存储并将其发送为 data

    你可以这样做:

    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 中查看您需要的内容。

    【讨论】:

    • 请查看我的第二次编辑并提供您的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多