it-roy-ru.com

Передача списка 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 является нулевым. В нашем контроллере у нас есть несколько общедоступных методов HttpGet, которые отлично работают, и при изменении параметра на единственный int он работает. Я попытался изменить тип параметра на int[] и IEnumerable<int> тоже, но без изменений.

Однако при изменении вызова на HttpPost и передаче списка в виде значения x-www-form-urlencoded метод работает.

Можно ли передать список в метод Get, или мне придется использовать Post? Поскольку на самом деле это не метод post (так как он возвращает модель значений JSON и ничего не сохраняется на сервере).

19
StormPooper

Если вы используете 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, как и ожидалось)

29
Liran Brimer

Вот быстрый взлом, пока вы не найдете лучшее решение:

  • используйте "? 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 */
    ...
4
C.B.

Пока что у меня есть комбинация комментария от @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 и объединить его с предложением @ C.B. разобрать строковые значения в int.

Хотя это позволяет использовать традиционный listOfIds=1&listOfIds=2, все же требуется преобразование строк в целые.

0
StormPooper