我使用此代码将用户的访问令牌注入到每个请求中:
$injector.get('$http').defaults.transformRequest = function(data, headersGetter) {
if ($rootScope.auth.accessToken) {
headersGetter()['access_token'] = $rootScope.auth.accessToken;
return angular.toJson(data);
} else {
return angular.toJson(data);
}
};
我的一个请求发送了一个文件,因此我必须先使用transformRequest
修改服务中的请求(我假设)access_token
转换,以确保Angular的默认transformRequest
不会序列化FormData
。 Content-Type
为undefined
,以便Angular填充正确的边界。有关此功能的更多信息,请参见here。
this.upload = function(file) {
var fd = new FormData();
fd.append('contacts', file);
return $http.post(baseUrl + '/contacts/uploads', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
});
};
问题是当请求在服务(直接在上面)中转换时,access_token
永远不会在请求离开之前由第二个转换(第一个代码块)添加该应用程序,意味着我对API的请求未经授权。我知道情况就是这样,因为如果我手动添加access_token
,它就会起作用,如下所示:
this.upload = function(file) {
var fd = new FormData();
fd.append('contacts', file);
return $http.post(baseUrl + '/contacts/uploads', fd, {
transformRequest: angular.identity,
headers: {'access_token': $rootScope.auth.accessToken, 'Content-Type': undefined}
});
};
如何在第一次转换后以编程方式使用转换添加access_token
?为什么在第一次之后可以再次转换请求?