web-dev-qa-db-fra.com

Passer une liste d'int à une requête HttpGet

J'ai une fonction similaire dans la structure à ceci:

[HttpGet]
public HttpResponseMessage GetValuesForList(List<int> listOfIds)
{
    /* create model */        

    foreach(var id in listOfIds)
        model.Add(GetValueForId(id)

    /* create response for model */
    return response;
}

Cependant, lorsque je fais une requête Get pour la méthode:

{{domain}}/Controller/GetValuesForList?listOfIds=1&listOfIds=2

Je reçois une erreur lors du débogage indiquant que listOfIds est null. Notre contrôleur contient un certain nombre de méthodes HttpGet publiques qui fonctionnent correctement. Lorsque vous modifiez le paramètre en un seul int, cela fonctionne. J'ai essayé de changer le type de paramètre en int[] et IEnumerable<int> aussi, mais aucun changement.

Toutefois, lorsque vous modifiez l'appel en un HttpPost et que vous transmettez la liste en tant que valeur x-www-form-urlencoded, la méthode fonctionne.

Est-il possible de passer une liste à une méthode Get ou devrais-je utiliser Post? Comme ce n'est pas réellement une méthode de publication (car elle renvoie un modèle JSON de valeurs et que rien n'est enregistré sur le serveur).

19
StormPooper

Si vous utilisez MVC WebAPI, vous pouvez alors déclarer votre méthode comme suit:

[HttpGet]
public int GetTotalItemsInArray([FromUri]int[] listOfIds)
{
       return listOfIds.Length;
}

et puis vous interrogez comme ceci: blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3

cela fera correspondre le tableau [1, 2, 3] au paramètre listOfIds (et retournera 3 comme prévu)

29
Liran Brimer

Voici un petit hack pour trouver une meilleure solution:

  • utilisez "? listOfIds = 1,2,5,8,21,34"
  • puis:
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.

Jusqu'à présent, j'ai une combinaison du commentaire de @oleksii et de la réponse de @ C.B, mais j'utilise TryParse pour traiter les erreurs et un contrôle nul pour en faire un paramètre facultatif.

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
    }
}

Comme les valeurs ne sont pas transmises depuis un formulaire, je devais changer la réponse @oleksii liée à ici pour utiliser Params au lieu de Forms et l’associer à la suggestion de @ C.B. pour analyser les valeurs de chaîne à int.

Bien que cela permette le listOfIds=1&listOfIds=2 traditionnel, il faut toujours convertir les chaînes en entiers.

0
StormPooper