Angular 4.3 - HttpClient设置参数

Mic*_*lis 68 angular-http angular

let httpParams = new HttpParams().set('aaa', '111');
httpParams.set('bbb', '222');
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?它只设置'aaa'而不是'bbb'

另外,我有一个对象{aaa:111,bbb:222}如何在不循环的情况下设置所有值?

更新(这似乎工作,但如何避免循环?)

let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
     httpParams = httpParams.append(key, data[key]);
});
Run Code Online (Sandbox Code Playgroud)

Mic*_*lis 69

在5.0.0-beta.6之前

let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
     httpParams = httpParams.append(key, data[key]);
});
Run Code Online (Sandbox Code Playgroud)

自5.0.0-beta.6

从5.0.0-beta.6(2017-09-03)开始,他们添加了新功能(接受HttpClient头和参数的对象映射)

继续前进,可以直接传递对象而不是HttpParams.

getCountries(data: any) {
    // We don't need any more these lines
    // let httpParams = new HttpParams();
    // Object.keys(data).forEach(function (key) {
    //     httpParams = httpParams.append(key, data[key]);
    // });

    return this.httpClient.get("/api/countries", {params: data})
}
Run Code Online (Sandbox Code Playgroud)

  • @Gargoyle - 您可以将对象转换为任何`{params:<any> params}`以避免ts编译器问题 (6认同)
  • 为 null 的字符串类型参数将返回“null”并且不支持数字、布尔值和日期 (2认同)

Ric*_*ich 63

HttpParams旨在不可变.该setappend方法不修改现有的实例.相反,他们返回新实例,并应用更改.

let params = new HttpParams().set('aaa', 'A');    // now it has aaa
params = params.set('bbb', 'B');                  // now it has both
Run Code Online (Sandbox Code Playgroud)

这种方法适用于方法链:

const params = new HttpParams()
  .set('one', '1')
  .set('two', '2');
Run Code Online (Sandbox Code Playgroud)

...虽然如果你需要在条件中包装其中任何一个,这可能会很尴尬.

您的循环有效,因为您正在获取对返回的新实例的引用.您发布的代码不起作用,但没有.它只调用set()但不抓取结果.

let httpParams = new HttpParams().set('aaa', '111'); // now it has aaa
httpParams.set('bbb', '222');                        // result has both but is discarded
Run Code Online (Sandbox Code Playgroud)

  • 选择不可变的 HttpParams 是多么奇怪,这是阻塞点,应该是公认的答案 (4认同)

jon*_*rpe 39

在更新版本的@angular/common/http(5.0及更高版本中,通过它的外观),您可以使用直接传递对象的fromObjectHttpParamsOptions:

let httpParams = new HttpParams({ fromObject: { aaa: 111, bbb: 222 } });
Run Code Online (Sandbox Code Playgroud)

这只是在引擎盖下运行一个forEach循环,但是:

this.map = new Map<string, string[]>();
Object.keys(options.fromObject).forEach(key => {
  const value = (options.fromObject as any)[key];
  this.map !.set(key, Array.isArray(value) ? value : [value]);
});
Run Code Online (Sandbox Code Playgroud)


Mik*_*sky 18

至于我,链接set方法是最干净的方法

const params = new HttpParams()
.set('aaa', '111')
.set('bbb', "222");
Run Code Online (Sandbox Code Playgroud)

  • HttpParams像HttpHeaders一样是不可变的,这意味着第二个.set()调用在这种情况下不起作用.它需要在一次点击中设置,或者使用.append()方法将输出分配给新变量,就像他在更新时建议的那样. (3认同)
  • @WPalombini我刚尝试了Mike的链接集.它确实有效!我认为对于只有2个参数的人来说这很好.这很容易理解. (2认同)

Deb*_*oti 13

2个简单的替代品

没有HttpParams对象

let body = {
   params : {
    'email' : emailId,
    'password' : password
   }
}

this.http.post(url, body);
Run Code Online (Sandbox Code Playgroud)

使用HttpParams对象

let body = new HttpParams({
  fromObject : {
    'email' : emailId,
    'password' : password
  }
})

this.http.post(url, body);
Run Code Online (Sandbox Code Playgroud)


Lei*_*man 9

另一个选择是:

this.httpClient.get('path', {
    params: Object.entries(data).reduce(
    (params, [key, value]) => params.set(key, value), new HttpParams());
});
Run Code Online (Sandbox Code Playgroud)


Adn*_*liq 8

由于HTTP Params类是不可变的,因此您需要链接set方法:

const params = new HttpParams()
.set('aaa', '111')
.set('bbb', "222");
Run Code Online (Sandbox Code Playgroud)


Lah*_*hah 5

使用它可以避免循环.

// obj is the params object with key-value pair. 
// This is how you convert that to HttpParams and pass this to GET API. 

const params = Object.getOwnPropertyNames(obj)
               .reduce((p, key) => p.set(key, obj[key]), new HttpParams());
Run Code Online (Sandbox Code Playgroud)

此外,我建议在常用服务中使用HttpParams函数.因此,您可以调用该函数将对象转换为HttpParams.

/**
 * Convert Object to HttpParams
 * @param {Object} obj
 * @returns {HttpParams}
 */
toHttpParams(obj: Object): HttpParams {
    return Object.getOwnPropertyNames(obj)
        .reduce((p, key) => p.set(key, obj[key]), new HttpParams());
}
Run Code Online (Sandbox Code Playgroud)

更新:

从5.0.0-beta.6(2017-09-03)开始,他们添加了新功能(接受HttpClient头和参数的对象映射)

继续前进,可以直接传递对象而不是HttpParams.

这是另一个原因,如果您使用了上面提到的一个常见函数,例如toHttpParams,您可以轻松删除它或根据需要进行更改.