从Angular 4 HTTP调用中获取完整响应(而不仅仅是正文)



我正试图从HTTP调用中获得完整响应。根据Angular文档,我应该将HTTP调用"options">设置为{observe: 'response'}

如果我这样做,我会得到以下错误:

Type 'Observable<HttpResponse<IItem[]>>' is not assignable to type 'Observable<IItem[]>'. Type 'HttpResponse<IItem[]>' is not assignable to type 'IItem[]'. Property 'includes' is missing in type 'HttpResponse<IItem[]>'.

我认为我关于Observables&打字/铸造不太清楚。

我收到了一个HTTPGet请求,它返回了一个可观察到的且强的将其键入项目数组中的(见下文)

getItems(): Observable <IItem[]>{
return this._http.get<IItem[]>(url, {observe: 'response'})
.do(data => console.log('All: ' + JSON.stringify(data)))
};

我尝试设置getUsers(): Observable <HttpResponse<IUser[]>>,它解决了上述错误,但在我的subscribe中,当我尝试将返回的数据分配给局部变量this.item = data;时,我得到了以下错误,其中item被声明为item: Item[]

Type 'Observable<HttpResponse<IItem[]>>' is not assignable to type 'IItem[]

所以我的问题是:

  1. 如何解决上述错误(以及为什么会出现此错误)
  2. 这可能是一个愚蠢的问题,但如果._http.get<IItem[]>已经设置了预期的响应"类型",我还需要设置getItems(): Observable <IItem[]>方法的返回类型吗

我想我不理解导致这种混乱的一些基本概念。任何帮助都将不胜感激。我是Angular 4的新手,所以请温柔一点。

HttpClient.get方法被定义为使用泛型类型T:

get<T>(url: string, options?: {
...
}): Observable<T>;

因此,由于根据定义将<IItem[]>传递给get方法(此处为this._http.get<IItem[]>),因此get方法返回HttpResponse<IItem[]>对象。然而,您声明方法getItems返回IItem[],因此会得到错误:

键入'Observable<HttpResponse<IItem[]>gt;'不可分配给类型'可观察<IItem[]>'。

要修复它,您需要返回IItem[]。这可以通过从HttpResponse<IItem[]>中提取类型为IItem[]的主体并返回它来完成。do运算符不能返回任何内容,因此必须使用map运算符:

this._http.get<IItem[]>('url', {observe: 'response'})
.do(data => console.log('All: ' + JSON.stringify(data)))
.map(data => data.body)

这应该有效:

getItems(): Observable <IItem[]>{
return this.http
.get<IItem[]>(url, {observe: 'response'})
.do(data => console.log('All: ' + JSON.stringify(data)))
.map( (r: HttpResponse<IItem[]> )  => r.body )
};

相关内容

最新更新