2013-11-13 3 views
47

Мне нужно отправить запрос GET с помощью службы $http. Одним из параметров будет массив идентификаторов. URL выглядит следующим образом один mysite.com/items?id[]=1 & ид [] = 2 & идентификатор [] = 3 & идентификатор [] = 4

Я попробовал этот подход

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

но URL я obain является mysite.com/items?id=%5B%221%22%2C%222%22%2C%223%22%2C%224%22%5D

это потому Угловое преобразование моего значения в строку JSON. Есть ли способ получить поведение, которое я хочу?

[Update]

Я решил вопрос благодаря предложению Джонатана с помощью JQuery-х $.param().

$http(
    method: 'GET' 
    url: '/items?' + $.param({id: ids}) 
) 
+0

Если вы столкнулись с проблемой AngularJS конкретной сериализации, то httpParamSerializerJQLike является то, что вам нужно. Взгляните на http: // stackoverflow.com/questions/33852190/angularjs-get-ajax-call-with-array-parameters – VivekDev

ответ

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

Мне нравится этот ответ больше, чем мой. –

+1

Ни один из этих подходов не работает для меня до сих пор с задней частью WebApi. попробовал JSON.stringify, 'myvariable []', попробовав ручную строку join next –

+0

. И это не работает для меня. также имеют свой собственный веб-интерфейс API. Получили ли вы его работу @SonicSoul – Vucko

5

Это действительно, просто расшифруйте его на своем сервере. Почти все бэкэнд-языки имеют способ декодирования URI. Если вам не нравится, как Angular сериализует его, вы можете попробовать jquery $ .param().

+0

Я знаю, что это действительно так, я просто хотел избежать преобразования. – Gpx

+0

$ .param() должен дать вам несколько другую структуру после декодирования, больше похожую на то, что вы хотите. Вы не можете кодировать URI, это необязательно. Если вы этого не сделаете, браузер будет. –

+1

Да, вы правы с $ .param(), он работает. Спасибо за помощь. – Gpx

10

JQuery является большим, но если ваше добавление JQuery только для этого, то вы, вероятно, можете сделать с не способом JQuery и сохранить драгоценные байты.

Non JQuery путь:

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

На сервере преобразовать его обратно в массив.

Например. В 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 
} 
+1

'ids.toString()' это именно то, что я хотел. Другие предложения не сериализовали его в один правильный параметр запроса в формате, который мне нужен: '? Id = 1,3,4,5' – punkrockpolly

+0

Просто надейтесь, что сами значения не содержат запятую ... – stensrud

+0

@stensrud в конкретном вопросе речь идет о массиве целочисленных идентификаторов. – Wtower

70

Вы также можете просто сделать

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

как упомянуто here. Кажется проще.

+3

Мне нравится этот метод, потому что на задней части (например, PHP) параметр автоматически анализируется как массив, избегая дополнительного кода для декодирования JSON. – sffc

+1

Это самый простой способ общения с PHP. Это дает тот же результат, что и стандартная форма. – soyuka

+0

Лучший ответ, работает с рельсами тоже. – madeinstefano

1

вы можете использовать $ httpParamSerializer или $ httpParamSerializerJQLike

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

Если вы не используете, например, CoffeeScript, это недопустимо JS. Вы имели в виду опустить скобки '{}'? –

0

До тех пор, пока вы не слишком много идентификаторов, которые будут вызывать ваш запрос URL слишком много времени в зависимости от конфигурации, следующее решение будет работа ...

Угловая служба:

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

WebAPI контроллер

[HttpGet, Route("api/items")] 
public IEnumerable<Item> Get([FromUri] string[] ids) 
{ 
} 
Смежные вопросы