186

我一直在寻找一种将查询参数传递到使用 new 的 API 调用HttpClientModule的方法HttpClient,但尚未找到解决方案。使用旧Http模块,您将编写类似这样的内容。

getNamespaceLogs(logNamespace) {

    // Setup log namespace query parameter
    let params = new URLSearchParams();
    params.set('logNamespace', logNamespace);

    this._Http.get(`${API_URL}/api/v1/data/logs`, { search: params })
}

这将导致对以下 URL 的 API 调用:

localhost:3001/api/v1/data/logs?logNamespace=somelogsnamespace

但是,新HttpClient get()方法没有search属性,所以我想知道在哪里传递查询参数?

4

8 回答 8

269

我最终通过get()函数上的 IntelliSense 找到了它。所以,我会把它贴在这里给任何正在寻找类似信息的人。

无论如何,语法几乎相同,但略有不同。而不是使用URLSearchParams()需要初始化的参数,并且现在调用函数HttpParams()内的属性而不是.get()paramssearch

import { HttpClient, HttpParams } from '@angular/common/http';
getLogs(logNamespace): Observable<any> {

    // Setup log namespace query parameter
    let params = new HttpParams().set('logNamespace', logNamespace);

    return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })
}

我实际上更喜欢这种语法,因为它与参数无关。我还对代码进行了重构,使其更加简洁。

getLogs(logNamespace): Observable<any> {

    return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, {
        params: new HttpParams().set('logNamespace', logNamespace)
    })
}

多个参数

到目前为止,我发现的最好方法是定义一个Params对象,其中包含我想要定义的所有参数。正如@estus 在下面的评论中指出的那样,This Question对于如何分配多个参数有很多很好的答案。

getLogs(parameters) {

    // Initialize Params Object
    let params = new HttpParams();

    // Begin assigning parameters
    params = params.append('firstParameter', parameters.valueOne);
    params = params.append('secondParameter', parameters.valueTwo);

    // Make the API call using the new parameters.
    return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })

具有条件逻辑的多个参数

我经常使用多个参数做的另一件事是允许使用多个参数,而不需要它们在每次调用中都存在。使用 Lodash,在调用 API 时有条件地添加/删除参数非常简单。Lodash 或 Underscores 或 vanilla JS 中使用的确切函数可能因您的应用程序而异,但我发现检查属性定义效果很好。下面的函数将只传递在传递给函数的参数变量中具有相应属性的参数。

getLogs(parameters) {

    // Initialize Params Object
    let params = new HttpParams();

    // Begin assigning parameters
    if (!_.isUndefined(parameters)) {
        params = _.isUndefined(parameters.valueOne) ? params : params.append('firstParameter', parameters.valueOne);
        params = _.isUndefined(parameters.valueTwo) ? params : params.append('secondParameter', parameters.valueTwo);
    }

    // Make the API call using the new parameters.
    return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })
于 2017-08-02T20:37:53.620 回答
95

您可以(在版本 5+ 中)在创建 HttpParamaters 时使用fromObjectfromString构造函数参数,以使事情变得更容易一些

    const params = new HttpParams({
      fromObject: {
        param1: 'value1',
        param2: 'value2',
      }
    });

    // http://localhost:3000/test?param1=value1&param2=value2

或者:

    const params = new HttpParams({
      fromString: `param1=${var1}&param2=${var2}`
    });

    //http://localhost:3000/test?paramvalue1=1&param2=value2
于 2017-12-15T07:33:49.517 回答
28

你可以这样通过

let param: any = {'userId': 2};
this.http.get(`${ApiUrl}`, {params: param})
于 2018-05-15T09:42:06.757 回答
13

更简洁的解决方案:

this._Http.get(`${API_URL}/api/v1/data/logs`, { 
    params: {
      logNamespace: logNamespace
    } 
 })
于 2018-04-10T12:24:28.167 回答
8

使用 Angular 7,我在不使用 HttpParams 的情况下使用以下内容使其工作。

import { HttpClient } from '@angular/common/http';

export class ApiClass {

  constructor(private httpClient: HttpClient) {
    // use it like this in other services / components etc.
    this.getDataFromServer().
      then(res => {
        console.log('res: ', res);
      });
  }

  getDataFromServer() {
    const params = {
      param1: value1,
      param2: value2
    }
    const url = 'https://api.example.com/list'

    // { params: params } is the same as { params } 
    // look for es6 object literal to read more
    return this.httpClient.get(url, { params }).toPromise();
  }
}
于 2019-01-16T06:36:09.147 回答
4

约什拉克是对的。

在 angular.io文档,@angular/http 中的 URLSearchParams 已被弃用。相反,您应该使用来自 @angular/common/http 的 HttpParams。该代码与 joshrathke 编写的代码非常相似和相同。对于保存在一个对象中的多个参数,例如

{
  firstParam: value1,
  secondParam, value2
}

你也可以

for(let property in objectStoresParams) {
  if(objectStoresParams.hasOwnProperty(property) {
    params = params.append(property, objectStoresParams[property]);
  }
}

如果您需要继承的属性,则相应地删除 hasOwnProperty。

于 2017-11-25T13:24:08.173 回答
4

如果你有一个可以转换{key: 'stringValue'}成对的对象,你可以使用这个快捷方式来转换它:

this._Http.get(myUrlString, {params: {...myParamsObject}});

我只是喜欢传播语法!

于 2018-09-05T13:24:46.273 回答
2

RequestOptions类中URLSearchParams类型的搜索属性在Angular 4 中已弃用。相反,您应该使用URLSearchParams类型的params属性。

于 2018-02-02T09:07:17.977 回答