【问题标题】:Is it wrong to use routes versus query string parameters? [closed]使用路由与查询字符串参数是错误的吗? [关闭]
【发布时间】:2018-02-28 17:47:47
【问题描述】:

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

搜索操作已连接到使用查询字符串参数。它可以工作,但我们遇到了一个文档工具无法正常工作的问题,因为操作签名相同(文档工具不考虑查询字符串)。

将搜索参数从查询字符串移动到路由中的属性是否有问题?这是一种可接受的方法吗?会导致我没有考虑的问题吗?

目前,这是我使用的网址:

domain.com/api/entities?q=xyz

我正在考虑转向基于路线的方法:

domain.com/api/entities/xyz

【问题讨论】:

标签: asp.net-web-api asp.net-web-api2 asp.net-mvc-routing .net-4.5


【解决方案1】:

如果您要实现搜索功能或其他需要多个可选参数的功能,最好使用查询字符串参数。您可以提供全部、部分或不提供,并将它们按任何顺序排列,这样就可以了。

// 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

customizing routing to be able to pass optional values in any order 有可能,但是当查询字符串自然适合这种情况时,这似乎还有很长的路要走。

另一个需要考虑的因素是放入 URL 中的值是否包含需要编码的 unsafe characters。对 URL 的 path 进行编码是一种糟糕的形式,有时是不可行的,但是对于可以将哪些类型的编码字符放入查询字符串的规则更加宽松。由于 URL 不允许使用空格,因此更适合使用查询字符串中的空格对多字文本搜索字段进行编码(按原样保留),而不是尝试找到用空格替换空格的解决方案- 放入查询字符串,然后在运行查询时必须将其更改回服务器端的空格。

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)

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

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多