Angular HttpClient接收并处理302/307响应代码;禁用重定向



我的组件有以下服务:

@Injectable({
providedIn: 'root',
})
export class MyService {
constructor(private httpClient: HttpClient ) { }
}
someFunction() {
this.httpClient.post(url, data, options)
}

我还有一个HttpInterceptor,如下所示:

@Injectable({
providedIn: 'root'
})
export class HttpInterceptorService implements HttpInterceptor {
constructor() {}
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
return next.handle(req).do(
(event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
console.log('############### event status: ', event.status);
}
console.log('########### event is: ', event);
},
(err: any) => {
if (err instanceof HttpErrorResponse) {
console.log('HTTP error status is: ', err.status);
} 
console.log('error is: ', err);
}
);
}
}

现在,我的后呼叫可能会收到三种类型的响应代码,要么是200,要么是302307。现在,在我得到200的情况下,一切都很好。然而,当我得到302307时,默认的HttpClient会继续跟随响应中的Location,而不是给我控制权。重定向url是一个刷新url,但它需要不同类型的处理(GET而不是POST,并添加了一些额外的参数(。

如果出现类似400的错误,我会在Interceptor捕获块中正确地得到错误。

有没有一种方法可以在我的代码中禁用HTTP重定向并处理重定向?

摘自Mozilla文档:HTTP响应状态代码:

HTTP响应状态代码指示特定HTTP请求是否已成功完成。响应分为五类:

信息回复(100–199(,

成功响应(200–299(,

重定向(300–399(,

客户端错误(400–499(,

和服务器错误(500–599(

如您所见,3xxHTTP状态代码是NOT错误,而是重定向。只有4xx5xxHTTP状态代码被视为错误响应。这就是为什么当你的angular应用程序收到4xx响应时,你的拦截器的捕获块正确地处理了它


摘自Mozilla文档:HTTP:中的重定向

原理

在HTTP中,重定向是由服务器通过发送对请求的特殊响应来触发的:重定向。HTTP重定向是状态代码为3xx的响应浏览器在收到重定向响应时,会使用提供的新URL,会立即加载该URL:大多数情况下,重定向对用户来说是透明的,除了会对性能造成小的影响。

不幸的是,当浏览器收到3xx响应时,它们会采取主动并立即请求Location标头中定义的URI。因此,没有一种方法可以让你拦截响应并对其进行处理


如果API是您自己的,那么您只需更改它就可以返回不同的HTTP状态代码。你已经提到302返回一个"刷新url"。如果您正在使用JWT并尝试刷新令牌,那么返回400: BAD REQUEST401: UNAUTHORIZED并让拦截器的错误块句柄调用刷新url会更容易。

如果API是别人的,那么考虑更改Angular应用程序设计/应用程序流以处理重定向响应。

最新更新