Angular 在5中从http抛出错误移动到httpClient

Angular 在5中从http抛出错误移动到httpClient,angular,typescript,Angular,Typescript,我正在尝试为restservice创建新的包装器,我正在尝试将angular 4移动到5并升级相同的服务。我得到的错误如下。如果我将Observable更改为Observable,我也会得到错误: “HttpHeaders”类型的参数不可分配给“{headers?:HttpHeaders |{[header:string]:string | string[];};observe?:“body”;params?:Ht…”类型的参数。 属性“headers”在类型“HttpHeaders”中是私有的

我正在尝试为restservice创建新的包装器,我正在尝试将angular 4移动到5并升级相同的服务。我得到的错误如下。如果我将
Observable
更改为
Observable
,我也会得到错误:

“HttpHeaders”类型的参数不可分配给“{headers?:HttpHeaders |{[header:string]:string | string[];};observe?:“body”;params?:Ht…”类型的参数。
属性“headers”在类型“HttpHeaders”中是私有的,但在类型“{headers?:HttpHeaders |{[header:string]:string | string[];}中不是私有的;注意?:“body”;参数?:

下面是代码

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只是选项的一个参数,所以您应该传入

{headers: this.requestHeaders}
这还将修复您看到的
属性“headers”为private…
错误


而且,是不可变的。因此,每个变异运算符都会返回一个新实例。这意味着要正确设置需要执行的头

this.requestHeaders = new HttpHeaders()
    .append('Content-Type', 'application/json')
    .append('Accept', 'application/json');


更新:

因此,post observable返回类型为
observable
,但您的方法被声明为返回类型
observable
,导致类型不匹配。
HttpClient
希望您将返回类型传递给方法
this.http.post(…)
(或者它将采用返回类型)。因此,您的方法应更新为

post<T>(url: string, requestData?: any): Observable<T> {
    return this.http.post<T>(url, requestData, {headers: this.requestHeaders});
}

headers只是选项的一个参数,所以您应该传入

{headers: this.requestHeaders}
这还将修复您看到的
属性“headers”为private…
错误


而且,是不可变的。因此,每个变异运算符都会返回一个新实例。这意味着要正确设置需要执行的头

this.requestHeaders = new HttpHeaders()
    .append('Content-Type', 'application/json')
    .append('Accept', 'application/json');


更新:

因此,post observable返回类型为
observable
,但您的方法被声明为返回类型
observable
,导致类型不匹配。
HttpClient
希望您将返回类型传递给方法
this.http.post(…)
(或者它将采用返回类型)。因此,您的方法应更新为

post<T>(url: string, requestData?: any): Observable<T> {
    return this.http.post<T>(url, requestData, {headers: this.requestHeaders});
}

append()
的实现是:

append(name: string, value: string|string[]): HttpHeaders { 
   return this.clone({name, value, op: 'a'}); 
 } 
它返回hte headers对象的克隆。您需要将返回的结果存储/分配给变量
this.requestHeaders
,否则将无法保存

或者,构造函数os HttpHeaders是:

constructor(headers?: string|{[name: string]: string | string[]})
一个更干净的方法是:

const headerJson = {
  'Content-Type': 'application/json',
  'Accept' : 'application/json'
}

this.header = new HttpHeaders(headerJson);

append()
的实现是:

append(name: string, value: string|string[]): HttpHeaders { 
   return this.clone({name, value, op: 'a'}); 
 } 
它返回hte headers对象的克隆。您需要将返回的结果存储/分配给变量
this.requestHeaders
,否则将无法保存

或者,构造函数os HttpHeaders是:

constructor(headers?: string|{[name: string]: string | string[]})
一个更干净的方法是:

const headerJson = {
  'Content-Type': 'application/json',
  'Accept' : 'application/json'
}

this.header = new HttpHeaders(headerJson);


header私有变量应该是任何类型的?
header:HttpHeaders
并且还为post方法设置返回类型:
post():Observable{…}
,因此Observable是我可以在那里为post()设置的唯一选项@Hacker通过使用
any
你失去了严格键入你的响应的能力header私有变量应该是任何类型的?
header:HttpHeaders
并且还为你的post方法设置了返回类型:
post():observatable{…}
所以observatable是我在那里为post()设置的唯一选项@Hacker通过使用
any
您将失去严格键入响应的能力,您将看到我收到的新错误。更新了问题。@Hacker您仍然需要
T
语法。如果传入
{observe:'response},您将只返回
HttpResponse
到选项。如果要传入该参数,则可以传入
到您的post方法
this.post.subscribe(…);
只是想知道方法post(url:string,requestData?:any):如何可观察{返回此。(http.post(url,requestData,this.requestHeaders);进行更新以清除问题。}@Hacker我不知道你在问什么。HttpClient方法(get、post、put等)不像旧的Http方法那样返回type
Response
。相反,它假设正在返回json。这就是为什么要传入所需的响应类型
this.post()
。HttpClient将解析响应,并说它属于
YourResponse
@Hacker类型,这就是
T
发挥作用的地方。它被称为泛型。全局函数应返回
可观察的
,因此当您传入
此.post()
T=MyResponseType
你能看看我收到的新错误吗。更新了问题。@黑客你仍然需要
T
语法。如果你传入
{observe:'response},你只会返回
HttpResponse
到选项。如果要传入该参数,则可以传入
到您的post方法
this.post.subscribe(…);
只是想知道方法post(url:string,requestData?:any):如何可观察{返回此。(http.post(url,requestData,this.requestHeaders);进行更新以清除问题。}@Hacker我不知道你在问什么。HttpClient方法(get、post、put等)不像旧的Http方法那样返回type
Response
。相反,它假设正在返回json。这就是为什么要传入所需的响应类型
this.post()
。HttpClient将解析响应,并说它属于
YourResponse
@Hacker类型,这就是
T
发挥作用的地方。它被称为泛型。全局函数应返回
可观察的
,因此当您传入
此.post()
T=MyResponseType
作为
httpClient.get的返回类型,没有
可观察的
。您可以使用
可观察的
可观察的
。这是一种http.post方法。它们具有相同的返回类型(甚至它们的重载).Observable不起任何作用。没有
Observable
作为
httpClient.ge的返回类型