web-dev-qa-db-de.com

Array über GET-Anfrage mit dem $ http-Dienst von AngularJS senden

Ich muss eine GET-Anfrage mit dem $http-Dienst senden. Einer der Parameter ist ein Array von IDs. Die URL sieht folgendermaßen aus: mysite.com/items?id[?==&id[?==&&[..==3&id[..=4

Ich habe diesen Ansatz ausprobiert

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

aber die URL, die ich beobachte, ist mysite.com/items?id=%5B%221%22%2C%222%22%2C%223%22%2C%224%22%5D

Weil Angular meinen Wert in eine JSON-Zeichenfolge konvertiert. Gibt es eine Möglichkeit, das gewünschte Verhalten zu erhalten?

[Update]

Ich habe das Problem dank Jonathans Vorschlag mit jQueries $.param() gelöst.

$http(
  method: 'GET'
  url: '/items?' + $.param({id: ids})
)
47
Gpx
$http(
  method: 'GET',
  url: '/items',
  params: {
    id: JSON.stringify(ids) // ids is [1, 2, 3, 4]
  }
)
60
Saad Ahmed

Sie können es auch einfach tun

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

wie erwähnt hier . Scheint einfacher.

75

jQuery ist großartig, aber wenn Sie jQuery dazu hinzufügen, könnten Sie wahrscheinlich eine andere Art von jQuery verwenden und wertvolle Bytes sparen.

Nicht jQuery Weg:  

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

Konvertieren Sie es auf Ihrem Server wieder in ein Array.

Z.B. 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
}
10
Varun Nath

Dies ist gültig, decodiere es einfach in deinem Backend. Fast alle Backendsprachen können einen URI dekodieren. Wenn Ihnen die Serialisierung von Angular nicht gefällt, können Sie $ .param () von jquery ausprobieren.

5
Jonathan Rowny

sie können $ httpParamSerializer oder $ httpParamSerializerJQLike verwenden

$http({
  method: 'GET',
  url: '/items',
  data: $httpParamSerializer({'id':[1,2,3,4]}),
})
1
Ben Hsieh

Die paramSerializer-Option kann gesetzt werden, um die Serialisierungsmethode von jQuery zu replizieren :

$http({
  url: myUrl,
  method: 'GET',
  params: myParams,
  paramSerializer: '$httpParamSerializerJQLike'
});
1
Lewis

Solange Sie nicht zu viele IDs haben, wird die Anforderungs-URL je nach Konfiguration zu lang sein.

Winkel-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)
{
}
0
AntAsc