如何在 Angular 7 中管理 API 函数调用服务
How to manage API function call services in Angular 7
我完成了一个 Angular 7 网络应用程序(大致)。例如,我有一个 documents.service.ts 文件,它包含以下 HTTP GET 请求函数:
public sendOnlyCoverPage(strProNo: string, strEstesFileName: string): Observable<any> {
return this._http.get(this.FilesApi + "/GetSendOnlyCoverPage?strProNo=" + strProNo + '&strEstesFileName=' + strEstesFileName, httpOptions);
}
而POST请求格式如下:
public FTP_PutFile(ftpModel: any): Observable<any> {
var obj = JSON.stringify(ftpModel);
return this._http.post(this.FilesApi + "/PostFTP_PutFile", obj, httpOptions);
}
我有两个问题:
问题一:
我在上面的不同服务中有很多 HTTP GET 和 POST 函数。我觉得我在 API 函数设计上做错了什么,因为当我打开任何 serivce 文件时,有很多像上面这样的函数。我在想有什么办法可以集中这些 api 功能。例如我可以创建一个中间服务,每当我需要进行 API 调用时,我可以传递函数名称、url 和参数等。
问题二:
如上代码所示,我有参数 ftpModel: any。我知道最好创建一个对象映射(接口)来替换任何类型。但同样,有很多这样的参数。有没有解决方案而不是为每个参数创建每个对象映射(接口)?
问题 1
您应该创建一个抽象的 BaseService,如下所示:
import {HttpClient} from '@angular/common/http';
import {Observable} from 'rxjs';
import {environment} from '../../environments/environment';
export abstract class BaseService<T> {
private endpoint: string;
constructor(protected http: HttpClient,
endpoint: string) {
this.endpoint = endpoint;
}
findAll(): Observable<T[]> {
return this.http.get<T[]>(this.getUrl());
}
findOne(id: number): Observable<T> {
return this.http.get<T>(`${this.getUrl()}/${id}`);
}
save(objeto: T): Observable<T> {
return this.http.post<T>(this.getUrl(), objeto);
}
delete(id: number): Observable<void> {
return this.http.delete<void>(`${this.getUrl()}/${id}`);
}
protected getUrl(): string {
return `${environment.api_url}${this.endpoint}`;
}
complete(query: string): Observable<T[]> {
return this.http.get<T[]>(`${this.getUrl()}/complete?query=${query}`);
}
}
而且,在您的服务中扩展它:
export class ProductService extends BaseService<Product> {
constructor(protected http: HttpClient) {
super(http, 'product');
}
}
中的示例
问题 2
更好的方法仍然是你提到的,创建你的 classes/interfaces 用于映射。
我完成了一个 Angular 7 网络应用程序(大致)。例如,我有一个 documents.service.ts 文件,它包含以下 HTTP GET 请求函数:
public sendOnlyCoverPage(strProNo: string, strEstesFileName: string): Observable<any> {
return this._http.get(this.FilesApi + "/GetSendOnlyCoverPage?strProNo=" + strProNo + '&strEstesFileName=' + strEstesFileName, httpOptions);
}
而POST请求格式如下:
public FTP_PutFile(ftpModel: any): Observable<any> {
var obj = JSON.stringify(ftpModel);
return this._http.post(this.FilesApi + "/PostFTP_PutFile", obj, httpOptions);
}
我有两个问题:
问题一:
我在上面的不同服务中有很多 HTTP GET 和 POST 函数。我觉得我在 API 函数设计上做错了什么,因为当我打开任何 serivce 文件时,有很多像上面这样的函数。我在想有什么办法可以集中这些 api 功能。例如我可以创建一个中间服务,每当我需要进行 API 调用时,我可以传递函数名称、url 和参数等。
问题二:
如上代码所示,我有参数 ftpModel: any。我知道最好创建一个对象映射(接口)来替换任何类型。但同样,有很多这样的参数。有没有解决方案而不是为每个参数创建每个对象映射(接口)?
问题 1 您应该创建一个抽象的 BaseService,如下所示:
import {HttpClient} from '@angular/common/http';
import {Observable} from 'rxjs';
import {environment} from '../../environments/environment';
export abstract class BaseService<T> {
private endpoint: string;
constructor(protected http: HttpClient,
endpoint: string) {
this.endpoint = endpoint;
}
findAll(): Observable<T[]> {
return this.http.get<T[]>(this.getUrl());
}
findOne(id: number): Observable<T> {
return this.http.get<T>(`${this.getUrl()}/${id}`);
}
save(objeto: T): Observable<T> {
return this.http.post<T>(this.getUrl(), objeto);
}
delete(id: number): Observable<void> {
return this.http.delete<void>(`${this.getUrl()}/${id}`);
}
protected getUrl(): string {
return `${environment.api_url}${this.endpoint}`;
}
complete(query: string): Observable<T[]> {
return this.http.get<T[]>(`${this.getUrl()}/complete?query=${query}`);
}
}
而且,在您的服务中扩展它:
export class ProductService extends BaseService<Product> {
constructor(protected http: HttpClient) {
super(http, 'product');
}
}
中的示例
问题 2 更好的方法仍然是你提到的,创建你的 classes/interfaces 用于映射。