角度图HttpClient.Post

时间:2018-02-01 11:05:47

标签: angular typescript angular-httpclient

所以我最终决定赶上时间并将一些旧的角度Http内容迁移到HttpClient

该应用程序曾经在一堆基于Promise的代码上运行,该代码已被删除(主要是)。我的旧Promise功能看起来像这样:

public getUser(profileId: number): Promise<User> {
    return this.http.post("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
    .map(u => new User(u))
    .catch(this.handleError)
    .toPromise();
}

我的新HttpClient功能更好:

public getUser(profileId: number): Observable<any> {
    return this.http.post("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
}

但我目前不喜欢的是,在每个订阅中,我现在必须将数据映射到用户的实例...

service.getUser(1).subscribe(data => {
    data = new User(data);
});

这是我所拥有的最简单的.map,一些post方法实际上会返回一个相当复杂的对象,该对象映射到许多新的对象实例。

我看到HttpClient.get您可以输入断言响应,我可以使用.post执行此类操作,以便我不必将数据映射到每个用户订阅?

注意:最终我会再次将其迁移到更好的架构,您实际上订阅了一个User变量,但是现在我只想实现HttpClient。

2 个答案:

答案 0 :(得分:4)

can I do something like this with .post so that I don't have to map the data to a new User in each of the subscriptions&lt; =是,指定返回类型的完全相同的通用可用于postput。它不会自动转换为对象,但您可以为返回的数据指定接口。或者,您可以像以前一样在服务中链接map,但我建议您使用pipeable operators

使用pipeable operators模仿您之前代码中的内容的示例。

import { map } from 'rxjs/operators/map';

public getUser(profileId: number): Observable<User> {
    return this.http.post("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions())
        .pipe(map(data => new User(data)));
}

其中User只不过是具有属性的接口的示例。

如果数据本身是json代表具有属性的接口,则可以直接转换它。

export interface User {
  userId: number;
  name: string;
}


public getUser(profileId: number): Observable<User> {
    return this.http.post<User>("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
}

答案 1 :(得分:1)

如果您在服务中导入User类,则可以在User之后和<User>之前添加post将其映射回()对象

public getUser(profileId: number): Observable<any> {
    return this.http.post<User>("/api/url", postObject, HttpSettings.GetDefaultHttpRequestOptions());
}