我一直在使用Web API开发Web服务,最初我只使用路由访问不同的方法,如下所示:
示例网址
http://host/api/values/param1/param2
然而,在玩了一些选项之后,我发现这并没有让我接近我需要的灵活性,使用不同的参数选项并切换到使用参数:
示例网址
http://host/api/values?p1=param1&p2=param2
我发现这比使用路线有很多优点,例如:
相同类型的参数可以映射到不同的路线:
http://host/api/values?paramX1=string¶mX2=string2
与以下路线不同:
http://host/api/values?paramY1=string¶mY2=string2
但是使用字符串路由无法区分(或者可以吗?):
无需网址编码
使用参数我可以这样做:
http://host/api/values?searchCriteria=*101*
但不能用路线做到这一点:
http://host/api/values/*101* <-- ERROR!
更容易理解网址(意见,如果您愿意,请忽略)
知道您传入的参数是searchCriteria
或bookTitle
可能非常有用。这似乎更基于意见,但我认为这是一个主要的好处。
考虑到这一点,我有两个问题:
为什么Web API的约定使用路由而不是查询字符串参数?
和
使用路由优于我刚刚缺少的查询字符串参数是否有好处?
要明确的是,我希望使用路线而不是参数来实现技术程序化的好处,而不仅仅是“我更喜欢这些”。
答案 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