Общий POST, GET в машинописи - заголовки, необязательный тип ответа - PullRequest
0 голосов
/ 24 сентября 2019

я пишу простое приложение на угловом языке и создал несколько сервисов, которые вызывают API.

До изменений в каждом сервисе у меня были такие методы:

 let addHeaders = new HttpHeaders();
 addHeaders = addHeaders.append('Authorization', apiKey);
 const endpoint = this.BuildAddress(this.MessagesEndp);
 return this.httpClient.post<Array<MessageDto>>(endpoint, dto, {headers: addHeaders});

, но кодирование с DRYПравило Я хочу создать некоторые общие методы для всех моих служб, которые являются производными от моего restApiSetvice.

Итак, я начал писать так:

 Get<T>(endpoint: string, authorization: boolean = true): Observable<T> {
    const apiKey = this.GetApiKey();
    if (authorization) {
      const addHeaders = new HttpHeaders().set('Authorization', apiKey);
      return this.client.get<T>(endpoint, {headers: addHeaders}).pipe(map(result => {
        return result;
      }));
    } else {
      return this.client.get<T>(endpoint).pipe(map(result => {
        return result;
      }));
    }
  }

, чтобы я мог упростить свой кодво всех службах к этому:

GetFriendshipRequests(id: number) {
    const endpoint = this.BuildAddress(this.GetFriendshipisRequestsEnd, id);
    return this.Get<Array<number>>(endpoint);
  }

, но есть некоторые проблемы, для некоторых вызовов не требуется авторизация, поэтому в моем примере есть оператор if

 if (authorization) {

, но некоторые изслужбы должны также отправить это:

 responseType: 'text' as 'json'

по запросу

, а также некоторые из них должны отправить это:

observe: 'response'});

(на самом деле это маленькая проблема, потому чтоя всегда могу наблюдать все запросы)

но как я могу написать параметры метода для извлечения наблюдения, параметров, типа ответа и т. д.?

как это сделать гладко

пожалуйста, незабыть, что я на самом деле изучаю типыугловатые и угловатые, поэтому, пожалуйста, напишите ответ настолько просто, насколько вы можете:)

что я хочу:

Я просто не хочу помещать множественное выражение if в мой общий класс restapiQuery

1 Ответ

0 голосов
/ 24 сентября 2019

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

Поэтому я бы предложил вам переместить логин заголовка авторизации в перехватчик , который будет обрабатывать эту логику.Кроме того, вместо того, чтобы оборачивать логику HTTP в ваши собственные пользовательские методы для обработки логики отказа, вы можете просто переместить ее в служебный метод следующим образом:

// authorization-utils.ts
const OPT_OUT_AUTH_HEADER = "X-Opt-Out-Auth";

export function addNoAuthRequired(headers?: HttpHeaders): HttpHeaders{
  headers = headers || new HttpHeaders;
  return headers.set(OPT_OUT_AUTH_HEADER, 'true')
}

export function noAuthRequired(req: HttpRequest<any>): boolean {
  return req.headers.has(OPT_OUT_AUTH_HEADER);
}

// authorization-interceptor.ts
import { noAuthRequired } from './authorization-utils';

@Injectable()
export class AuthorizationInterceptor implementes HttpInterceptor {
  ctor(private readonly authService: AuthorizationService){}
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>{
    return of(req).pipe(
      map(request => noAuthRequired(request)
         ? request
         : request.clone({setHeaders: this.AuthHeaders})
      ),
      mergeMap(request => next.handle(request))
    );
  }

  private get AuthHeaders(){
    return {Authorization: this.authService.GetApiKey()}
  }
}

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

Чтобы отказаться от него, вам нужно будет сделать следующее:

import { addNoAuthRequired } from './authorization-utils';

foo(url:string): Observable<Foo>{
   const headers = addNoAuthRequired();
   return this.http.get<Foo>(url,{headers});
}

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

...