【问题标题】:Pass custom HTTP headers to RESTful requests将自定义 HTTP 标头传递给 RESTful 请求
【发布时间】:2012-11-17 13:55:32
【问题描述】:

我正在尝试将 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 中发送这些值?

【问题讨论】:

    标签: php rest backbone.js yii


    【解决方案1】:

    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/

    【讨论】:

    • 第一个选项不起作用,不会添加任何标题,但这是一个很好的努力。第二个选项不适用于我,因为我正在获取集合而不是保存模型。你对此也有什么建议吗?
    • @SjaakRusma 使用 fetch 进行了修改,但这与 $.ajaxSetup 完全相同:向请求添加自定义标头。用控制台检查小提琴,你应该会看到那些额外的标题。
    • Ajaxoptions 不起作用,将第二个编辑选项添加到 m.fetch({ .. });其中 m 是集合,工作!谢谢!
    • @SjaakRusma 添加了第三个提供全局修改的解决方案
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2014-08-08
    • 2015-09-08
    • 2020-07-17
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多