WebAPI - 路由优于参数

时间:2014-08-05 13:45:25

标签: asp.net-web-api asp.net-web-api-routing

我一直在使用Web API开发Web服务,最初我只使用路由访问不同的方法,如下所示:

示例网址

http://host/api/values/param1/param2

然而,在玩了一些选项之后,我发现这并没有让我接近我需要的灵活性,使用不同的参数选项并切换到使用参数:

示例网址

http://host/api/values?p1=param1&p2=param2

我发现这比使用路线有很多优点,例如:

相同类型的参数可以映射到不同的路线:

http://host/api/values?paramX1=string&paramX2=string2

与以下路线不同:

http://host/api/values?paramY1=string&paramY2=string2

但是使用字符串路由无法区分(或者可以吗?):

无需网址编码

使用参数我可以这样做:

http://host/api/values?searchCriteria=*101* 

但不能用路线做到这一点:

http://host/api/values/*101* <-- ERROR!

更容易理解网址(意见,如果您愿意,请忽略)

知道您传入的参数是searchCriteriabookTitle可能非常有用。这似乎更基于意见,但我认为这是一个主要的好处。

考虑到这一点,我有两个问题:

为什么Web API的约定使用路由而不是查询字符串参数?

使用路由优于我刚刚缺少的查询字符串参数是否有好处?

要明确的是,我希望使用路线而不是参数来实现技术程序化的好处,而不仅仅是“我更喜欢这些”。

1 个答案:

答案 0 :(得分:1)

路由参数使网址不那么笨重,并指出这些值是网址的组成部分。

在RESTful服务中,常见的约定是使用路由参数将参数标识为URL路径的一部分。例如:

http://example.com/product-store/product/10

该URL将标识产品商店中ID为#10的产品。如果它是一个SEO友好的电子商务网站而不是Web服务,URL可能已经添加了一个额外的参数来改进搜索(Stack Overflow也这样做):

http://example.com/product-store/product/10/Microsoft-Windows-7-Professional

搜索引擎更有可能忽略查询参数,或者搜索引擎优先级较低。

但是,查询字符串参数有几个优点。

问号前面的URL路径的长度更有限。限制取决于浏览器,Web服务器甚至DNS提供程序,但建议将pre-querystring URL保持为255个字符或更少。最大完整URL长度(取决于浏览器和Web服务器)可以是2,000个字符到100,000个字符甚至更多。因此,您可以在查询字符串中传递更多数据。

正如您所提到的,由于DNS的限制,查询参数可以让您更灵活地使用您可以包含的编码/字符。

因此查询参数对于不识别资源的操作值非常有意义。例如:

http://example.com/product-store/products?instock=true&zipcode=10001&pagesize=25&orderby=last+modified