我不是在问这里已经问过的问题:
@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来区分他们的信息,就像我上面举例的那样。我也很想知道这种做法背后的原因。
我给一个例子来理解我们什么时候使用@Queryparam和@pathparam
例如,我正在使用一个资源是carResource类
如果你想让你的资源方法的输入是强制性的,那么使用参数类型为@pathaparam,如果你的资源方法的输入应该是可选的,那么保持参数类型为@QueryParam
@Path("/car")
class CarResource
{
@Get
@produces("text/plain")
@Path("/search/{carmodel}")
public String getCarSearch(@PathParam("carmodel")String model,@QueryParam("carcolor")String color) {
//logic for getting cars based on carmodel and color
-----
return cars
}
}
为这个资源传递请求
req uri ://address:2020/carWeb/car/search/swift?carcolor=red
如果你给出这样的要求,资源将给出基于汽车的型号和颜色
req uri://address:2020/carWeb/car/search/swift
如果你给出这样的要求,资源方法将只显示基于快速模型的汽车
req://address:2020/carWeb/car/search?carcolor=red
如果你这样给出,我们会得到ResourceNotFound异常因为在car资源类中,我声明了carmodel为@pathPram也就是说,你必须并且应该将carmodel作为reQ uri,否则它不会将reQ传递给resource但如果你不传递颜色它也会将reQ传递给resource为什么呢因为颜色是@quetyParam,这在reQ中是可选的。
在讨论QueryParam和PathParam之前。让我们首先了解URL及其组件。URL由端点+资源+ queryParam/ PathParam组成。
例如,
URL: https://app.orderservice.com/order?order=12345678
or
URL: https://app.orderservice.com/orders/12345678
在哪里
端点:https://app.orderservice.com
资源:订单
queryParam:点= 12345678
PathParam: 12345678
@QueryParam:
当需求是基于特定的条件/标准筛选请求时,使用QueryParam。标准是用?URL中资源的后面。queryParam中可以使用&符号指定多个过滤标准。
例如:
https://app.orderser.com/orders?order=12345678 &客户名=X
@PathParam:
当需要基于guid/id选择特定的顺序时,使用PathParam。PathParam是URL中资源的一部分。
例如:
https://app.orderservice.com/orders/12345678
您可以同时支持查询参数和路径参数,例如,在资源聚合的情况下——当子资源的集合本身有意义时。
/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