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

San*_*kar 2 angular angular7

我的组件有以下服务:

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

我也有一个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);
      }
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我的 post 调用可能会收到三种类型的响应代码: a200或 a302307200现在,在我得到一切正常的情况下。但是,当我得到302或时307,默认值HttpClient会继续遵循Location响应中的 ,而不是给我控制权。重定向网址是刷新网址,但它需要不同类型的处理(GET而不是POST添加一些额外的参数)。

如果出现像我这样的错误,400我会在 catch 块中正确获取错误Interceptor

有没有办法禁用 HTTP 重定向并在我的代码中处理重定向?

ter*_*rtz 6

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

\n\n
\n

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

\n\n

信息响应(100\xe2\x80\x93199),

\n\n

成功响应(200\xe2\x80\x93299),

\n\n

重定向(300\xe2\x80\x93399),

\n\n

客户端错误(400\xe2\x80\x93499),

\n\n

和服务器错误(500\xe2\x80\x93599)。

\n
\n\n

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

\n\n
\n\n

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

\n\n
\n

原则

\n\n

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

\n
\n\n

不幸的是,当浏览器收到3xx响应时,它们会主动请求Location标头中定义的 URI。因此,您无法拦截响应并对其执行某些操作。

\n\n
\n\n

如果 API 是您自己的,那么您可以更轻松地更改它以返回不同的 HTTP 状态代码。您曾提到 302 返回“刷新网址”。如果您使用 JWT 并且尝试刷新令牌,那么返回400: BAD REQUESTor401: UNAUTHORIZED并让拦截器的错误块处理调用刷新 url 会更容易。

\n\n

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

\n