从角度为5

时间:2017-12-06 18:58:28

标签: angular typescript

我正在尝试为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'.

2 个答案:

答案 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);