Angular 4 HttpClient查询参数

jos*_*hke 123 http typescript lodash angular angular-httpclient

我一直在寻找一种方式来传递查询paramters与新API调用HttpClientModuleHttpClient,还没有找到一个解决方案.使用旧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 })
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

jos*_*hke 194

我最终通过get()功能上的IntelliSense找到了它.所以,我会在这里发布给任何正在寻找类似信息的人.

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

import { HttpClient, HttpParams } from '@angular/common/http';
Run Code Online (Sandbox Code Playgroud)
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 })
}
Run Code Online (Sandbox Code Playgroud)

我实际上更喜欢这种语法,因为它更多参数不可知.我还重构了代码,使其略微缩写.

getLogs(logNamespace): Observable<any> {

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

多个参数

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

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 })
Run Code Online (Sandbox Code Playgroud)

带条件逻辑的多参数

我经常使用多个参数做的另一件事是允许使用多个参数而不需要它们存在于每个调用中.使用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 })
Run Code Online (Sandbox Code Playgroud)

  • 第一个片段是错误的.`让params = new HttpParams(); params.set(...)`将不会按预期工作.请参阅/sf/ask/3182167271/#45459672 (6认同)
  • @SavadKP你可以像这样设置this.http.get(url,{headers:headers,params:params}); 并阅读有关像HttpParams这样的新HttpHeaders (3认同)

Jay*_*ase 80

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

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

    // http://localhost:3000/test?param1=value1&param2=value2
Run Code Online (Sandbox Code Playgroud)

要么:

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

    //http://localhost:3000/test?paramvalue1=1&param2=value2
Run Code Online (Sandbox Code Playgroud)

  • 这不再需要了.您可以直接将JSON对象传递给HttpClient.`const params = {'key':'value'}`to:`http.get('/ get/url',{params:params})` (22认同)
  • @ danger89真的.但要注意:只允许字符串或字符串[]值! (6认同)

小智 11

你可以像这样传递它

let param: any = {'userId': 2};
this.http.get(`${ApiUrl}`, {params: param})
Run Code Online (Sandbox Code Playgroud)

  • 确实如此,但这会导致打字失败 (3认同)
  • @DanLatimer您不必使用任何内容,因此您可以一直使用输入,直到将其传递给“params” (2认同)

Dar*_*yne 10

更简洁的解决方案:

this._Http.get(`${API_URL}/api/v1/data/logs`, { 
    params: {
      logNamespace: logNamespace
    } 
 })
Run Code Online (Sandbox Code Playgroud)


Jun*_*711 5

使用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();
  }
}
Run Code Online (Sandbox Code Playgroud)