【问题标题】:moving to httpClient from http throwing error in angular 5从角度 5 中的 http 抛出错误移至 httpClient
【发布时间】:2018-05-20 18:22:33
【问题描述】:

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

“HttpHeaders”类型的参数不能分配给“{ headers?: HttpHeaders | { [标题:字符串]:字符串 |细绳[]; };观察?:“身体”;参数?:Ht...'。
属性 'headers' 在 'HttpHeaders' 类型中是私有的,但在 '{ headers 类型中不是私有的?:HttpHeaders | { [标题:字符串]:字符串 |细绳[]; };观察?:“身体”;参数?:

下面是代码。

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'.

【问题讨论】:

  • 没有Observable&lt;Response&gt; 作为httpClient.get 的返回类型。您可以使用Observable&lt;any&gt;Observable&lt;HttpResponse&lt;any&gt;&gt;
  • 这是一个http.post方法
  • 它们具有相同的返回类型(甚至它们的重载)。
  • Observable> 不能正常工作。

标签: angular typescript


【解决方案1】:

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

{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&lt;ArrayBuffer&gt; 但您的方法被声明为返回类型 Observable&lt;Response&gt; 导致类型不匹配。 HttpClient 期望您将返回类型传递给方法this.http.post&lt;YourResponseType&gt;(...)(或者它将假定返回类型)。所以你的方法应该更新为

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

其中T 是响应类型。现在 http 方法期望返回类型 Observable&lt;T&gt; 而您的 post 方法返回类型 Observable&lt;T&gt;。类型匹配。你会像这样使用你的方法

this.post<MyResponse>(myUrl, myRequestData).subscribe(...);

【讨论】:

  • 你能看看我得到的新错误吗?更新了问题。
  • @Hacker 你仍然想要T 语法。如果您将{observe: 'response'} 传递给选项,您只会返回HttpResponse。如果您要传递该参数,那么您可以将 &lt;HttpResponse&lt;MyResponse&gt;&gt; 传递给您的 post 方法 this.post&lt;HttpResponse&lt;MyResponse&gt;&gt;.subscribe(...);
  • 只是想知道方法 post(url: string, requestData?: any): Observable { return this._http.post(url, requestData, this.requestHeaders);更新清楚的问题。 }
  • @Hacker 我不确定你在问什么。 HttpClient 方法(get、post、put 等)不像旧的 Http 方法那样返回类型 Response。相反,它假定正在返回 json。这就是为什么你传递你想要的响应类型this.post&lt;YourResponseType&gt;()。 HttpClient 将解析响应并说它是YourResponse 类型。
  • @Hacker 这就是T 发挥作用的地方。它被称为泛型。你的全局函数应该返回Observable&lt;T&gt;,所以当你传入this.post&lt;MyResponseType&gt;()T = MyResponseType
【解决方案2】:

append()的实现是:

append(name: string, value: string|string[]): HttpHeaders { 
   return this.clone({name, value, op: 'a'}); 
 } 

它返回一个 hte headers 对象的克隆。您需要将返回的结果存储/分配给您的变量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);

【讨论】:

  • 头部私有变量应该是任意类型?
  • header: HttpHeaders 并为您的发布方法设置返回类型:post():Observable&lt;any&gt; {...}
  • 所以 Observable 是我可以为 post() 设置的唯一选项。
  • @Hacker 使用 any 您将失去严格输入回复的能力
猜你喜欢
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多