51

I need to send a GET request using the $http service. One of the parameters will be an array of ids. The url looks like this one mysite.com/items?id[]=1&id[]=2&id[]=3&id[]=4

I tried this approach

$http(
  method: 'GET',
  url: '/items',
  params: {
    id: ids // ids is [1, 2, 3, 4]
  }
)

but the url I obain is mysite.com/items?id=%5B%221%22%2C%222%22%2C%223%22%2C%224%22%5D

That's Because Angular is converting my value in a JSON string. Is there a way to get the behavior I want?

[Update]

I solved the issue thanks to Jonathan's suggestion using jQuery's $.param().

$http(
  method: 'GET'
  url: '/items?' + $.param({id: ids})
)
Gio Polvara
  • 23,416
  • 10
  • 66
  • 62
  • If you are facing AngularJS specific serialization problem, then httpParamSerializerJQLike is what you need. Take a look at http://stackoverflow.com/questions/33852190/angularjs-get-ajax-call-with-array-parameters – VivekDev Nov 24 '15 at 04:49

7 Answers7

78

You can also just do

$http(
  method: 'GET',
  url: '/items',
  params: {
    "id[]": ids // ids is [1, 2, 3, 4]
  }
)

as mentioned here. Seems simpler.

Ignacio Valdivieso
  • 1,181
  • 8
  • 5
  • 3
    I like this method because on the back end (e.g. PHP), the parameter is automatically parsed as an array, avoiding the additional code step of decoding JSON. – sffc Nov 08 '14 at 16:30
  • 1
    This is the easiest way to communicate with PHP. It's giving the same result as a standard `form` would. – soyuka Nov 28 '14 at 13:46
  • Best answer yet. I'm able to manipulate the `body of the request` on the backend with Node. – AllJs Apr 21 '16 at 21:16
  • This only worked with my WebApi2 server after I decorated the array parameter like so: public HttpResponseMessage MyMethod([FromUri] int[] IDs) – CAK2 May 10 '18 at 03:41
62
$http(
  method: 'GET',
  url: '/items',
  params: {
    id: JSON.stringify(ids) // ids is [1, 2, 3, 4]
  }
)
Saad Ahmed
  • 1,077
  • 9
  • 9
10

jQuery is great but if your adding jQuery just for this then you could probably do with a non jQuery way and save some precious bytes.

Non jQuery way :

$http(
  method: 'GET',
  url: '/items',
  params: {
    id: ids.toString() //convert array into comma separated values
  }
)

On your server convert it back to an array.

Eg. in php

$ids = explode(',',Input::get('ids'));

//now you can loop through the data like you would through a regular array. 

foreach($ids as $id)
{
 //do something
}
Varun Nath
  • 5,570
  • 3
  • 23
  • 39
  • 1
    `ids.toString()` is exactly what I wanted. The other suggestions weren't serializing it into one correct query param in the format I needed: `?id=1,3,4,5` – punkrockpolly Nov 05 '15 at 21:38
  • @stensrud the question specifically talks about an array of integer ids. – Wtower Apr 20 '17 at 09:15
5

This is valid, just decode it on your backend. Almost all backend languages have a way to decode a URI. If you don't like the way that Angular is serializing it, you can try jquery's $.param().

Jonathan Rowny
  • 7,588
  • 1
  • 18
  • 26
1

you can use $httpParamSerializer or $httpParamSerializerJQLike

$http({
  method: 'GET',
  url: '/items',
  data: $httpParamSerializer({'id':[1,2,3,4]}),
})
Justin Morgan - On strike
  • 30,035
  • 12
  • 80
  • 104
Ben Hsieh
  • 340
  • 1
  • 8
1

The paramSerializer option can be set to replicate jQuery's serialization method:

$http({
  url: myUrl,
  method: 'GET',
  params: myParams,
  paramSerializer: '$httpParamSerializerJQLike'
});
Lewis
  • 3,375
  • 3
  • 29
  • 26
0

As long as you don't have too many ids, which will cause your request url to be too long depending on your configuration, the following solution will work...

Angular Service:

$http.get("website.com/api/items?ids=1&ids=2&ids=3");

WebApi Controller

[HttpGet, Route("api/items")]
public IEnumerable<Item> Get([FromUri] string[] ids)
{
}
AntAsc
  • 1
  • 1