Как обработать ответ API, который может быть пустым объектом с rx js Observables? - PullRequest
0 голосов
/ 06 февраля 2020

Я могу редактировать как внешний, так и внутренний интерфейсы

У меня есть служба, которая извлекает коммюнике. Это коммюнике может существовать (есть одно активное коммюнике) или может не существовать (нет активного коммюнике), поэтому API может ответить объектом JSON коммюнике или пустым объектом JSON.

Я обращаюсь с этим следующим образом:

getCommunique(): Observable<Communique | {}> {
  return this.http.get(this.apiUrl + '/getCommunique').map((response) => {
    if (Object.keys(response.json()).length != 0) {
      return new Communique(response.json())
    } else {
      return {}
    }
  });
}

Это мой Communique класс:

export class Comunique {
  public id: number;
  public title: string;
  public content: string;
  public date: Date;
  public url: string;
  public imageUrl: string;

  constructor(input: ComuniqueRaw) {
    this.id = input.id;
    this.title = input.title;
    this.content = input.content;
    this.date = new Date(input.date.timestamp * 1000);
    this.url = 'url' + input.slug;
    this.imageUrl = 'url' + input.image;
  }
}

Это работает ... Но это похоже на обходной путь. Разве наблюдаемое не должно возвращать только Communique объекты? Но если не будет активного коммюнике, как будет создан объект Communique? Я имею в виду, я могу добавить поле с чем-то вроде public exists: boolean; в классе Communique, но это тоже похоже на обходной путь (объект, который содержит только один boolean).

Обрабатываю ли я это правильный путь? Или ... Как обработать ответ API, который может быть пустым объектом с помощью rx js Observables?

1 Ответ

0 голосов
/ 06 февраля 2020

Наблюдаемый http.get () всегда возвращается один раз и только один раз. Если сервер отвечает пустым объектом, то не обязан HTTP-клиент игнорировать его - это правильный HTTP-ответ.

Я бы сказал, что ваш сервер должен вернуть 404, если нет объекта коммюнике, и вы поймать это с помощью rx js catchError, который будет обрабатывать этот случай отдельно.

Edit:

Если вы предпочитаете всегда возвращать 200 с пустым ответом или объектом, тогда реализованный вами шаблон выглядит нормально.

Edit2:

Я только что заметил, что вы используете старый метод .map (). Мой ответ catchError () был бы для использования относительно новых операторов канала.

getCommunique(): Observable<Communique> {
  return this.http.get(this.apiUrl + '/getCommunique').pipe(
    map(response => new Communique(response.json())),
    catchError(() => of(null))
  );
}
...