C# 将int列表传递给HttpGet请求

C# 将int列表传递给HttpGet请求,c#,web-services,rest,get,http-get,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 respon

我的功能结构与此类似:

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

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

    /* create response for model */
    return response;
}
调试时,我收到一个错误,指出
listOfIds
为空。在我们的控制器中,我们有许多公共的HttpGet方法,它们工作得很好,当将参数更改为单个int时,它就工作了。我也尝试将参数类型更改为
int[]
IEnumerable
,但没有更改

但是,当更改对HttpPost的调用并将列表作为x-www-form-urlencoded值传递时,该方法会起作用


是否可以将列表传递给Get方法,或者我必须使用Post?因为它实际上不是post方法(因为它返回值的JSON模型,并且没有任何内容保存到服务器上)。

在找到更好的解决方案之前,这里有一个快速的技巧:

  • 使用“?listOfIds=1,2,5,8,21,34”
  • 然后:
GetValuesForList(字符串列表ID)
{
/*[创建模型]此处*/
//string[]number=listOfIds.Split(',');
foreach(listOfIds.Split(',')中的字符串编号)
model.Add(GetValueForId(int.Parse(number))
/*[为模型创建响应]此处*/
...

到目前为止,我有@oleksii的注释和@C.B的答案的组合,但使用TryParse处理错误,并使用null检查将其作为可选参数

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
,但仍然需要将字符串转换为整数。

如果您使用的是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)

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

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();
    .......
}
public ActionResult MyMethod(字符串listOfIds=null)
{
List arrStatus=new System.Web.Script.Serialization.JavaScriptSerializer();
.......
}

现在,除了@LiranBrimer之外,如果您使用.Net Core,您还有一个可以解析为int.
Int32.TryParse(id,out result)

的id列表:

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

是的,我希望避免进行任何手动列表转换,但如果没有其他人有更简洁的答案,我更愿意这样做,而不是将其作为一个POST方法。谢谢看一看。发送位看起来正确,读取位需要一些调整。而且所有内容看起来都很简单。我已经尝试了您提供的第二个链接不走运,但第一个问题让我找到了一个方法,它是该URL和@C.B.的答案的组合,我在下面添加了。谢谢。我已将此设置为我接受的答案,但如果有人有更简洁的方法,请发布它,我会将你的答案标记为批准的答案。请查看@liran brimer的答案,以获得更好的解决方案。Thank you,我以前见过FromUri,但从未想过要尝试它。更改了此问题的已接受答案。链接似乎已断开,如果在示例中也有基本的客户端代码,那就太棒了。@Jon这是一个假链接(blablabla.com)…我只是给出了一个URL在客户端中的外观示例。没有特定的代码..您可以将其与jQuery、锚定标记或普通javascript一起使用..@LiranBrimer抱歉,我太愚蠢了,没有注意到这一点。我认为
FromUri
需要更改为
FromQuery
[HttpGet("GetTotalItemsInArray")]
public ActionResult<int[]> GetTotalItemsInArray([FromQuery]int[] listOfIds)
{
       return Ok(listOfIds);
}