将自定义HTTP标头传递给RESTful请求

时间:2012-11-29 13:16:18

标签: php rest backbone.js yii

我正在尝试将Backbone集成到Yii中,因此我需要REST。所以我安装了一个Yii扩展名restfullyii,它使用了需要传递给请求的用户名和密码。问题是我不知道如何用Backbone做到这一点。

想要的请求示例:

List
curl -i -H "Accept: application/json" -H "X_REST_USERNAME: admin@restuser" -H "X_REST_PASSWORD: admin@Access" http://yii-tester.local/api/sample/    
curl -i -H "Accept: application/json" -H "X_REST_USERNAME: admin@restuser" -H "X_REST_PASSWORD: admin@Access" http://yii-tester.local/api/sample/limit/1
curl -i -H "Accept: application/json" -H "X_REST_USERNAME: admin@restuser" -H "X_REST_PASSWORD: admin@Access" http://yii-tester.local/api/sample/limit/10/5 (limit/offeset)

当前的错误响应,完全有意义..:

{
    "success": false,
    "message": "You are not authorized to proform this action.",
    "data": {"errorCode":500}
}

有没有人知道如何在整个Backbone中发送这些值?

1 个答案:

答案 0 :(得分:2)

Backbone将其XHR请求委托给jQuery / Zepto,这就是你必须修改的内容。

最简单的解决方案可能是通过$.ajaxSetupheaders options

提供默认选项
  

标题(已添加1.5)
  默认值:{}

     

要与其一起发送的其他标题键/值对的映射   请求。在调用beforeSend函数之前设置此设置;   因此,标题设置中的任何值都可以覆盖   在beforeSend函数中。

您可以这样设置:

$.ajaxSetup({
    headers:{
        X_REST_USERNAME: "admin@restuser",
        X_REST_PASSWORD: "admin@Access"
    }
});

发送的每个请求都将包含自定义标头。见http://jsfiddle.net/nikoshr/j5Rr4/

或者您可以为每个请求传递其他选项,Backbone会将它们转发给jQuery:

var m = new Backbone.Model();   
m.fetch({
    headers:{
        X_REST_USERNAME: "admin@restuser",
        X_REST_PASSWORD: "admin@Access"
    }
});

http://jsfiddle.net/nikoshr/j5Rr4/2/

最后,您可以覆盖Backbone.sync为每个请求添加标头:

Backbone.realsync = Backbone.sync;
Backbone.sync = function(method, model, options) {
    options || (options = {});
    options.headers = {
        X_REST_USERNAME: "admin@restuser",
        X_REST_PASSWORD: "admin@Access"
    };

    return Backbone.realsync.call(model, method, model, options);
};

var m = new Backbone.Model();
m.fetch();

http://jsfiddle.net/nikoshr/j5Rr4/4/