我不是在问这里已经问过的问题:
@PathParam和@QueryParam有什么区别
这是一个“最佳实践”或惯例问题。
什么时候使用@PathParam vs @QueryParam。
我能想到的是,这个决定可能是用这两者来区分信息模式。让我在下面说明我的LTPO -不完美的观察。
PathParam的使用可以保留在信息类别中,这将很好地归入信息树的一个分支。PathParam可以用于下钻到实体类层次结构。
然而,QueryParam可以保留用于指定属性以定位类的实例。
例如,
/ Vehicle /车?车主= 123
/ House /克?该区域= newengland
(category) ?instance
@GET
@Path("/employee/{dept}")
Patient getEmployee(@PathParam("dept")Long dept, @QueryParam("id")Long id) ;
vs / category (instance)
@GET
@Path("/employee/{dept}/{id}")
Patient getEmployee(@PathParam("dept")Long dept, @PathParam("id")Long id) ;
vs ?类别+实例
@GET
@Path("/employee")
Patient getEmployee(@QueryParam("dept")Long dept, @QueryParam("id")Long id) ;
我不认为这样做有一个标准的惯例。是吗?然而,我想知道人们如何使用PathParam和QueryParam来区分他们的信息,就像我上面举例的那样。我也很想知道这种做法背后的原因。
这是个很有趣的问题。
你可以同时使用它们,关于这个主题没有任何严格的规则,但是使用URI路径变量有一些优点:
缓存:
大多数互联网上的web缓存服务不缓存GET请求时,他们包含查询参数。
他们这样做是因为有很多RPC系统使用GET请求来更改服务器中的数据(失败!!)Get必须是一个安全的方法)
但是如果使用路径变量,所有这些服务都可以缓存GET请求。
层次结构:
路径变量可以表示层次结构:
/城市/街道/的地方
它为用户提供了关于数据结构的更多信息。
但如果你的数据没有任何层次关系,你仍然可以使用Path变量,使用逗号或分号:
/城市/经度,纬度
作为规则,当参数的顺序重要时使用逗号,当顺序不重要时使用分号:
/ IconGenerator /红色,蓝色,绿色
除了这些原因之外,在某些情况下,使用查询字符串变量是非常常见的:
当您需要浏览器自动将HTML表单变量放入URI时
当你处理算法的时候。例如谷歌引擎使用查询字符串:
http:// www.google.com/search ? q =休息
总而言之,没有任何强烈的理由使用这种方法,但只要可以,就使用URI变量。
您可以同时支持查询参数和路径参数,例如,在资源聚合的情况下——当子资源的集合本身有意义时。
/departments/{id}/employees
/employees?dept=id
查询参数可支持分层和非分层子集设置;路径参数仅分级。
资源可以显示多个层次结构。如果要查询跨层次边界的广泛子集合,则支持短路径。
/inventory?make=toyota&model=corolla
/inventory?year=2014
使用查询参数组合正交层次结构。
/inventory/makes/toyota/models/corolla?year=2014
/inventory/years/2014?make=toyota&model=corolla
/inventory?make=toyota&model=corolla&year=2014
在组合的情况下只使用路径参数——当一个资源脱离了它的父元素就没有意义了,而且所有子元素的全局集合本身并不是一个有用的资源。
/words/{id}/definitions
/definitions?word=id // not useful