何时使用模型作为 API C# 中 url 参数的参数
When to use models as parameters over url parameters in API C#
我在控制器中有一个方法 returns 一个对象列表。控制器的实现并不重要。该方法称为 GetAllTestsByLocationIdAndPollTypeId
和 returns 'Test' 对象的列表。 GET 有 4 个参数,一个 locationId
、pollTypeId
、itemsToLoad
和一个 search
的字符串。我希望添加更多参数,并且觉得在 url 中传入 6 个对象有点多。方法签名如下所示:
[HttpGet]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId(int locationId, int pollTypeId, int itemsToLoad = 8, string search = "")
我应该传入一个包含我当前使用的参数值的模型吗?
编辑:我不能做 [HttpPost]
因为 POST
请求不会被缓存,因此可能很昂贵,在这种情况下,会很昂贵。
编辑:我使用可选参数解决了查询字符串中的过滤器问题,以减少传入的内容数量。
这完全取决于您,但是是的,当参数增加且尺寸较大时,Header 尺寸可能会超过,因为它是 HttpGet
,其中数据作为查询字符串参数在 header 中发送。
您可以尝试 HttpPost
,因为它在 body 中发送数据,还使用 class 并且如果数据通过 https:
则不显示参数值
[HttpPost]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId([FromBody]TestLocation request)
在这里我假设你,你可以创建 class TestLocation
或你喜欢的任何名称,你需要的参数名称的 public 属性。
现在你需要发送 JSON
object of class after stringify
like {'locationId':1, 'pollTypeId':1, 'itemsToLoad':10, 'search': 'your text'}
& change ajax to post.既然你已经离开了你从 ajax 打电话的方式,我就把它留给你
更新
根据@PanagiotisKanavos 的反馈(post 未缓存)和您提供的查询字符串不长的信息,您可以尝试添加如下路线:
config.Routes.MapHttpRoute("MyRoute", "{controller}/{locationId}/{pollTypeId}/{itemsToLoad}/{search}", new { controller = "Region", action = "GetCountries" })
或如果 routes/parameters 对操作方法是唯一的,则在控制器级别添加属性:
[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
建议
我在控制器中有一个方法 returns 一个对象列表。控制器的实现并不重要。该方法称为 GetAllTestsByLocationIdAndPollTypeId
和 returns 'Test' 对象的列表。 GET 有 4 个参数,一个 locationId
、pollTypeId
、itemsToLoad
和一个 search
的字符串。我希望添加更多参数,并且觉得在 url 中传入 6 个对象有点多。方法签名如下所示:
[HttpGet]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId(int locationId, int pollTypeId, int itemsToLoad = 8, string search = "")
我应该传入一个包含我当前使用的参数值的模型吗?
编辑:我不能做 [HttpPost]
因为 POST
请求不会被缓存,因此可能很昂贵,在这种情况下,会很昂贵。
编辑:我使用可选参数解决了查询字符串中的过滤器问题,以减少传入的内容数量。
这完全取决于您,但是是的,当参数增加且尺寸较大时,Header 尺寸可能会超过,因为它是 HttpGet
,其中数据作为查询字符串参数在 header 中发送。
您可以尝试 HttpPost
,因为它在 body 中发送数据,还使用 class 并且如果数据通过 https:
[HttpPost]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId([FromBody]TestLocation request)
在这里我假设你,你可以创建 class TestLocation
或你喜欢的任何名称,你需要的参数名称的 public 属性。
现在你需要发送 JSON
object of class after stringify
like {'locationId':1, 'pollTypeId':1, 'itemsToLoad':10, 'search': 'your text'}
& change ajax to post.既然你已经离开了你从 ajax 打电话的方式,我就把它留给你
更新
根据@PanagiotisKanavos 的反馈(post 未缓存)和您提供的查询字符串不长的信息,您可以尝试添加如下路线:
config.Routes.MapHttpRoute("MyRoute", "{controller}/{locationId}/{pollTypeId}/{itemsToLoad}/{search}", new { controller = "Region", action = "GetCountries" })
或如果 routes/parameters 对操作方法是唯一的,则在控制器级别添加属性:
[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
建议