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

问题描述 投票:1回答:1

我为我的组件提供以下服务:

@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);
      }
    );
  }
}

[现在,我所拥有的电话会议可以接收三种类型的响应代码,即200302307。现在,在我得到200的情况下,一切正常。但是,当我得到302307时,默认的HttpClient会继续响应Location,而不是给我控制权。重定向URL是刷新URL,但需要其他类型的处理(GET代替POST,并添加了一些额外的参数)。

[如果发生类似400的错误,我可以在Interceptor catch块中正确获得该错误。

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

angular angular7
1个回答
0
投票

来自Mozilla docs: HTTP response status codes

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

信息响应(100–199),

成功答复(200–299),

重定向(300–399),

客户端错误(400–499),

和服务器错误(500–599)。

如您所见,3xx HTTP状态代码是NOT错误,但会重定向。仅4xx5xx HTTP状态代码被视为错误响应。这就是为什么当您的角度应用程序收到4xx响应时,拦截器的catch块会正确处理它的原因。


来自Mozilla docs: Redirections in HTTP

原理

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

[不幸的是,当浏览器收到3xx响应时,他们会主动发起并立即请求Location标头中定义的URI。因此,您没有办法拦截响应并对其进行处理。


如果该API是您自己的,则可以轻松地对其进行更改以返回不同的HTTP状态代码。您已经提到302返回“刷新URL”。如果您正在使用JWT并尝试刷新令牌,则返回400: BAD REQUEST401: UNAUTHORIZED并让拦截器的错误块句柄调用刷新URL会更容易。

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

© www.soinside.com 2019 - 2024. All rights reserved.