我正在使用HttpClient在Angular中设计Api端点。这是一个单一的服务类,它将处理所有的Rest调用,它将从其他服务类(当前正在进行Rest调用)中调用。
制作通用的Rest方法的最佳实践是什么。
getApi(url: string, options?: object): Observable<any> {
return this.http.get<any>(url, options).pipe(
catchError((error: HttpErrorResponse) => {
return throwError(error);
})
)
}
或
getApi<T>(url: string, options?: object): Observable<T> {
return this.http.get<T>(url, options).pipe(
catchError((error: HttpErrorResponse) => {
return throwError(error);
})
)
}
以上任何一项都可以处理:HttpEvent,HttpResponse或其他类似的响应吗?
我应该使用多种方法来处理吗?
答案 0 :(得分:1)
请注意,答案非常基于意见。
在我展示解决方案之前,我想分享它的思想。
因此,当我使用TS时,我希望具有尽可能严格的类型。因此,在这种情况下,使用any
,object
或类似的东西会分散注意力。我也想避免任何额外的类型转换,因为这会导致某处错误。
幸运的是,TS非常聪明地可以帮助我实现此目标,因为它可以根据用途识别类型。
基于此,我们可以构建如下内容:
一个非常通用的类,可以满足我们的所有需求(可以通过传递参数进行扩展,以获取,记录和计数器所需的任何内容)
class HttpService {
get<TData, TResult>(url: string, data?: TData): Promise<TResult> {
return fetch(url, data)
.then(x => x.json())
.catch((err) => console.log(err));
}
}
但是此类不应直接使用。我建议创建一个更严格和专门的服务,该服务将隔离提取逻辑并提供严格的类型而不是泛型。
type User = {
name: string;
}
class MyDataService {
constructor(private readonly _transportService: HttpService) { }
fetchUserInfo(userId: number): Promise<User> {
return this._transportService.get('/some/url', userId);
}
}
现在,我可以使用MyDataService而不进行任何类型转换和类型猜测。另一个好处是,此服务非常易于测试,因为您可以根据需要替换传输模块。
希望我的回答对您有所帮助。