Получить полный http ответ в случае ошибки - PullRequest
0 голосов
/ 24 января 2019

В угловой документации они указали, что вы должны указать observe: "response" в предоставленных опциях, чтобы получить полный http-ответ, который я сделал здесь:

constructor(private service: new () => T,
  private http: HttpClient,
  private httpErrorHandler: HttpErrorHandlerService,
){ 
    this._handleError = this.httpErrorHandler.createHandleError(this.service.name);
}
private _handleError: HandleError;
//...other code
delete(resourceNameOrId: number | string): Observable<HttpErrorResponse>{
    return this.http.delete<T>(this._url + resourceNameOrId, {
      observe: "response"
    }).pipe(
      catchError(this._handleError(`delete`, null))
    );
  }

Функция handleError определена в этой службе:

export type HandleError = <T> (operation?: string, result?: T) => (error: HttpErrorResponse) => Observable<T>;

@Injectable({
  providedIn: 'root'
})
export class HttpErrorHandlerService {

  constructor(private errorService: ErrorService, private modalService: NzModalService) { }

  createHandleError = (serviceName = '') => <T> (operation = 'operation', result = {} as T) => this.handleError(serviceName, operation, result);

  handleError<T> (serviceName = '', operation = 'operation', result = {} as T ){
    return (error: HttpErrorResponse): Observable<T> => {
      const message = (error.error instanceof ErrorEvent) ? error.error.message: `{error code: ${error.status}, body: "${error.message}"}`;
      this.errorService.errorMessage = `${serviceName} -> ${operation} failed.\n Message: ${message}`;
      console.error(this.errorService.errorMessage);
      return of(result);
    }
  }
}

И это пример того, как я вызываю функцию удаления службы в компоненте:

this.service.delete(nom).subscribe(data => {
  if(!this.errorService.errorMessage){
    this.notificationService.success("Suppression", "L'enregistrement a été supprimée !");
  }
});

Но указание observe: "response" не сработало в моем случае, а error: HttpErrorResponse возвращает только сообщение об ошибке, а не полный ответ:

enter image description here

Я пробовал решения в этой теме: Angular 4.3.3 HttpClient: Как получить значение из заголовка ответа? , который не работал для меня, и предоставленное решение заключалось в определении наблюдения опция.

Как мне это решить?

Обновление:

Параметр наблюдений работает только тогда, когда HTTP-запрос на удаление возвращает код 200, как показано на снимке экрана ниже, но при наличии статуса ответа 404 объект ответа в этом случае равен нулю, а в функции handleError тело ответа равно единственное, к чему я могу получить доступ.

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Подходит ли вам перехватить хук HttpClient через Interceptor?Попробуйте что-то вроде этого: Создайте перехватчик:

@Injectable()
export class FinalInterceptor implements HttpInterceptor {

constructor(private errorHandlerService: HttpErrorHandlerService) {}

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      return next.handle(req).pipe(
        tap((event: HttpEvent<any>) => {
            if (event instanceof  HttpErrorResponse) {
              this.errorHandlerService.handleError(event);
            }
        }));
  }
}

AppModule:

providers: [
    ...
    { provide: HTTP_INTERCEPTORS, useClass: FinalInterceptor, multi: true },
  ],

, поэтому в моем сервисе обработчика ошибок http у меня есть next console.log.

Полагаю, это именно то, что вы ищете

0 голосов
/ 29 января 2019

Если вы хотите, чтобы объект HttpErrorResponse был внутри вашего catchError, попробуйте получить его внутри блока после завершения вызова API, что-то вроде этого:

delete(resourceNameOrId: number | string): Observable<HttpErrorResponse>{
    return this.http.delete<T>(this._url + resourceNameOrId)
 .pipe(
      catchError((error:any)=>{
           console.log(error);//error is the HttpErrorResponse object returned
           return this._handleError(`delete`, null)
      })
    );
  }
...