动态设置HttpParams()主体

时间:2018-06-20 11:40:18

标签: typescript angular6 angular-httpclient

在Angular 5 HttpClient中,我可以通过这种方式设置HttpParams()。

const body = new HttpParams().set('email', 'test@mail.com').set('password', 'pass');

但是当我尝试以这种方式设置HttpParams()时。尚未设置值。

    let paramsMap = new Map<any,any>();
    paramsMap.set('email','test@mail.com');
    paramsMap.set('password','pass');    

    paramsMap.forEach((value: any, key: any) => {
      body.set(key, value);
    });

为什么没有设置?而我该如何以类似方式做到这一点?

3 个答案:

答案 0 :(得分:0)

API稍有不同,通过这种方式,您可以在查询字符串中发送带有参数的动态请求

let paramsMap = new Map<any,any>();
paramsMap.set('username','admin');
paramsMap.set('password','admin');

let params = new HttpParams();
paramsMap.forEach((value: any, key: any) => {
  params = params.set(key, value);
});

return this.http.request<any>('post', this.url + LOGIN_URL, { 'params': params});

如果检查HttpClient方法,则可以看到其工作原理。

第一个评论的答案:

HttpParams并非一成不变,它用于传递参数来查询字符串。 所以您需要的是这样:

let paramsMap = new Map<any,any>();
paramsMap.set('email','test@mail.com');
paramsMap.set('password','pass');   

return this.http.post<any>(this.url + LOGIN_URL, mapToObject(paramsMap));

/**
 * recursive function that receive a Map and returns a JSON object
 * @param map
 * @returns {any}
 */
function mapToObject(map) {
  const out = Object.create(null)
  map.forEach((value, key) => {
    if (value instanceof Map) {
      out[key] = mapToObject(value)
    }
    else {
      out[key] = value
    }
  });
  return out
}

答案 1 :(得分:0)

HttpParams是不可变的,因此每次使用set()方法时,它都会返回一个新实例。您可以通过更新参考来解决此问题:

const params = {
  test: 'true'
}

let httpParams = new HttpParams();

Object.keys(params).forEach(k => {
  httpParams = httpParams.set(k, params[k]);
});

console.log(httpParams.get('test'));

答案 2 :(得分:0)

试试这个:

let searchParams = new HttpParams();

for (const [k, v] of Object.entries(data)) {
  console.log(`${k}: ${v}`);
  if (v !== '' || v !== undefined) {
    searchParams = searchParams.append(k, v);
  }
}