我正在响应中从服务器发送自定义标头.在$http响应拦截器中我想得到这个标题,但我能得到的唯一标题是Content-type标题.我该如何解决我的问题?
我的$http拦截器:
response: function (response) {
var AuthToken = response.headers('AuthToken');
return response || $q.when(response);
},
Run Code Online (Sandbox Code Playgroud)
AuthToken 未定义.
我想知道如何在没有正文的情况下发送HTTP post请求(特别是在Angular中).这就是我现在正在做的事情,但我收到了错误Expected 2-3 arguments, but got 1).
我意识到第二个参数是针对正文的,但我并没有将它发送到服务器(是的,我知道POST调用改变了系统的状态并且已经查看了这个问题).
postRequest(id) {
this.http.post('/api?data=' + id).map(
(response) => {
return response;
}
)
}
Run Code Online (Sandbox Code Playgroud) 我从服务器上获得了很好的JSON数据,但是当尝试使用ng-repeat指令在我的页面上列出它时会出现问题.
这是我的HTML正文内容,只要$ http.get()方法接收到请求的数据,'mydata'(JSON数组)就会正确显示,但ng-repeat没有列出数组元素:
<body ng-app="myapp">
<div ng-controller="MyController" >
Data from server: {{ mydata }}
</div>
<hr>
<ul ng-controller="MyController as controller">
<li ng-repeat="data in controller.mydata">
{{ data }}
</li>
</ul>
</body>
Run Code Online (Sandbox Code Playgroud)
这是Javascript代码:
var URI = 'http://my_service_uri/';
angular.module("myapp", [])
.controller("MyController", function($scope, $http) {
$scope.mydata = [];
$http.get(URI)
.then(function(result) {
$scope.mydata = result.data;
});
});
Run Code Online (Sandbox Code Playgroud) Authentication:76efbc0946773b62c93e952b502a47acd898200f6f80dc46ac87ffc501c00780当我用检查器检查请求时,我的http响应包含头部身份验证(如此处所述:),但是调用headers("Authentication")返回null
return $http({
method: "GET",
url: url,
headers: {
'Content-Type': "application/json"
}
}).success(function (data, status, headers, config) {
console.log(headers("Authentication"));
})
Run Code Online (Sandbox Code Playgroud)
你对我的做法有什么看法吗?
仅供参考,我已经尝试将其切换回"承诺"方式,.then问题仍然存在.
我发现了一个可能相关的问题,需要在这里提出一个新问题
这是一个奇怪的问题.我在2年的时间里一直使用角度,从来没有遇到过这个问题.
我正在使用angular v1.5.0.我正在发布这样的帖子请求:
$http({
method: "POST",
url: "/myurl",
data: {
file: myFile // This is just an object
}
});
Run Code Online (Sandbox Code Playgroud)
普通的POST请求对吗?得到这个.我查看控制台,"网络"选项卡将请求记录为GET.离奇.所以我已经开始像这样工作:
$http.post("/myurl", {file: myFile});
Run Code Online (Sandbox Code Playgroud)
一样.单步执行$http服务代码后,我确信正在正确设置标头.有没有其他人遇到这个问题?
考虑到德国人的建议,我尝试使用该$resource服务:
promise = $resource("/upload").save()
Run Code Online (Sandbox Code Playgroud)
(由于其他原因,这会返回错误,它仍然可以正确执行POST).我遇到了同样的问题:请求在控制台中记录为GET.
以下是请求到达我的服务器时的标头:
GET /myurl/ HTTP/1.1
Host: localhost:8001
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cache-Control: no-cache
Connection: keep-alive
Pragma: no-cache
Referer: http://localhost:8001/myurl/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
Run Code Online (Sandbox Code Playgroud)

我正在尝试访问标题'错误详细信息',您可以在浏览器网络检查器(上面的链接)中看到,标头返回.服务器方面我还将自定义标头添加到"Access-Control-Expose-Headers"以允许跨域请求,因为这被建议是对其他问题的修复.
以下是对服务器的请求以及成功/错误回调.
this.signon = function (request, onComplete, onError) {
console.log("Calling server with 'login' request...");
return $http.post("http://localhost:8080/markit-war/services/rest/UserService/login/", request)
.then(onComplete, onError);
};
var onLookupComplete = function(response) {
if (response.data.username)
{
//If user is returned, redirect to the dashboard.
$location.path('/dashboard');
}
$scope.username = response.data.username;
};
var onError = function(response) {
$scope.error = "Ooops, something went wrong..";
console.log('error-detail: ' + response.headers('error-detail'));
};
Run Code Online (Sandbox Code Playgroud)
当我尝试访问响应头时,如下所示:
console.log(response.headers());
console.log('error-detail: ' + response.headers('error-detail'));
Run Code Online (Sandbox Code Playgroud)
这只输出:content-type:"application/json"error-detail:null
有没有理由将错误详细信息标头映射到响应对象?
我是angular2的新手.我的服务器(spring)在其响应头中使用set-cookie值响应身份验证.
如何将cookie设置为下一个API调用的请求标头?
我搜索了很多,但我找不到合适的解决方案.
最近我一直在使用Angular HttpClient拦截器.
我添加了与某些HTTP GET方法相对应的标头,对于某些我不需要这些标头.
如何告诉我的拦截器有条件地将拦截器添加到那些方法?我甚至可以拆分服务,例如一个服务用于标头,一个服务没有标题,一个用于不同的标题,一个用于不同的标题.
NgModule提供商
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true,
},{
provide: HTTP_INTERCEPTORS,
useClass: AngularInterceptor,
multi: true,
}
Run Code Online (Sandbox Code Playgroud)
MyInterceptors
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authReq = req.clone({headers: req.headers.set('X-Auth-Token', "-------------------------")});
return next.handle(authReq);
}
}
@Injectable()
export class AngularInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).do(event => {}, err => {
if(err instanceof HttpErrorResponse){
console.log("Error Caught By Interceptor");
//Observable.throw(err);
}
});
}
}
Run Code Online (Sandbox Code Playgroud) angular-http angular-http-interceptors angular angular-httpclient
我需要帮助处理我的角度应用程序中的过期令牌.我的api有过期的时间但我的问题是当我忘记退出我的角度应用程序,一段时间后,我仍然可以访问主页但没有数据.我能做些什么吗?是否有可以处理此问题的库?或者有什么我可以安装?更好,如果我没有安装任何东西.这是我的身份验证码?我可以添加任何可以处理过期的内容吗?如果过期,我将无法访问该主页.
auth.service.ts
export class AuthService {
private loggedIn = false;
constructor(private httpClient: HttpClient) {
}
signinUser(email: string, password: string) {
const headers = new HttpHeaders()
.set('Content-Type', 'application/json');
return this.httpClient
.post(
'http://sample.com/login',
JSON.stringify({ email, password }),
{ headers: headers }
)
.map(
(response: any) => {
localStorage.setItem('auth_token', response.token);
this.loggedIn = true;
return response;
});
}
isLoggedIn() {
if (localStorage.getItem('auth_token')) {
return this.loggedIn = true;
}
}
logout() {
localStorage.removeItem('auth_token');
this.loggedIn = false;
}
}
Run Code Online (Sandbox Code Playgroud)
authguard.ts
@Injectable()
export class AuthGuard implements CanActivate …Run Code Online (Sandbox Code Playgroud) 我已经在angular中定义了一个自定义http服务,如下所示:
angular.module('myApp')
.factory('myhttpserv', function ($http) {
var url = "http://my.ip.address/"
var http = {
async: function (webService) {
var promise = $http.get(url + webService, { cache: true }).then(function (response) {
return response.data;
});
return promise;
}
};
return http;
});
Run Code Online (Sandbox Code Playgroud)
我可以在我的控制器中访问此服务,如下所示:
angular.module('myApp')
.controller('myCtrl', function (myhttpserv) {
var webService = 'getUser?u=3'
myhttpserv.async(webService).then(function (data) {
console.log(data);
})
});
Run Code Online (Sandbox Code Playgroud)
但是,我现在需要简化此过程,以便使用静态URL将其全部包含在服务中,并且它只返回数据.所以我可以在控制器中调用它,如下所示:
angular.module('myApp')
.controller('myCtrl', function ($scope, myhttpserv) {
console.log(myhttpserv.var1);
console.log(myhttpserv.var2);
etc...
});
Run Code Online (Sandbox Code Playgroud)
我似乎无法调整服务以获得此功能.有人知道正确的方法吗?
angular-http ×10
angularjs ×6
angular ×4
javascript ×3
http ×2
typescript ×2
access-token ×1
go ×1
http-headers ×1
rest ×1
token ×1