【问题标题】:Passing complex parameters into a GET request将复杂参数传递到 GET 请求中
【发布时间】:2017-04-12 05:07:18
【问题描述】:

我有一个名为GetCats()[HttpGet] web api 方法,它返回Cat 对象的集合。

我添加了参数skiptake 以允许分页。

但是要求已经增加,现在必须有可能进行复杂过滤,例如"PropertyName", "Value", "Type" 格式的过滤器集合。 "CatName", "Mittens", "EqualTo" 和以"PropertyName", "Direction" 格式对过滤器进行排序,例如"CatAge", "Descending".

Skip and Take 也是必需的。

构建此过滤器对象时,它可能会非常大且复杂。因此,似乎将其放入 QueryString 不再可行,尤其是在有多个过滤器的情况下,因为您需要一种方法将它们组合在一起。

我正在寻找解决方案 - 我想我可以使用 [HttpPost] 并发布过滤器,但对于 HTTP 方法来说似乎是错误的。我不确定我是否可以以某种方式将对象编码到查询字符串中并优雅地解码它。

有人可以建议解决这个问题吗?我怀疑将复杂的参数传递给 GET 以检索数据集合一定是一个常见问题。

【问题讨论】:

  • 是的,您绝对可以在查询字符串上传递一个复杂对象。默认情况下,WebAPI 期望查询字符串上的对象用于获取,而正文上的对象用于帖子。是的,如果您的网址达到容量上限,您可以随时发布您的复杂对象。
  • 这能回答你的问题吗? How to make GET request with a complex object?

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


【解决方案1】:

我认为对于大多数实际查询情况,您可以坚持使用常规查询参数。

IIS 中的默认查询字符串限制为 2048。默认情况下,这对于 40-100 个单独的查询字符串参数来说相当长,如果你保持名称简短,则更多。您也可以根据需要增加它 - IIS Request Limits

如果参数足够复杂,您可以将其转换为 JSON 并作为单个查询参数。

除非您有意识形态上的反对(例如“必须是 REST 接口”)或技术原因(例如您需要缓存并且您的 CDN 不允许缓存 POST 请求),否则发布参数没有任何问题。或者,如果您想坚持使用 GET,您可以在标头中添加更多参数(但这感觉很 hacky,不会给您带来太多收益)。

【讨论】:

  • 我认为 JSON 是查询字符串的方式。如果您要传递对象集合,问题是如何将它们放入查询字符串并展开它们,例如GetCats?property=Name&Filter=Contains&Value=Fluffy&property=Age&Filter=LessThan&property=63&SortBy=Name&Direction=Descending 您可以自定义解析它,但我认为 MVC 无法拆分所有名称/过滤器/值查询字符串(其中有重复项)并将它们放入过滤器集合中,而无需编写自定义值提供程序或相似的。谢谢。也很高兴知道请求限制 - 我没有意识到。
【解决方案2】:

对 GET 请求执行此操作的方法是查询字符串。

正如您已经提到的,对于 POST 请求,数据可以在正文中传递。

一种非正统的方法是使用 HTTP 标头并以这种方式发送一些信息,但这可能不适合某些纯粹主义者!而且它也可能会被某些网络摆弄。

您可以在设计中找到可行和可接受之间的平衡点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2012-10-22
    相关资源
    最近更新 更多