使用路由与查询字符串参数是错误的



我有一个带有两个操作的Web API控制器。一个操作返回数据库中所有实体的列表。第二个操作采用查询字符串参数并过滤实体。

搜索操作被连接到使用查询字符串参数。它有效,但是我们遇到了一个不起作用的DOC工具的问题,因为操作签名是相同的(DOC工具没有考虑查询字符串(。

将搜索参数从查询字符串移动到路由中的属性是错误的吗?这是可以接受的方法吗?我不会考虑问题的原因吗?

目前,这是我使用的URL:

domain.com/api/entities?q=xyz

我正在考虑采用基于路线的方法:

domain.com/api/entities/xyz

如果要实现搜索功能或其他类型的功能,其中您需要具有多个可选参数,则最好使用查询字符串参数。您可以提供所有这些,其中一些,或者没有任何一个,然后将它们放置在任何顺序中,并且只能工作。

// Anything Goes
/controller/action?a=123&b=456&c=789
/controller/action?c=789&a=123&b=456
/controller/action?b=456&c=789
/controller/action?c=789
/controller/action

另一方面,如果使用URL路径和路由,则只有在其右侧没有其他参数时才可以是可选的。

// OK
/controller/action/123/456/789
/controller/action/123/456
/controller/action/123
// Not OK
/controller/action/123/456/789
/controller/action/456/789
/controller/action/789

可以自定义路由以任何顺序传递可选值,但是当查询字符串自然适合这种情况时,似乎还有很长的路要走。

要考虑的另一个因素是,放入URL中是否具有需要编码的不安全字符。编码URL的 PATH 的形式很差,有时不可行,但是可以将哪些类型的编码字符的规则放入查询字符串中更加轻松。由于URL不允许空间,因此对多个单词文本搜索字段进行编码是更适合的,请与查询字符串中的空间进行编码(按原样保存(,而不是试图找到解决方案以用A-将查询时必须将其更改为服务器端的空间。

search = "foo bar"
// Spaces OK
/controller/action?search=foo%20bar  (works fine and server is able to interpret)
// Spaces Not OK
/controller/action/foo bar/    (not possible)
/controller/action/foo%20bar/  (may work, but a questionable design choice)
/controller/action/foo-bar/    (may work, but requires conversion on the server)

最后,值得考虑的另一个选择是使用帖子而不是get,因为这意味着这些值根本不需要在URL中。

相关内容

  • 没有找到相关文章

最新更新