Angular HttpClient, динамическая установка типа карты - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть метод в службе для обработки всех внутренних запросов.Вместо того чтобы писать целую кучу разных вызовов с использованием HttpClient, я подумал, что мог бы написать одну единственную функцию, которая могла бы подключиться к моему бэкэнду и передать ему аргументы для обработки различных типов данных.

Рассмотрим эту функцию

public postRequest(token: string, url: string, body: any, headers: Object = {}) : Observable<any> {
//create new header object
const httpOptions = {
  headers: new HttpHeaders()
    .set('Authorization', token)
};
//add the headers if any
for(let index in headers){
  httpOptions.headers.set(index, headers[index]);
}
//connect to the backend and return the repsonse
return this.http.post( this.config.BASE_SERVER_URL + url, body , httpOptions)
  .pipe(
    map((res) => {
      return res;
    }),
    catchError(this.handleError)
  );
}

Это работает хорошо, за исключением того, что я хотел иметь возможность динамически устанавливать тип ответа.Таким образом, я могу настроить метод на использование одного из моих типов моделей.

Вот что я пытаюсь выполнить.Надеюсь, это имеет смысл.

map(res: "Attendee") => {}
//or
map(res: typeof(typeInput)) => {}

Возможно ли вставить "динамический" тип в метод карты http, чтобы я мог сопоставить различные ответы с выбранной моделью?

1 Ответ

0 голосов
/ 15 февраля 2019

Я могу добиться этого с помощью универсальных методов.

Вы можете использовать этот подход.

my-own.service.ts

userAuthentication<T>(userName: string, password: string): Observable<T> {
    const url = `http://my-own.url`;
    const targetData = {
      'emailId': userName,
      'password': password
    };
    return this.http.post<CommonResponse<T>>(url, targetData, httpOptions).pipe(
      retry(3),
      map((data: CommonResponse<T>) => {
        if (data.status) {
          if (!data.result[0]) {
            this.showMessage('You are not authorized for login');
            return null;
          }
          return data.result[0] as T;
        }
        this.showMessage(data.message);
        return null;
      }),
      tap((userProfile: T) => {
        console.log('UserLogin ');
      }),
      catchError(this.handleError<T>('unable to logged in')));
  }

Модель CommonResponse

export class CommonResponse<T> {
  autherizationExpires: string;
  autherizationKey: string;
  message: string;
  result: T | T[];
  status: boolean;
}

Итак, когда вы вызываете этот метод как myOwnService.userAuthentication (... params) .subscribe (/ * ваши коды */); Она будет также передана на карту.

дайте мне знать, если я не получу ваш вопрос.

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