簡體   English   中英

從Angular 4 HTTP調用獲得完整響應(不僅僅是正文)

[英]Getting a Full Response (not just the body) from Angular 4 HTTP Calls

我正在嘗試從HTTP調用中獲得完整響應。 根據Angular文檔,我應該將我的HTTP調用“選項”設置{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[]>'.

我認為我關於ObservablesTyping / Casting的概念並不是那么清楚。

我有一個HTTP Get請求,它返回一個observable和Strong輸入一個項目數組(見下文)

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;時,我收到以下錯誤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 [] >>'不能分配給'Observable <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 )
        };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM