Angular http:HEAD 404 http响应

时间:2019-06-20 10:20:49

标签: angular typescript rxjs

我已经将此http调用方法进行了编码:

public exists(id: string): Observable<boolean> {
    const buildURL = () => map((userId: string) => this.buildIdURL(userId));
    const buildResponse = () => map(() => true);
    const onErrorGetDetails = <T>() => catchError<T, boolean>((error: Response) => this.handleError(error));
    const makeRequest = () => switchMap((url: string) => this.authHttp.head(url));

    return Observable.of(id)
        .pipe(
            buildURL(),
            makeRequest(),
            buildResponse(),
            onErrorGetDetails()
        );
}

因此,我正在尝试处理以下响应:

  1. 一个404,我需要返回一个Observable.of(false)
  2. 否则,返回Observable.throw(error)

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我希望我已经了解您的需求。您从error方法获得的catchError应该包含状态代码。因此,您可以正确处理它。

我没有进行适当的搜索,但是我记得使用HttpErrorResponse而不是Response来获取有关HTTP响应的更多信息。

几个月前,我写了类似的东西:

const onErrorGetDetails = <T>() => catchError<T, boolean>((error: HttpErrorResponse) => {
    if (error.status === 404) {
        return of(false)
    }
    return throwError(error)

答案 1 :(得分:0)

要完成此操作,您需要设置一个名为

的选项
{observe: 'response'} 

这使您可以读取http呼叫的响应状态。 因此,http调用将是:

  makeCall(): Observable<any> {
        return this.http.get('uri', {observe: 'response'});
      } 

当您要订阅时,只需检查错误状态,即使不进行订阅,也可以检查错误状态,只需管道并使用map或catchError并检查响应。

这是我如何在jwt验证中实现此示例:

return this.auth.validateJwt().pipe(
        map( (response) => {
          if (response.status === 200) {
            return true;
          }
        }),
        catchError((err: Response) => {
          this.handleError('authentication');
          if (err.status === 200) {
            return of(true);
          }

          return of(false);
        }),
        first()
      ); 

我映射响应错误以查看代码是否为200,映射响应意味着服务器将返回某些内容,请记住我们将收到完整的响应,因此响应将由标头,正文响应组成,其中body是数据。但是,如果服务器处于脱机状态,或者我在代码上键入错误的url,则会捕获该错误,因为即使没有主体,我仍然会有响应。

角度文档:https://angular.io/guide/http#reading-the-full-response