Asp.net web api 使用路由和查询字符串参数是错误的吗?

Asp.net web api 使用路由和查询字符串参数是错误的吗?,asp.net-web-api,asp.net-web-api2,asp.net-mvc-routing,.net-4.5,Asp.net Web Api,Asp.net Web Api2,Asp.net Mvc Routing,.net 4.5,我有一个Web API控制器,它有两个动作。一个操作返回数据库中所有实体的列表。第二个操作采用查询字符串参数并过滤实体 搜索操作已连接到使用查询字符串参数。它可以工作,但是我们遇到了一个问题,因为操作签名是相同的(文档工具没有考虑查询字符串),所以文档工具无法工作 将搜索参数从查询字符串移动到路由中的属性是否错误?这是一个可以接受的方法吗?威尔会引起我没想到的问题吗 目前,这是我使用的URL: domain.com/api/entities?q=xyz 我正在考虑采用基于路线的方法: doma

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

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

将搜索参数从查询字符串移动到路由中的属性是否错误?这是一个可以接受的方法吗?威尔会引起我没想到的问题吗

目前,这是我使用的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的路径进行编码是一种糟糕的形式,有时是不可行的,但是关于可以放入查询字符串中的编码字符类型的规则更加宽松。由于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中。

据我所知,这是完全可以接受的,可能是一种更标准的方法。您可能会发现这很有趣: