在Backbone中添加自定义HTTP头

8
我将使用Tastypie创建一个API,并希望从Backbone访问该API。为了发送凭据,我使用用户ID和API密钥。在Android中和使用curl时这个方法非常有效,但是我无法从Backbone设置HTTP标头。
在curl中,我使用:
 curl --dump-header - -H "Accept: application/json" -H "Content-Type: application/json" -H "user_id: 32" -H "api_key: 69950" -X DELETE "http://127.0.0.1:8000/api/v1/deletenote/66/?format=json" 

在 Android Java 中,我使用:

    HttpDelete requestDELETE = new HttpDelete();
    requestDELETE.setHeader("Content-type", "application/json");
    requestDELETE.setHeader("Accept", "application/json");
    requestDELETE.setHeader(Constants.HEADER_USER_ID, user_id);
    requestDELETE.addHeader(Constants.HEADER_API_KEY, key);

这两种方法都很好,但是当我尝试在Backbone中使用时,按照页面上其他帖子的响应尝试后,它却无法工作。

我正在尝试这样做:

var removeNote = new DeleteNoteModel({id:this.model.toJSON().id},{ query:this.model.toJSON().id});


removeNote.destroy({ 
        headers: {'user_id':dataWeb.get("id"),'api_key':dataWeb.get("api_key")}
        },{
                    async:false,
                    error: function(model, response){
                        console.log("KO_REMOVE_NOTE");
                        console.log(response);
                    },
                     success : function(model, response){
                        console.log("OK_REMOVE_NOTE");
                        console.log(response);
                     }
                }
    );

当我调用destroy方法时,我在请求头中添加了header,但是服务器并没有接收到任何内容。

我做错了什么?

感谢大家。

2个回答

19

Tallmaris的回答应该会为您解决问题,尽管我建议您使用jQuery的ajaxSetup方法来设置标头作为所有 Ajax 请求的默认值,因为我相信您始终需要它们,对吗?

在启动应用程序的某个位置放入

$.ajaxSetup({
    headers: {
        'user_id':dataWeb.get("id"),
        'api_key':dataWeb.get("api_key")
    }
});

感谢这样做,您将节省很多重复的代码 :) 保持DRY!

(显然,您需要确保dataWeb在启动应用程序的范围内可用 :))


谢谢!它起作用了!我终于可以删除备注了!Ajax参数正确放置了头部信息。在backbone方法中放置头部信息对我没有用。 - Juanma Jurado
我的头部似乎无法被识别或发送到服务器。我应该在哪里设置它? - jahrichie
这里使用jQuery ajaxSetup来全局修改使用jquery发出的所有请求(Backbone在内部使用它们),最好将其放置在设置和运行应用程序的某个位置。 - Tom Tu

3

看起来你正在将两个参数传递给destroy,只需传递一个包含标题和其他选项的参数,除非方括号顺序有误。尝试这样做:

removeNote.destroy({ 
    headers: {
        'user_id':dataWeb.get("id"),
        'api_key':dataWeb.get("api_key")
    }, // there was an extra close-open curly here...
    async:false,
    error: function(model, response){
        console.log("KO_REMOVE_NOTE");
        console.log(response);
    },
    success : function(model, response){
        console.log("OK_REMOVE_NOTE");
        console.log(response);
    }
});

使用Ajax参数对我来说很好用。我尝试过这个,但这不是问题所在。谢谢你的回答。 - Juanma Jurado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接