【问题标题】:Angular HttpClient replacement for RequestOptions?RequestOptions 的 Angular HttpClient 替代品?
【发布时间】:2019-07-15 22:21:10
【问题描述】:

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

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

HttpClientget 方法的源代码如下所示:

/**
 * 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 参数吗?我应该只定义一个上面有HttpHeaders 的接口吗?如果没有它的类型,为什么不呢?

我的旧代码如下所示:

reqOptions.headers.set('Authorization', user.token);
reqOptions.headers.set('RefreshToken', user.refreshToken);

来自旧 Http 模块的RequestOptions 具有 headers 属性并且是静态类型的。

附:我在这里阅读了答案,但它不使用类型: Angular4: Http -> HttpClient - requestOptions

【问题讨论】:

  • 您使用/来自哪个版本的 Angular?
  • 从 7 到 8。我认为这可能适用于从 4 左右更新 iirc 的任何人。我们只是从未全面应用HttpClient

标签: angular typescript angular-httpclient


【解决方案1】:

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

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;
  }
}

【讨论】:

    【解决方案2】:

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

    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

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

    【讨论】:

    • 好的,这只是 RequestOptions 的多种类型定义之一,如果您阅读 http.d.ts (@angular/common/http),我认为您没有使用一个带有 responseType 数组缓冲区(2019 XD 中只有 JSON),一个想法可能是为您的用例制作您的“部分”RequestOption
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多