Задать вопрос
@beta-it

Парсинг результата в Angular 5+, как правильно?

Всем доброго дня.
От сервера приходят данные но обернутые в собственный формат ответа:
{
  success: boolean; // статус выполнения запроса
  data: any | null; //здесь может вернуться любой объект/массив объектов/null/пустые объект или массив
  msg: string | null; // текст ошибки либо null в случае успеха
}


Т.е. все данные приходят в data...

Как поступаю сейчас:
Сделал интерфейс:
export interface IResponse<T> {
  success: boolean;
  data: T | null;
  msg: string | null;
}


И сделал функцию обработчик:
getDataResponse<T>(response: IResponse<T>) {
    if (response && response.data) {
      return response.data;
    } else {
      return null;
    }
  }


Ну и собственно в провайдерах вызываю все это следующим образом:
/**
   * Получение информации об авторизованном пользователе
   * @param {number} id
   * @returns {Observable<IUser>}
   */
  public getUserInfo(id: number): Observable<IUser> {
    const url = `${env.url}/${id}/info`;

    return this.httpClient
      .get(url)
      .pipe(
        map((response: IResponse<IUser>) => this.getData(response))
      );
  }


Как поступить с таким возвратом от сервера? Возможно есть лучше/правильней решение?
  • Вопрос задан
  • 163 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
StivinKing
@StivinKing
Опишите Http Interceptor, который будет перехватывать ответ, проделывать манипуляции и отдавать уже в нужном вам формате. Примеры можно найти, загуглив: "angular 5 http interceptor response"
Ответ написан
Комментировать
search
@search
мама говорит что я особенный
Когда будите работать над Http Interceptor, как посоветовал Ivan Stroykin, проработайте обработку ошибок как следует. Интерсептор не должен возвращать null в случае ошибки. Он должен делать return Observable.throw(error).

Еще одно общее наблюдение: старайтесь функции, не использующие this выносить в отдельный файл (не сервис). Т.е. делать как-то так:

// get-data-response.ts
export function getDataResponse<T>(response: IResponse<T>) {
    if (response && response.data) {
      return response.data;
    } else {
      return null;
    }
  }


Так намного больше шансов на то что функция будет переиспользована где-то еще и не захламлена ненужными подробностями. Да и юнит-тестировать такой код гораздо проще.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы