WebAPI - 在传递数组参数时使用POST执行GET的工作。怎么可能出错?

时间:2017-06-17 07:32:31

标签: c# asp.net asp.net-web-api

我是ASP.Net WebAPI的新手,我正在尝试使用NorthWind数据库来练习。 现在,我有一个ProductsController,其中包含GetAllProductsGetAllProductsById个动作。

在客户端,我有一个多选下拉控件,其中填充了CategoriesController类的产品类别。

我想使用在类别下拉列表中选择的Products中的Categories填充第二个下拉控件(不是多选)。

我的GetAllProductsById控制器如下所示:

 public IHttpActionResult GetAllProductsById([FromUri]int[] id)
 {
    using (var ctx = new NorthwindEntities())
    {
        <some codes...>
    }
    return Ok(productList);
 }

从客户端调用此服务,URL如下所示:http://localhost:1234/api/Products/GetAllProductsById?id=1&id=2&id=3

这看起来很好,只有很少的参数,但如果用户选择更多类别(比如说40个类别中的30个)怎么办?这意味着URL会很长。

所以,我决定使用POST通过GET装饰我的行动来执行HttpPost的工作:

 [HttpPost]
 public IHttpActionResult GetAllProductsById([FromBody]int[] id)

这允许我从我的请求正文中发送id个参数。

现在,我想知道这种风格是否正确,或者是否有人可以指出一种更清晰的方式将一长串参数从客户端传递到我的网络服务。

提前致谢。

NB:

  • 使用Elasticsearch不是以下链接中建议的选项: HTTP GET with request body
  • 我尝试使用模态类但它也具有相同的效果     http://localhost:1234/api/Products/GetAllProductsById?input.id=1&input.id=2

2 个答案:

答案 0 :(得分:1)

可以做一些有点hacky的事情:使用HTTP标头。

首先,客户端应将ID列表作为标头添加到其HTTP请求中(C#示例如下):

var webRequest = System.Net.WebRequest.Create(your_api_url);
webRequest.Headers.Add("X-Hidden-List", serialized_list_of_ids);

然后在API方面:

[HttpGet] 
public IHttpActionResult GetAllProductsById() 
{ 
    string headerValue = Request.Headers.GetValues("X-Hidden-List").FirstOrDefault(); 
    if (!string.IsNullOrEmpty(headerValue))
    {
        var results = DeserializeListAndFetch(headerValue); 
        return Ok(results); 
    }
    else
    {
        var results = ReturnEverything();
        return Ok(results);
        // or if you don't want to return everything: 
        // return BadRequest("Oops!");
    }
}

DeserializeListAndFetch(...)ReturnEverything()会进行实际的数据库查询。

答案 1 :(得分:0)

您可以在模型类中使用Id数组,并且在方法参数中只接受该类的类型。喜欢

模态类

Public class modal
{
      Public int[] Ids {get;set;}
}

你的控制器

public IHttpActionResult GetAllProductsById([FromBody] modal m)
{
//Some logic with m.Ids
}

如果您使用任何UI来使用此API,那么您的JSON

 {"Ids" :[1,2,3,4,5,6]}    

希望这有助于,