使用选项从HttpClient.get获取Observable <t>

时间:2018-07-12 10:36:17

标签: angular http generics

通常,像下面的示例一样,我使用Angular HttpClient执行get请求:

this.http
   .get<Project>('/api/projects/' + id)
   .subscribe(p => {
    // p is typed as Project
    this.project = p;
  });

类型参数Project定义了预期的响应。 HttpCLient.get<T>()返回Observable<T>

我现在需要在请求中添加一些选项,例如:

getRequestOptions() {
   var headers = new HttpHeaders();
   headers.append('Authorization', 'Basic ' + this.auth.EMail + ':' + this.auth.Token);
   return { headers: this.getRequestOptions() };
}

// Somewhere else   
this.http.get<Project>(url, this.getRequestOptions())
         .subscribe(p => { 
             // p is HttpEvent<Project> with no (direct?) access to the
             // returned object, just a property called type
         });

这将调用get()方法的不同重载,由于某些原因,该重载不是返回Observable<T>而是返回Observable<HttpEvent<T>>。除了我认为那是糟糕的设计之外,

如何使用HttpEvent?它仅包含一个名为type的属性。我知道有一些派生类型,如果有一个get请求,可能是HttpResponse<T>。我是否真的需要处理所有类型转换和转换内容,仅仅是因为我正在使用RequestOptions?

此设计决定的背景是什么?为什么所有重载都返回相同的类型并共享一个通用的使用模式?

1 个答案:

答案 0 :(得分:1)

我的问题中的代码有两件事是错误的:正如Und3rTow在其评论中指出的那样,由于递归函数调用而导致了堆栈溢出错误。其次,HttpHeaders显然是不可变的。 append()方法返回一个新的HttpHeaders对象,但不会更改原始对象。作为使用修改后的对象的替代方法,可以在构造函数中传递键值对。工作代码为:

getRequestOptions() {
    var headers = new HttpHeaders({'Authorization' : 'Basic ' + this.auth.EMail + ':' + this.auth.Token});
    var options = {      
      headers: headers 
    };
    return options;
}