Как обрабатывать ошибки HTTP в сервисе API и возвращать ответ через Observable только в случае успеха? - PullRequest
0 голосов
/ 23 мая 2018

В моем приложении Angular2 у меня есть api.service с методом sendRequest , который должен делать следующее:

  1. Отправляет запрос на сервер
  2. Возвращает обещание звонящему (я хочу, чтобы звонящие получали только успешные ответы)
  3. Если произошла ошибка, обработайте ошибку локально (перейдите к пользователю, чтобы войти в систему или показать всплывающее окно)

Я реализовал его с помощью Promise:

sendRequest(method: string, url: string, data: any) : Promise<any> {
    return this.http.request(method, url, {
        body: data,
        headers: {
            'Accept': 'application/json, text/plain, */*',
            'Authorization': 'bearer ' + token,
            'Content-Type': 'application/json;charset=UTF-8'
        }
    }).toPromise().catch((res) => this.handleError(res));
}

handleError(response: any) {
    if (response.status === 401 || response.status === 403) {
        this.tokenService.deleteToken();
        this.router.navigate(['login']);
    }
    // Show popup etc.
    ...
}

Я хотел бы заменить обещание на наблюдаемое:

sendRequest(method: string, url: string, data: any) : Observable<any> {...}

Пожалуйста, посоветуйте, как это сделать.Спасибо.

EDIT 1 : я нашел примеры, которые обрабатывали ответ, а затем передавали некоторый результат наблюдателю.Это не то, что мне нужно.Если возникает ошибка, наблюдатель не должен быть уведомлен вообще.Наблюдатели должны быть уведомлены, только если получен успешный ответ.В случае возникновения ошибки ее следует обработать только внутри api.service .

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

см. Ниже -

sendRequest(method: string, url: string, data: any) : Observable<any>{
    return this.http.request(method, url, {
        body: data,
        headers: {
            'Accept': 'application/json, text/plain, */*',
            'Authorization': 'bearer ' + token,
            'Content-Type': 'application/json;charset=UTF-8'
        }
    }).map( ( res ) => {
      return res || {};
    } )
    .catch( this.handleError );
}



handleError(response: any) {
    if (response.status === 401 || response.status === 403) {
        this.tokenService.deleteToken();
        this.router.navigate(['login']);
    }
    // Show popup etc.
    ...
}
0 голосов
/ 23 мая 2018
sendRequest(method: string, url: string, data: any) : Observable<any> {
    return this.http.request(method, url, {
        body: data,
        headers: {
            'Accept': 'application/json, text/plain, */*',
            'Authorization': 'bearer ' + token,
            'Content-Type': 'application/json;charset=UTF-8'
        }
    }).map((response: Response) => <any>response.json()).catch(this.handleError);
}

handleError(response: any) {
    if (response.status === 401 || response.status === 403) {
        this.tokenService.deleteToken();
        this.router.navigate(['login']);
    }
    // Show popup etc.
    ...
}

//get response like below
  this.yoursevice.sendRequest(resdata)
        .subscribe((resdata) => {}, 
(error) => {
            this.statusMessage =
                'Problem with the service. Please try again after sometime';
            console.error(error);
        }););
0 голосов
/ 23 мая 2018

http.request возвращает Observable по умолчанию, но вы конвертируете его в Promise с .toPromise()

. Просто измените сигнатуру функции, чтобы вернуть Observable<any>, и удалите часть, в которую вы преобразовалиНаблюдаемый за Обещанием (.toPromise().catch((res) => this.handleError(res))).

Вам также понадобится изменить способ прослушивания ответа (у вас, скорее всего, будет then, когда вы вызываете свой метод обслуживания, вам нуженизменить его на subscribe, который по сути является эквивалентной версией для Observables.

См. этот ответ для подробного объяснения того, как правильно перехватывать исключения при использовании Observables.

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