我正在尝试使用带有$ 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中看到了这条消息,但没有我期待的标题。
我在这里错过了什么吗?
有什么想法吗?
由于
答案 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。