将角度HTTP响应投放到类中

时间:2019-06-01 19:58:11

标签: angular observable angular-httpclient

我正在尝试将我的角度项目中的HTTP Post请求中的响应对象转换为我定义的my_seq类。我已经在HTTP服务中定义了一个通用的post方法,并在我的人员服务中使用通用{替换为Person来调用它。因此,我想,因为我已经做过HTTP Person应该是response,但事实并非如此-它只是Person。我需要将其设为Object,因为我的Person类具有一些需要访问的自定义逻辑。我可以在个人服务中编写一个辅助方法,但是我觉得这应该可行-尤其是因为VS Code intellisense表示,将鼠标悬停在组件上时,组件中的Personresponse

这是我的代码:

Person

http.service.ts

@Injectable() export class HttpService { baseUrl = 'https://baseurl.com'; constructor(private http: HttpClient) { } post<T>(endpointUrl: string, body: any): Observable<T> { const fullUrl = this.baseUrl + endpointUrl; return this.http .post<T>(fullUrl, body) .pipe( map(response => response as T) ); } }

person.service.ts

@Injectable() export class PersonService { constructor(private httpService: HttpService) { } newPerson(body: Person): Observable<Person> { return this.httpService.post<Person>('/people', JSON.stringify(body)); } }

person.component.ts

2 个答案:

答案 0 :(得分:2)

    newPerson(body: Person): Observable<Person> {
        return this.httpService.post<Person>('/people', JSON.stringify(body));
    }

HttpClient.post()方法不能返回类型Person,因为JSON响应只是转换为类型。默认类型仅为Object,但是您需要为每个响应创建一个Person的新实例。如果类型是 interface ,那就没有问题。

您可以创建Person的新实例,然后将值分配给该实例。

    newPerson(body: Person): Observable<Person> {
        return this.httpService.post('/people', JSON.stringify(body)).pipe
           map(value => Object.assign(new Person(), value)
        );
    }

答案 1 :(得分:0)

http服务的响应将是一个json对象,该对象反序列化为javascript对象。您的人员服务无法将api响应中收到的JavaScript对象转换为开箱即用的人员对象。请记住,打字稿代码已转换为javascript代码。要将javascript对象转换为您的Person类对象,您将必须手动实例化您的类对象,并通过将响应投影到person对象来填充api响应中的属性。您可以执行以下操作[注意用于将响应投影到人的地图运算符]-

SELECT * FROM EtherFlower WHERE Owner = "jack" ORDER BY RarityTier DESC