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

时间:2017-10-26 12:59:51

标签: javascript angular typescript

我试图通过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 &amp; 打字/投射并不清楚。

我有一个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;时遇到以下错误{{1}声明为item

item: Item[]

所以我的问题是:

  1. 如何解决上述错误(为什么会出现此错误?)
  2. 这可能是一个愚蠢的问题,但如果Type 'Observable<HttpResponse<IItem[]>>' is not assignable to type 'IItem[] 已经设置了预期的&#34;类型&#34;我还需要设置._http.get<IItem[]>方法返回类型吗?
  3. 我想我并不理解导致这种混淆的一些基本概念。任何帮助将不胜感激。我是Angular 4的新手,所以请保持温柔。

2 个答案:

答案 0 :(得分:2)

T方法定义为使用泛型类型get<T>(url: string, options?: { ... }): Observable<T>;

<IItem[]>

因此,自从get根据定义this._http.get<IItem[]>方法get方法返回HttpResponse<IItem[]>方法后,getItems方法将IItem[]传递给IItem[]方法。但是,您声明方法IItem[]以返回HttpResponse<IItem[]>,因此您会收到错误:

  

输入'Observable&lt; HttpResponse&lt; IItem []&gt;&gt;'不能分配给类型   '可观察&LT;的iItem [] GT;'。

要解决此问题,您需要返回do。这可以通过从map中提取this._http.get<IItem[]>('url', {observe: 'response'}) .do(data => console.log('All: ' + JSON.stringify(data))) .map(data => data.body) 类型的主体并将其返回来完成。 public class Example implements Comparable { private String identifier; private List<Integer> list; // constructors // getters @Override public int compareTo(Object other){ if(this.list.head() > other.list.head()) return 1; if(this.list.head() < other.list.head()) return -1; else return 0; } } 运算符无法返回任何内容,因此您必须使用stringsAsFactors = FALSE运算符:

urls <- data.frame(c("https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=1212/08", 
              "https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=1212/09", 
              "https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=1213/07", 
              "https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=1213/08", 
              "https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=1213/09", 
              "https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=1214/07", 
              "https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=1214/08", 
              "https://ec.europa.eu/consumers/consumers_safety/safety_products/rapex/alerts/?event=viewProduct&reference=1214/09"),
              stringsAsFactors = FALSE)

答案 1 :(得分:1)

这应该有效:

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