我正在研究Angular拦截器。在拦截器中,我需要在发送任何非GET请求之前,发送GET请求以从服务器获取标头并在所有请求上设置该标头。有办法吗?下面是我的伪代码:
public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return this.sendRequest(request, next);
}
private sendRequest(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.httpClient.get('/my/end/point', { observe: "response" })
.subscribe(res => {
const header = res.headers.get('SOME_HEADER');
//set the header on request and send it
//first send request
return this.processRequest(request, next);
});
// second process request
return this.processRequest(request, next);
}
我所看到和期望的是,处理过程流经订阅者,然后由于尚未返回,因此转到第二个处理请求语句。有什么办法可以阻止所有后续的http请求,直到可观察到的返回?
最佳答案
您想通过什么操作来阻止请求?
这就是拦截器的外观:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return yourObservable.pipe(
concatMap(someData => next.handle(request)),
);
}
我在stackblitz上创建了一个示例,但您必须更加精确地了解如何停止请求以及如何启动请求
我希望我能正确理解
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (request.method === 'GET') {
return next.handle(request);
}
return yourGetRequest.pipe(
switchMap(response => {
// add what you need from the response
const newRequest = request.clone({ setHeaders: { ...response } });
return next.handle(newRequest);
}),
);
}