Передача списка int в запрос HttpGet
У меня есть функция, сходная по структуре с этим:
[HttpGet]
public HttpResponseMessage GetValuesForList(List<int> listOfIds)
{
/* create model */
foreach(var id in listOfIds)
model.Add(GetValueForId(id)
/* create response for model */
return response;
}
Однако, когда я делаю запрос Get для метода:
{{domain}}/Controller/GetValuesForList?listOfIds=1&listOfIds=2
Я получаю сообщение об ошибке при отладке, указывающей, что listOfIds
имеет значение null. В нашем контроллере у нас есть множество общедоступных методов HttpGet, которые работают нормально, и при изменении параметра на один int он работает. Я попытался изменить тип параметра на int[]
и IEnumerable<int>
тоже, но никаких изменений.
Однако при изменении вызова на HttpPost и передачи списка в виде значения x-www-form-urlencoded метод работает.
Можно ли передать список методу Get, или мне придется использовать Post? Поскольку это не фактически метод post (поскольку он возвращает модель значений JSON и ничего не сохраняется на сервере).
Ответы
Ответ 1
Если вы используете MVC WebAPI, вы можете объявить свой метод следующим образом:
[HttpGet]
public int GetTotalItemsInArray([FromUri]int[] listOfIds)
{
return listOfIds.Length;
}
а затем вы выполните запрос следующим образом:
blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3
это будет соответствовать массиву [1, 2, 3] в параметре listOfIds (и возвращать 3, как ожидалось)
Ответ 2
Вот быстрый хак, пока вы не найдете лучшее решение:
- use "? listOfIds = 1,2,5,8,21,34"
- затем:
GetValuesForList(string listOfIds)
{
/* [create model] here */
//string[] numbers = listOfIds.Split(',');
foreach(string number in listOfIds.Split(','))
model.Add(GetValueForId(int.Parse(number))
/* [create response for model] here */
...
Ответ 3
До сих пор у меня есть комбинация комментария @oleksii и ответа от @C.B, но с помощью TryParse для обработки ошибок и нулевой проверки, чтобы сделать его необязательным параметром.
var paramValues = HttpContext.Current.Request.Params.GetValues("listOfIds");
if (paramValues != null)
{
foreach (var id in paramValues)
{
int result;
if (Int32.TryParse(id, out result))
model.Add(GetValueForId(Add(result));
else
// error handling
}
}
Поскольку значения не передаются из формы, мне пришлось изменить ответ @oleksii, связанный с здесь, чтобы использовать Params
вместо Forms
и объединить что с предложением от @CB для синтаксического анализа строковых значений в int.
Хотя это позволяет использовать традиционный listOfIds=1&listOfIds=2
, он все равно требует преобразования строк в ints.
Ответ 4
Вы также можете передать сериализованный массив в строке запроса на клиенте и десериализовать на стороне сервера:
var listOfIds = [1,2,3,45];
var ArrlistOfIds = JSON.stringify(listOfIds);
Для строки запроса:
"MyMethod?listOfIds=" + ArrlistOfIds
И затем на стороне сервера просто десериализуйте:
public ActionResult MyMethod(string listOfIds = null)
{
List<string> arrStatus = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<string[]>(arrStatusString).ToList();
.......
}
Теперь у вас есть список идентификаторов, которые могут быть проанализированы с помощью int. Int32.TryParse(id, out result)