it-swarm.com.de

Übergeben einer Liste von int an eine HttpGet-Anforderung

Ich habe eine ähnliche Funktion wie diese:

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

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

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

Wenn ich jedoch eine Get-Anfrage für die Methode mache:

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

Beim Debuggen wird eine Fehlermeldung angezeigt, die besagt, dass listOfIds null ist. In unserem Controller haben wir eine Reihe von öffentlichen HttpGet-Methoden, die gut funktionieren. Wenn Sie den Parameter in ein einzelnes int ändern, funktioniert es. Ich habe versucht, den Parametertyp auch in int[] und IEnumerable<int> zu ändern, aber keine Änderung.

Wenn Sie jedoch den Aufruf in einen HttpPost ändern und die Liste als x-www-form-urlencoded-Wert übergeben, funktioniert die Methode.

Kann eine Liste an eine Get-Methode übergeben werden, oder muss ich Post verwenden? Da es sich nicht wirklich um eine Post-Methode handelt (da ein JSON-Modell von Werten zurückgegeben wird und nichts auf dem Server gespeichert wird).

19
StormPooper

Wenn Sie MVC WebAPI verwenden, können Sie Ihre Methode folgendermaßen definieren:

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

und dann fragen Sie wie folgt ab: blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3

dies wird mit Array [1, 2, 3] in listOfIds param übereinstimmen (und wie erwartet 3 zurückgeben)

29
Liran Brimer

Hier ist ein kurzer Hack, bis Sie eine bessere Lösung finden:

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

Bisher habe ich eine Kombination aus dem Kommentar von @oleksii und der Antwort von @ C.B, aber TryParse für die Behandlung von Fehlern und eine Nullprüfung verwendet, um es zu einem optionalen Parameter zu machen.

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

Da die Werte nicht von einem Formular übergeben werden, musste ich die Antwort @oleksii ändern, auf die von hier verwiesen wurde, um Params anstelle von Forms zu verwenden, und dies mit dem Vorschlag von @ C.B kombiniert. um die String-Werte nach int zu parsen.

Dies ermöglicht zwar den herkömmlichen listOfIds=1&listOfIds=2, erfordert jedoch immer noch das Konvertieren von Strings in Ints.

0
StormPooper