【问题标题】:Broadcast headers to all resources after calling another one resource在调用另一个资源后向所有资源广播标头
【发布时间】:2017-01-11 09:30:04
【问题描述】:

我构建了一个 rest api,现在是时候用 angular 处理数据了。为此,我构建了一个服务来连接我的资源。

所以我有:

angular.module("myServiceRest", ['ngResource'])

.factory("myService",  function ($rootScope, $resource) {



    var apiData = $resource(
        "/api", {},
        {
            "getContains": {method: 'GET', isArray: false, url: "/api/users/:userid/:yearid/:groupeid/:levelid", headers: $rootScope.headers},
            "getContain": {method: 'GET', isArray: false, url: "/api/Contains/:containid", headers: $rootScope.headers},

            "postAuthTokens": {method: 'POST', url: "/api/auth-tokens"}

        });

    return {
        getGroupesContenus: function (user_id, year_id, groupe_id, level_id) {
            return apiData.getContains({userid: user_id, yearid: year_id, groupeid: groupe_id, levelid: level_id});
        },
        getContain: function (contain_id) {
            return apiData.getContain({containid: contain_id});
        },

        postAuthTokens: function(userData) {
            apiData.postAuthTokens(userData, function (data) {
                console.log("success !");
                $rootScope.headers = {
                    "Content-Type": "application/json",
                    "Authorization": "Basic ZWRnYXJrYW1kZW06TkVXVE9O",
                    "Accept": "application/json",
                    "X-Auth-Token": data.value
                };
            }, function (error) {
                console.log(error.data);
            })

        }
    }
});

这里我有 3 个资源:

  • getContains: /api/users/:userid/:yearid/:groupeid/:levelid
  • getContain: /api/Contains/:containid
  • postAuthTokens: /api/auth-tokens

要访问getContains和getContain(登录后),用户需要设置一个通过postAuthTokens检索到的令牌(X-Auth-Token)。

基本上,当用户登录时,他调用 POST 资源 postAuthTokens,并通过 data.value 检索他的令牌(存储在数据库中),并且必须在 X-Auth-Token 中设置该令牌才能继续。

为此,我创建了一个 $rootScope,并在用户登录后立即设置:

$rootScope.headers = {
                "Content-Type": "application/json",
                "Authorization": "Basic ZWRnYXJrYW1kZW06TkVXVE9O",
                "Accept": "application/json",
                "X-Auth-Token": data.value //Set the user token
            };

但它根本不起作用。就像 $rootScope.headers 在调用 post Auth Tokens 后重新初始化一样,因为当用户登录后,我在 Chrome 控制台中收到此错误:

angular.js:14328 Possibly unhandled rejection: {"data":{"error":{"code":500,"message":"Internal Server Error","exception":[{"message":"X-Auth-Token header is required","class":"Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException","trace":...

我的 $rootScope.headers 根本没有设置。

那么如何在调用 postAuthTokens 后将我的 $rootScope.headers 广播到所有资源头?

【问题讨论】:

    标签: angularjs rest http-headers ngresource angularjs-rootscope


    【解决方案1】:

    不要将标头添加到根范围,而是将它们添加到$http 服务:

    $http.defaults.headers.common['X-Auth-Token'] = data.value

    然后它们应该被自动添加到所有后续的 HTTP 请求中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2019-10-02
      相关资源
      最近更新 更多