我正在尝试为restservice创建新的包装器,我正在尝试将角度4移动到5并升级相同的服务。我得到如下错误。如果我将Observable<Response>
更改为Observable<HttpResponse>
,我也会收到错误:
类型'HttpHeaders'的参数不能赋值给'{headers?:HttpHeaders | {[header:string]:string |串[]; };观察?:“身体”; params?:Ht ......'。 属性'headers'在'HttpHeaders'类型中是私有的,但在类型'{headers?:HttpHeaders | {[header:string]:string |串[]; };观察?:“身体”; PARAMS:
下面是代码。
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { HttpClient, HttpRequest, HttpHeaders, HttpResponse } from '@angular/common/http';
@Injectable()
export class httpService {
private requestHeaders: HttpHeaders;
constructor(private _http: HttpClient) {
this.requestHeaders = new HttpHeaders();
this.requestHeaders.append('Content-Type', 'application/json');
this.requestHeaders.append('Accept', 'application/json');
}
post(url: string, requestData?: any): Observable<Response> {
return this._http.post(url, requestData, this.requestHeaders);
}
}
上面是使用{headers: this.requestHeaders}
但是行return this._http.post(url, requestData, this.requestHeaders);
会抛出错误,如
Type 'Observable<ArrayBuffer>' is not assignable to type 'Observable<Response>'.
Type 'ArrayBuffer' is not assignable to type 'Response'.
Property 'body' is missing in type 'ArrayBuffer'.
答案 0 :(得分:4)
标题只是选项的一个参数,因此您应该传入
{headers: this.requestHeaders}
这也可以解决您看到的Property 'headers' is private...
错误。
此外,HttpHeaders是不可变的。所以每个变异操作符都返回一个新实例。这意味着要正确设置您需要执行的标题
this.requestHeaders = new HttpHeaders()
.append('Content-Type', 'application/json')
.append('Accept', 'application/json');
或
this.requestHeaders = new HttpHeaders();
this.requestHeaders = this.requestHeaders.append('Content-Type', 'application/json');
this.requestHeaders = this.requestHeaders.append('Accept', 'application/json');
<强>更新强>
因此post observable返回类型Observable<ArrayBuffer>
,但声明您的方法返回类型Observable<Response>
导致类型不匹配。 HttpClient
期望您将返回类型传递给方法this.http.post<YourResponseType>(...)
(或者它将采用返回类型)。所以你的方法应该更新到
post<T>(url: string, requestData?: any): Observable<T> {
return this.http.post<T>(url, requestData, {headers: this.requestHeaders});
}
其中T
是响应类型。现在http方法期望返回类型Observable<T>
,而您的post
方法返回类型Observable<T>
。类型匹配。您可以像这样使用您的方法
this.post<MyResponse>(myUrl, myRequestData).subscribe(...);
答案 1 :(得分:1)
append()
的实施是:
append(name: string, value: string|string[]): HttpHeaders {
return this.clone({name, value, op: 'a'});
}
它返回一个hte头对象的克隆。
this.reqequestHeaders,否则无法保存。或者,构造函数os HttpHeaders是:
constructor(headers?: string|{[name: string]: string | string[]})
更清洁的方法是:
const headerJson = {
'Content-Type': 'application/json',
'Accept' : 'application/json'
}
this.header = new HttpHeaders(headerJson);