[英]Generic POST, GET in typescript - headers, response type optional
我在 angular 中编写简单的应用程序并创建了一些服务,这些服务正在调用 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'});
(实际上这是小问题,因为我可以随时观察所有请求)
但是我如何编写方法参数来检索观察、选项、响应类型等?
如何顺利进行
请不要忘记我实际上是在学习 typescript 和 angular,所以请尽可能简单地写答案:)
我想要的是:
我只是不想在我的常见 restapiQuery class 中放置多个 if 语句
听起来像是一个选择加入/退出的问题。 在您的情况下,在大多数情况下,您希望设置授权 header,而在某些特殊情况下,您希望退出此步骤。
所以我建议你将授权 header 登录移动到一个拦截器中,它可以处理这个逻辑。 此外,您无需将 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()}
}
}
在应用程序中注册此拦截器后,授权 header 将添加到所有未退出此步骤的请求中。
要退出它,您需要执行以下操作:
import { addNoAuthRequired } from './authorization-utils';
foo(url:string): Observable<Foo>{
const headers = addNoAuthRequired();
return this.http.get<Foo>(url,{headers});
}
这将使重复代码保持在最低限度,而不会限制 HTTP 操作的灵活性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.