何时在API C#中使用模型作为参数而不是URL参数

4

我有一个在控制器中的方法,它返回一个对象列表。控制器的实现并不重要。该方法被称为GetAllTestsByLocationIdAndPollTypeId,并返回一个'Test'对象列表。GET需要4个参数,即locationIdpollTypeIditemsToLoad和用于search的字符串。我希望添加更多参数,但在url中传递6个对象有点太多了。方法签名如下:

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

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

编辑:我不能使用[HttpPost],因为POST请求不会被缓存,因此可能很昂贵,在这种情况下也是如此。

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


"model" 是什么意思?你可以使用强类型模型类从查询参数中获取值。 - Panagiotis Kanavos
1
此外,为什么不使用路由来提供参数呢?例如{pollType}/{LocationId}/tests将是一个非常有用的路由。 - Panagiotis Kanavos
是的,一个强类型的类,其参数作为属性或字段,并将其传递到请求体中。 - Daniel Loudon
1
我的个人意见是选择使用POST方法。如果你真的关心性能,那么可以采用一种巧妙的方式来实现相同的效果。在调用API时,在客户端使用Stringly(你的对象),然后在API内部将其作为普通字符串获取并进行反序列化。 - Arunprasanth K V
说服自己的最好方法可能是看一下什么是REST https://www.restapitutorial.com/lessons/httpmethods.html - 这将帮助您了解何时使用URL参数以及何时发布数据。 - Piotr Kula
1个回答

2

这完全取决于您,但是当参数增多且具有较大的大小时,由于它是 HttpGet,数据作为查询字符串参数在标头中发送,因此标头大小可能会超过限制。

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

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

在这里,我假设你可以创建一个类TestLocation或者任何你想要的名称,并且拥有你需要的参数的公共属性。

现在,您需要在stringify后发送类的JSON对象,例如{'locationId':1, 'pollTypeId':1, 'itemsToLoad':10, 'search':'your text'},并将ajax更改为post。由于您没有提供如何从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 或者您可以尝试路由和查询的组合。例如:{LocationId}/{pollType}/Tests?itemsToLoad=N&search=X,如KirkLarkin所建议的。

我们正在使用过滤器。我们的API设计并不是最好的,我们的控制器也很大。我们的许多控制器功能可以进行重构,模型可以作为重构和删除所有不同参数组合的一种方式。 - Daniel Loudon
使用GET而不是POST是一种违反惯例的行为,甚至没有必要。查询参数可以映射到模型属性。实际上,它们可以映射到路由,使URL更加简洁和短小。 - Panagiotis Kanavos
1
这不仅仅是一个约定违规。POST请求不能被缓存,这将使得该调用非常昂贵。 - Panagiotis Kanavos
3
这个问题有些主观,但我的建议是使用路由和查询的组合。例如:{LocationId}/{pollType}/Tests?itemsToLoad=N&search=X - Kirk Larkin
1
我喜欢这种路由方法。我认为我们现在还是坚持使用标准查询字符串,但我会向团队介绍并在未来使用它。非常感谢。 - Daniel Loudon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接