角HttpClient替换RequestOptions?

时间:2019-07-10 19:19:42

标签: angular typescript angular-httpclient

Angular的Http模块曾经有一个RequestOptions对象,该对象可以传递给它的get方法(例如this.http.get(fooUrl, barOptions)RequestOptions包含任何标头。这是deprecated。弃用的RequestOptions的“最近替代品”是HttpRequest

这有两个问题:
 1. HttpRequest有一个url参数,因此它不等于RequestOptions。实际上,它似乎封装了整个请求,但是我看不到它在任何地方使用,因此我猜测它只是一个内部类。.
 2. HttpClient的{​​{1}}方法不接受get作为参数。

HttpRequest的{​​{1}}方法的源代码如下:

HttpClient

现在可以在get参数中使用某种类型吗?我应该只定义一个带有HttpHeaders的接口吗?如果没有它的类型,为什么不呢?

我的旧代码如下:

/**
 * Constructs a `GET` request that interprets the body as an `ArrayBuffer` and returns the response in
 *  an `ArrayBuffer`.
 *
 * @param url     The endpoint URL.
 * @param options The HTTP options to send with the request.
 *
 * @return An `Observable` of the response, with the response body as an `ArrayBuffer`.
 */
get(url: string, options: {
    headers?: HttpHeaders | {
        [header: string]: string | string[];
    };
    observe?: 'body';
    params?: HttpParams | {
        [param: string]: string | string[];
    };
    reportProgress?: boolean;
    responseType: 'arraybuffer';
    withCredentials?: boolean;
}): Observable<ArrayBuffer>;
旧的options模块中的

reqOptions.headers.set('Authorization', user.token); reqOptions.headers.set('RefreshToken', user.refreshToken); 具有headers属性,并且是静态类型的。

P.S。我在这里阅读了答案,但没有使用类型: Angular4: Http -> HttpClient - requestOptions

2 个答案:

答案 0 :(得分:0)

现在,我只是在应用程序中名为RequestOptions的新文件中定义了“我自己的” request-options.ts接口。接口定义如下,属性直接从Angular Library的client.d.ts文件中取出,以匹配HttpClientoptions参数对REST调用的期望:

import { HttpHeaders, HttpParams } from '@angular/common/http';

export interface RequestOptions {
  headers?: HttpHeaders;
  params?: HttpParams;
}

现在,我可以再次静态键入RequestOptions,例如:

const requestOptions: RequestOptions = {
  params: new HttpParams()
};

(上面的示例代码从此处引出:Angular4: Http -> HttpClient - requestOptions

我不确定我是否完全遗漏了某些东西,还是应该针对角度仓库进行PR。如果没有理由,这似乎是一个相当明显的遗漏。

答案 1 :(得分:0)

这是我作为帮助服务编写的一些内容。我相信您可以扩展以传递任何显式标头。

export class ParamBuilderService {
  buildParams(queryParams: Params, excludedValues ? : Array < string > ): HttpParams {
    let params = new HttpParams();
    for (const key in queryParams) {
      if (queryParams.hasOwnProperty(key)) {
        const value = queryParams[key];
        if (excludedValues) {
          const containExcludedValue = excludedValues.indexOf(value) !== -1;
          if (!!value && !containExcludedValue) {
            params = params.append(key, value);
          }
        } else if (!!value || value === 0) {
          params = params.append(key, value);
        }
      }
    }
    return params;
  }
}