Angular 4 HttpClient 查询参数

Posted

技术标签:

【中文标题】Angular 4 HttpClient 查询参数【英文标题】:Angular 4 HttpClient Query Parameters 【发布时间】:2018-01-10 06:05:40 【问题描述】:

我一直在寻找一种使用新HttpClientModuleHttpClient 将查询参数传递到API 调用的方法,但尚未找到解决方案。使用旧的 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

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

【问题讨论】:

使用 Angular 7,您可以将参数编写为对象并像这样使用它:this.httpClient.get(url, params 查看***.com/a/54211610/5042169 【参考方案1】:

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

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

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 )

【讨论】:

第一个sn-p错了。 let params = new HttpParams(); params.set(...) 不会按预期工作。见***.com/questions/45459532/… @joshrathke 你能补充一下如何将标题和参数一起添加吗? @SavadKP 你可以像这样设置它们 this.http.get(url, headers: headers, params: params);并阅读新的 HttpHeaders,如 HttpParams 我猜 new HttpParams(fromObject: param1: 'value1', ... ); 是最简单的方法(角度 5+)然后是 params.set(...)【参考方案2】:

joshrathke 是对的。

在 angular.io docs 中写道,@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。

【讨论】:

【参考方案3】:

在创建 HttpParamaters 时,您可以(在版本 5+ 中)使用 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

【讨论】:

这不再需要了。您可以直接将 JSON 对象传递给 HttpClient。 const params = 'key': 'value' 至:http.get('/get/url', params: params ) @danger89 是的。但请注意:只允许使用字符串或字符串 [] 值! 为我节省了大量时间。我通过将查询参数作为字符串附加到请求 url 来构造 url。【参考方案4】: RequestOptions 类中 URLSearchParams 类型的

search 属性在角度 4 中已弃用。相反,您应该使用 params URLSearchParams 类型的属性。

【讨论】:

【参考方案5】:

更简洁的解决方案:

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

【讨论】:

【参考方案6】:

你可以这样传递

let param: any = 'userId': 2;
this.http.get(`$ApiUrl`, params: param)

【讨论】:

是的,但这会导致在窗口外打字 @DanLatimer 你不必使用任何,所以你可以一直使用打字直到你把它传递给params【参考方案7】:

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

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

我就是喜欢传播语法!

【讨论】:

【参考方案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();
  

【讨论】:

以上是关于Angular 4 HttpClient 查询参数的主要内容,如果未能解决你的问题,请参考以下文章

Angular httpclient 查询参数作为来自数组的批处理请求

Angular httpclient从一个数组中以批量请求的方式查询参数。

Angular 5 的 HttpClient:toPromise() 接受哪些参数?

Angular 12 Httpclient jsonp - 如何传递自定义回调参数?

Angular:如何从 httpClient 请求中获取参数并用于循环相同的请求

HttpClient 4.3连接池参数配置及源码解读