How to pass an array within a query string in HttpClient?

77,270

Solution 1

I think the best way is to add them to parameters as a string and have your back-end convert it back to an array or list.

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

Solution 2

Works on 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;

}

Result:

/api/message?page=1&per=2&order_by=name&order_direction=asc&base_object%5B%5D=2&base_object%5B%5D=1

Solution 3

You can simply do this by using JSON.stringify()

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

Solution 4

According the interface you can do that like

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

Solution 5

This worked for me.

let params = new HttpParams();

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

OR

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

actorsArray.forEach((actorName:string) =>{
  params = params.append(`actors[]`, actorName);
})
Share:
77,270
Dmitry Grinko
Author by

Dmitry Grinko

Updated on July 09, 2022

Comments

  • Dmitry Grinko
    Dmitry Grinko almost 2 years

    This is my array of actors:

    ['Elvis', 'Jane', 'Frances']
    

    How to pass this array within a query string in HttpClient?

    I tried to use:

    1)

    let params = new HttpParams();
    params = Params.append('actors[]', ['Elvis', 'Jane', 'Frances']);
    this.http.get(url, { params: Params });
    
    let params = new HttpParams().set('actors[]', ['Elvis', 'Jane', 'Frances']);
    this.http.get(url, { params: Params });
    
    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 }); 
    

    1st and 2nd snippets don't work because of TypeScript error:

    [ts] Argument of type 'string[]' is not assignable to parameter of type 'string'.

    3rd snippet sends only one item 'actors[]': 'Frances'