将int列表传递给HttpGet请求

时间:2013-06-10 10:21:48

标签: c# web-services rest get http-get

我的结构与此类似:

[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模型,并且没有任何内容保存到服务器)。

5 个答案:

答案 0 :(得分:33)

如果您使用的是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 param(并按预期返回3)

答案 1 :(得分:4)

这是一个快速入侵,直到找到更好的解决方案:

  • 使用“?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 */
    ...

答案 2 :(得分:1)

如果您使用的是.Net Core,则除了@LiranBrimer:

[HttpGet("GetTotalItemsInArray")]
public ActionResult<int[]> GetTotalItemsInArray([FromQuery]int[] listOfIds)
{
       return Ok(listOfIds);
}

答案 3 :(得分:0)

到目前为止,我有@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链接的答案从here更改为使用Params而不是Forms,并将其与来自@的建议相结合CB将字符串值解析为int。

虽然这允许传统的listOfIds=1&listOfIds=2,但它仍然需要将字符串转换为整数。

答案 4 :(得分:-1)

您还可以在客户端的请求字符串中传递序列化数组,并在服务器端反序列化:

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的ID列表。 Int32.TryParse(id, out result)