何时在API C#中将模型用作参数而非url参数

时间:2018-09-19 09:13:44

标签: c# asp.net api-design

我在控制器内有一个返回对象列表的方法。控制器的实现并不重要。该方法称为GetAllTestsByLocationIdAndPollTypeId,并返回“测试”对象的列表。 GET使用4个参数,一个locationIdpollTypeIditemsToLoad和一个到search的字符串。我希望添加更多参数,并觉得在URL中传入6个对象有点过多。方法签名如下:

[HttpGet]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId(int locationId, int pollTypeId, int itemsToLoad = 8, string search = "")

我应该传递一个包含当前用于参数的值的模型吗?

编辑:我无法执行[HttpPost],因为POST请求不会被缓存,因此可能很昂贵,在这种情况下会很昂贵。

编辑:我使用可选参数解决了查询字符串中的过滤器,以减少传入的内容。

1 个答案:

答案 0 :(得分:2)

完全由您决定,但是可以,当参数增加且具有较大大小时,标题大小可能会超过,因为数据是HttpGet,其中数据作为查询字符串参数在标题中发送。

您可以尝试HttpPost,因为它在正文中发送数据,还使用类,并且如果数据通过https:则不显示参数值:

[HttpPost]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId([FromBody]TestLocation request)

在这里,我假设您可以使用需要的参数名称的公共属性来创建类TestLocation或任何您喜欢的名称。

现在,您需要在JSON之后发送stringify类的对象,例如{'locationId':1, 'pollTypeId':1, 'itemsToLoad':10, 'search': 'your text'}并更改ajax以进行发布。由于您已经离开了如何使用ajax进行通话,因此我将其留给您

更新


根据@PanagiotisKanavos的反馈(帖子未缓存)以及查询字符串不长的信息,您可以尝试添加以下路线:

config.Routes.MapHttpRoute("MyRoute", "{controller}/{locationId}/{pollTypeId}/{itemsToLoad}/{search}", new { controller = "Region", action = "GetCountries" })

或如果路由/参数对于操作方法是唯一的,则在控制器级别添加属性:

[Route("GetAllTestsByLocationIdAndPollTypeId/{locationId}/{pollTypeId}/{itemsToLoad}/{search}")]
[HttpGet]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId(int locationId, int pollTypeId, int itemsToLoad = 8, string search = "")

现在您的api调用可以像:http://localhost/controller/1/2/10/test

OR

您可以尝试将路线和查询结合起来。例如根据@KirkLarkin的建议,{LocationId} / {pollType} / Tests?itemsToLoad = N&search = X