我正在研究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);
      }),
    );
  }

09-30 14:52
查看更多