何时将模型用作API C#中url参数的参数

问题描述 投票:4回答:1

我在控制器中有一个返回对象列表的方法。控制器的实现并不重要。该方法称为GetAllTestsByLocationIdAndPollTypeId,并返回“Test”对象列表。 GET需要4个参数,一个locationIdpollTypeIditemsToLoad和一个字符串到search。我希望添加更多参数,并认为在URL中传递6个对象有点多。方法签名如下所示:

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

我是否应该传入包含我当前用于参数的值的模型?

编辑:我不能做一个[HttpPost],因为POST请求不会被缓存,因此可能是昂贵的,在这种情况下,将是昂贵的。

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

c# asp.net api-design
1个回答
2
投票

这完全取决于你,但是当参数增加并且具有大尺寸时标题大小可以超过,因为它是HttpGet,其中数据作为查询字符串参数在标头中发送。

您可以尝试HttpPost,因为它在body中发送数据,也使用class并且如果数据超过https则不显示参数值:

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

在这里,我假设你,你可以用你需要的param名称的公共属性创建类TestLocation或任何你喜欢的名字。

现在你需要在JSON之后发送stringify类的对象,如{'locationId':1, 'pollTypeId':1, 'itemsToLoad':10, 'search': 'your text'}并将ajax更改为post。既然你已经离开了如何从ajax打电话我把它留给你

UPDATE


根据@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

要么

您可以尝试路由和查询的组合。例如{LocationId} / {pollType} /测试?itemsToLoad = N&search = X @KirkLarkin建议

© www.soinside.com 2019 - 2024. All rights reserved.