如何在HttpClient中的查询字符串中传递数组?

Dmi*_*nko 13 parameters angular

这是我的演员阵列:

['Elvis', 'Jane', 'Frances']
Run Code Online (Sandbox Code Playgroud)

如何在HttpClient中的查询字符串中传递此数组?

我试着用:

1)

let params = new HttpParams();
params = Params.append('actors[]', ['Elvis', 'Jane', 'Frances']);
this.http.get(url, { params: Params });
Run Code Online (Sandbox Code Playgroud)

2)

let params = new HttpParams().set('actors[]', ['Elvis', 'Jane', 'Frances']);
this.http.get(url, { params: Params });
Run Code Online (Sandbox Code Playgroud)

3)

let Params = new HttpParams();
Params = Params.append('actors[]', 'Jane');
Params = Params.append('actors[]', 'Elvis');
Params = Params.append('actors[]', 'Frances');
this.http.get(url, { params: Params }); 
Run Code Online (Sandbox Code Playgroud)

1和2不起作用,因为打字稿给出:

[ts]'string []'类型的参数不能分配给'string'类型的参数.

3只发送一个项目'actors []':'Frances'

Ven*_*omy 24

我认为最好的方法是将它们添加到参数作为a string并让你的后端将其转换回arraylist.

let actorList = ['Elvis', 'Jane', 'Frances']
let params = new HttpParams();
params = params.append('actors', actorList.join(', '));
this.http.get(url, { params: params });
Run Code Online (Sandbox Code Playgroud)

  • 这是一个糟糕的解决方案。应该有一种方法可以用数组发送请求,就像在 angularJS 中一样 (15认同)
  • 这不是一个糟糕的解决方案。它取决于用例,但这里的所有答案都是。由于没有在查询字符串中传递数组的定义标准,因此您始终必须将发送它们的格式与后端期望的格式相匹配。如果后端尚未定义处理数组值的方法,则您必须添加自己的方法。在这种情况下,这是一种快速且简单的方法。 (2认同)

Rez*_*eza 9

您可以简单地使用 JSON.stringify()

    let params = new HttpParams();
    const actors = ['Elvis', 'Jane', 'Frances'];
    params.append('actors', JSON.stringify(actors);
    this.http.get(url, { params });
Run Code Online (Sandbox Code Playgroud)


小智 7

const actors = ['Elvis', 'Jane', 'Frances'];
let params = new HttpParams();
for (const actor of actors) {
  params = params.append('actors', actor);
}

this.http.get(url, { params: params }); 
Run Code Online (Sandbox Code Playgroud)


小智 6

适用于Angular 6.0.6:

private getParams(query) {
let params: HttpParams = new HttpParams();
for (const key of Object.keys(query)) {
  if (query[key]) {
    if (query[key] instanceof Array) {
      query[key].forEach((item) => {
        params = params.append(`${key.toString()}[]`, item);
      });
    } else {
      params = params.append(key.toString(), query[key]);
    }
  }
}
return params;
Run Code Online (Sandbox Code Playgroud)

}

结果:

/api/message?page=1&per=2&order_by=name&order_direction=asc&base_object%5B%5D=2&base_object%5B%5D=1
Run Code Online (Sandbox Code Playgroud)

  • 在尝试了其他一切之后,这是唯一对我有用的解决方案。谢谢你。我不想修改后端,很惊讶 angular 不支持开箱即用 (5认同)

Ife*_*kwu 6

这对我有用。

let params = new HttpParams();

['Elvis', 'Jane', 'Frances'].forEach((actorName:string) =>{
  params = params.append(`actors[]`, actorName);
})
Run Code Online (Sandbox Code Playgroud)

或者

let params = new HttpParams();
let actorsArray:Array<string> = ['Elvis', 'Jane', 'Frances'];

actorsArray.forEach((actorName:string) =>{
  params = params.append(`actors[]`, actorName);
})
Run Code Online (Sandbox Code Playgroud)


con*_*ant 5

根据界面你可以这样做

const params = new HttpParams({ 
   fromObject: { 'actors[]': ['Elvis', 'Jane', 'Frances'] } 
});
this.http.get(url, { params });
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,它有效,但没有括号 const params = new HttpParams({ fromObject: { 'actors': ['Elvis', 'Jane', 'Frances'] } }); this.http.get(url, { params }); (4认同)