概括其余服务调用并将地图服务器响应映射到我的对象

时间:2018-12-03 21:01:03

标签: angular typescript

我试图创建一个通用的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)

1 个答案:

答案 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);
    }
}

ref:https://github.com/damienbod/angular-auth-oidc-client