将复杂参数传递给GET请求

时间:2017-04-11 15:39:26

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

我有一个名为<div class="url"> <ol> <li> <a href="/home/">Home</a> </li> <li> <a href="/home/digital">Components</a> </li> <li> <a href="/home/digital/photos" class="selected">photos</a> </li> </ol> </div>的{​​{1}}网络API方法,它返回[HttpGet]个对象的集合。

我添加了参数GetCats()Cat以允许分页。

然而,要求已经增加,现在必须有复杂过滤的可能性,例如,在skip格式的过滤器集合的情况下。 take并以"PropertyName", "Value", "Type"格式对过滤条件进行排序,例如"CatName", "Mittens", "EqualTo"

还需要Skip and Take。

当构建此过滤器对象时,它可能非常大且复杂。因此,如果有多个过滤器,并且需要一种将它们组合在一起的方法,那么将其放入QueryString是不可行的是可行的。

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

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

2 个答案:

答案 0 :(得分:2)

对于大多数实际查询案例,我认为你可以坚持使用常规查询参数。

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

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

除非您有任何意识形态异议(例如&#34;必须是REST界面&#34;)或技术原因(例如您需要缓存且您的CDN不允许缓存POST请求),否则发布您的参数没有任何问题。或者如果你想坚持使用GET,你可以在标题中添加更多参数(但这感觉非常hacky并且不会给你带来太大的收获)。

答案 1 :(得分:0)

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

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

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

由您来决定在您的设计中可行的和可接受的之间取得平衡。