通常,像下面的示例一样,我使用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?
此设计决定的背景是什么?为什么所有重载都返回相同的类型并共享一个通用的使用模式?
答案 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;
}