我为我的组件提供以下服务:
@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
或302
或307
。现在,在我得到200
的情况下,一切正常。但是,当我得到302
或307
时,默认的HttpClient
会继续响应Location
,而不是给我控制权。重定向URL是刷新URL,但需要其他类型的处理(GET
代替POST
,并添加了一些额外的参数)。
[如果发生类似400
的错误,我可以在Interceptor
catch块中正确获得该错误。
有没有一种方法可以禁用HTTP重定向并在我的代码中处理重定向?
来自Mozilla docs: HTTP response status codes:
HTTP响应状态代码指示特定的HTTP请求是否已成功完成。响应分为五类:
信息响应(100–199),
成功答复(200–299),
重定向(300–399),
客户端错误(400–499),
和服务器错误(500–599)。
如您所见,3xx
HTTP状态代码是NOT错误,但会重定向。仅4xx
和5xx
HTTP状态代码被视为错误响应。这就是为什么当您的角度应用程序收到4xx
响应时,拦截器的catch块会正确处理它的原因。
来自Mozilla docs: Redirections in HTTP:
原理
在HTTP中,服务器通过向请求发送特殊响应来触发重定向:重定向。 HTTP重定向是状态代码为3xx的响应。 浏览器在收到重定向响应时,使用提供的新URL并立即加载它:在大多数情况下,重定向对用户是透明的,除了对性能的影响不大。
[不幸的是,当浏览器收到3xx
响应时,他们会主动发起并立即请求Location
标头中定义的URI。因此,您没有办法拦截响应并对其进行处理。
如果该API是您自己的,则可以轻松地对其进行更改以返回不同的HTTP状态代码。您已经提到302返回“刷新URL”。如果您正在使用JWT并尝试刷新令牌,则返回400: BAD REQUEST
或401: UNAUTHORIZED
并让拦截器的错误块句柄调用刷新URL会更容易。
如果该API是其他人的API,请考虑更改Angular应用程序设计/应用程序流程以处理重定向响应。