我试图创建一个通用的REST服务以用于所有服务,例如对于 POST 请求我有此代码
post<T>(relativeUrl: string, body?: any, params?: HttpParams, headers?: HttpHeaders): Observable<HttpResponse<T>> {
return this.executeRequest(this.createRequest(relativeUrl, body, params, headers, 'POST'))
}
并以类似方式用于其他HTTP请求方法。所有这些方法都调用 createRequest 和 executeRequest
// TODO: Finish and check arguments
private createRequest(relativeUrl: string, body: any, params: HttpParams | null, headers: HttpHeaders | null, method: string ): HttpRequest<any> {
let url: string;
if (relativeUrl.startsWith('http') || relativeUrl.startsWith('https')) {
url = relativeUrl;
} else {
url = `${environment.restUrl}/${relativeUrl}`;
}
headers = headers || new HttpHeaders()
//TODO: If user is logged add Authorization bearer in headers
return new HttpRequest(method, url, body, {
headers: headers,
params: params
})
}
private executeRequest(request: HttpRequest<any>): Observable<HttpResponse<any>> {
return <any> this.http.request(request)
.pipe(
catchError(error => {
return throwError(error);
})
);
}
设置方法正确吗? HTTP请求方法的返回值正确吗?例如,在我的login.service中,我以这种方式使用POST方法
login<User>(email: string, password: string): Observable<HttpResponse<User>>{
const data = {
email: email,
password: password
};
let headers = new HttpHeaders({
'Content-Type': 'application/json',
'Accept-Language': 'it'
})
return this.restService.post<User>(this.baseUrl, data, null, headers)
.pipe(
catchError(error => {
this.notificationService.error(error.error.error.message);
return throwError(error);
})
);
}
我对服务器和我的User对象返回的json的转换何时发生有疑问。使用 loginService 时,应该在服务或组件中进行转换?我是如何进行转换的?没错
Object.assign(new User(), serverResponse.body)
?
答案 0 :(得分:1)
将相同逻辑应用于所有请求的正确方法是使用Http拦截器。
达米恩·鲍德(Damien Bod)在他的angular-auth-oidc-client库中为此提供了一个很好的例子
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
private oidcSecurityService: OidcSecurityService;
constructor(private injector: Injector) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let requestToForward = req;
if (this.oidcSecurityService === undefined) {
this.oidcSecurityService = this.injector.get(OidcSecurityService);
}
if (this.oidcSecurityService !== undefined) {
let token = this.oidcSecurityService.getToken();
if (token !== '') {
let tokenValue = 'Bearer ' + token;
requestToForward = req.clone({ setHeaders: { Authorization: tokenValue } });
}
} else {
console.debug('OidcSecurityService undefined: NO auth header!');
}
return next.handle(requestToForward);
}
}