我试图拦截来自intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (!request.url.startsWith('/api')) {
return next.handle(request)
}
const cloned = request.clone()
return next.handle(request)
.pipe(
catchError((error: any) => {
if (error.status !== 401) {
return throwError(error)
}
return from(this.sessionService.refresh())
.pipe(map(() => next.handle(cloned)))
})
)
}
的响应,如果它们是401,则捕获它们,执行刷新会话操作,然后再次尝试原始的HTTP调用(此外,如果再次遇到401s,则阻止其无限循环)< / p>
我想在下面的代码中执行的操作是使用http处理程序触发请求,订阅其事件,如果它在401上失败,则刷新然后返回可观察到的由处理程序操作的克隆请求。 / p>
{{1}}
关于如何实现自己想要达到的目标的任何建议?
答案 0 :(得分:0)
这可能是语法上的一些错误,因为我是通过手机编写的,但这应该可以帮助您入门
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (!request.url.startsWith('/api')) {
return next.handle(request)
}
const cloned = request.clone()
return next.handle(request)
.do((event: HttpEvent<any>) =>
return from(this.sessionService.refresh())
.pipe(map(() => next.handle(cloned)))
}), (err: any) => {
if (err instanceof HttpResponse) {
if(err.status === 401){
return throwError(error);
}
}
)
}
答案 1 :(得分:0)
答案是使用switctMap
而不是map
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
{
if (!request.url.startsWith('/api')) {
return next.handle(request)
}
const cloned = request.clone()
return next.handle(request)
.pipe(
catchError((error: any) => {
if (error.status !== 401) {
return throwError(error)
}
return from(this.sessionService.refresh())
.pipe(switchMap(() => next.handle(cloned)))
})
)
}
但是,我选择了一种替代方法,即在请求发生之前检查是否有会话,并在需要时注入刷新操作。
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (
!request.url.startsWith('/api') ||
this.sessionService.isValid
) {
return next.handle(request)
}
return from(this.sessionService.refresh())
.pipe(switchMap(() => next.handle(request)))
}