Angularjs:使用$ resource传递令牌?

时间:2013-06-21 13:03:24

标签: angularjs angularjs-service

我正在尝试使用带有$ resource请求的标头传递令牌。通常你可以做以下

  $http.defaults.headers.common
<。>在.config中,但是当应用程序第一次引导时我没有意识到这些,所以我想我会做以下...但它目前没有通过我的标题..

目前令牌是硬编码的,但一旦我确认它正常工作,那么它将来自一个持有令牌的注入服务。

    var resource = $resource('http://localhost:port/todos/:id', {
        port:":3001",
        id:'@id'
    }, {
        get: {
            method: "GET",
            headers: {
                "Accept": "application/stuffs;version=3",
                "Authorization": "Token token='xxxxxxxxx '"
            }
        },
        update: {method: 'PUT'}
    });

    return resource;

如果我检查fiddler,我在请求中看不到接受或授权标题。

我确实在fiddler中看到了这条消息,但没有我期待的标题。

我在这里错过了什么吗?

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:2)

首先,您的客户端代码没有任何问题。如果您没有进行跨源请求(CORS - xhr请求到不同于主机/端口的主机/端口请求),它应该可以正常工作。以下是一个包​​含代码的非CORS plkr示例 - 您可以验证是否已发送自定义标头:http://plnkr.co/edit/cEBGjvYBpXv1q1D323IL?p=preview

如果您必须执行跨源请求,则必须确保您使用的浏览器都支持CORS(IE&gt; = 10,最新的Chrome或Firefox)并且您的服务器代码正确响应CORS预检OPTION请求。这篇文章解释得非常好:http://www.html5rocks.com/en/tutorials/cors/

我创建了另一个plnkr示例并通过设置响应以下内容的服务器(http://plnkr.co/edit/zJVhqJVSnApXGzGGxcN9?p=preview)来实现此功能

首先 - 预检OPTION请求

Request URL:http://localhost:8080/todos 
Request Method:OPTIONS

服务器响应

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT
Access-Control-Allow-Headers: Authorization
Content-Length: 0

接下来的“真实”请求

Request URL:http://localhost:8080/todos
Request Method:GET

响应(请注意access-control-allow标题也在这里):

HTTP/1.1 200 OK
Content-Type: application/x-json; charset=UTF-8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT
Access-Control-Allow-Headers: Authorization
Content-Length: 13

回复机构:

{"test":"OK"}

答案 1 :(得分:1)

我通过浏览GitHub上的Angular代码来研究这个问题。我发现,从Angular 1.1.2开始,您可以完全按照问题中的方式指定标题。您不能在1.1.2之前的任何版本中指定标题。

正如rGil建议的那样,请确保您使用的是最新版本的ngResource。将Angular升级到1.1.5非常容易,但不能升级ngResource。事实上,我使用ngResource完成了同样的事情。

如果您想100%确定,请在ngResource中查找以下代码(假设您有未经授权的代码)。此代码循环传递到您的操作中的每个属性(示例中的方法和标头),并将它们复制到对象(httpConfig)中。然后将httpConfig传递给$ http。

      forEach(action, function(value, key) {
        if (key != 'params' && key != 'isArray' ) {
          httpConfig[key] = copy(value);
        }
      });

如果你错过了这个循环,你就有了旧版本的ngResource。