Угловой http: HEAD 404 http ответ - PullRequest
1 голос
/ 20 июня 2019

Я закодировал этот метод вызова 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 ]

1 голос
/ 20 июня 2019

Надеюсь, я понял, что тебе нужно. error из метода catchError должен содержать код состояния. Поэтому вы можете справиться с этим правильно.

Я не дал правильный поиск, но я помню, что использовал HttpErrorResponse вместо Response, чтобы получить больше информации относительно ответа HTTP.

Я написал что-то вроде этого несколько месяцев назад:

const onErrorGetDetails = <T>() => catchError<T, boolean>((error: HttpErrorResponse) => {
    if (error.status === 404) {
        return of(false)
    }
    return throwError(error)
0 голосов
/ 20 июня 2019

Для этого вам нужно установить опцию под названием

{observe: 'response'} 

Это позволяет вам прочитать статус ответа на HTTP-вызов. Так что http-вызов будет:

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

А когда вы будете подписываться, просто проверьте статус ошибки, вы можете проверить статус ошибки даже без подписки, просто сделайте это по конвейеру и используйте map или catchError и проверьте Reponse.

Вот пример того, как я реализовал это на валидации 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, отображение ответа означает, что сервер вернет что-то, помните, что мы получим полный ответ, поэтому ответ будет состоять из заголовка, ответа тела, где тело является данные. Но если сервер отключен или я ввожу неверный URL в коде, я улавливаю ошибку, потому что у меня все еще есть ответ, даже без тела.

угловые документы: https://angular.io/guide/http#reading-the-full-response

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...