当使用@QueryParam VS @PathParam(When to use @QueryPar

2019-06-17 11:34发布

我不要求是已经在这里问的问题: 是什么@PathParam和@QueryParam之间的区别

这是一个“最佳做法”或公约的问题。

你什么时候会使用@PathParam VS @QueryParam

我能想到的,这个决定可能会使用两个区分信息的模式。 让我说明下面我LTPO - 不完美观察。

PathParam使用可以专供信息的类别,这将很好地落入一个信息树的一个分支。 PathParam可以用来钻取到实体类层次结构。

然而,QueryParam可以专供指定属性来定位一个类的实例。

例如,

  • /Vehicle/Car?registration=123
  • /House/Colonial?region=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 ?category+instance

@GET
@Path("/employee")
Patient getEmployee(@QueryParam("dept")Long dept, @QueryParam("id")Long id) ;

我不认为这是做这件事的标准惯例。 在那儿? 不过,我想听到人们如何使用PathParam VS QueryParam来区分他们的信息,如我上面列举。 我也很想听到的做法背后的原因。

Answer 1:

REST可能不是标准本身,而是对一般的REST文档和博客文章读了应该给你一些指导,一个很好的方式来构建API网址。 大多数的REST API往往只在道路资源名称和资源ID。 如:

/departments/{dept}/employees/{id}

一些REST API使用查询字符串过滤,分页和排序,但由于REST是不是一个严格的标准我建议你检查一些REST API的在那里如github上和计算器 ,看看有什么可以为您的使用情况下正常工作。

我建议你把任何所需参数的路径,以及任何可选参数当然应该是查询字符串参数。 在路径把可选参数最终会尝试写匹配不同的组合即URL处理程序时,变得非常杂乱。



Answer 2:

这是我做的。

如果检索基于ID的记录,例如,你需要得到其ID为15的员工的详细信息的情景,那么你可以有@PathParam资源。

GET /employee/{id}

如果你需要同时得到所有员工的详细资料,但只有10个方案中,您可以使用查询参数

GET /employee?start=1&size=10

这是说开始的员工ID 1有10分的记录。

总之,使用@PathParam基于ID检索。 用户@QueryParam的过滤器,或者如果你有用户可以通过选项进行任何固定的列表。



Answer 3:

我认为,如果该参数标识特定的实体,你应该使用路径变量。 例如,为了让我的博客,我要求所有的职位

GET: myserver.com/myblog/posts

要获得ID = 123的帖子,我会要求

GET: myserver.com/myblog/posts/123

但过滤我的职位的名单,并获得所有帖子自2013年1月1日,我会要求

GET: myserver.com/myblog/posts?since=2013-01-01

在第一个例子“上岗”标识特定的实体(博客文章的整个集合)。 在第二个例子中,“123”也表示一个特定实体(单个博客文章)。 但在最后一个例子,参数“自= 2013-01-01”是过滤柱收集不特定实体的请求。 分页和排序将是另一个很好的例子,即

GET: myserver.com/myblog/posts?page=2&order=backward

希望帮助。 :-)



Answer 4:

您可以使用查询参数进行过滤和路径参数进行分组。 下面的链接对这个好消息时使用pathParams或QueryParams



Answer 5:

我个人使用的,“如果是有意义的,要收藏URLwhich包括这些参数,然后使用PathParam用户”的做法。

例如,如果用户配置文件的URL包括一些配置文件ID参数,因为这可以由用户和被书签/或围绕电子邮件,我会包括个人资料的ID作为路径参数。 此外,另一个considerent这是该网页由包括路径PARAM不改变URL表示 - 用户将建立他/她的个人资料,保存它,然后不会带来太大变化从那里; 这意味着网络爬虫/搜索引擎/浏览器/等,可以根据道路上很好的缓存此页。

如果在URL中传递的参数可能会改变页面布局/内容,那么我会使用,作为一个queryparam。 举例来说,如果配置文件URL支持参数指定是否显示用户的电子邮件或没有,我会认为这是一个查询参数。 (我知道,可以说,你可以说, &noemail=1或任何参数也可以作为一个路径PARAM并产生2次独立的页面-一个与它的电子邮件,一个没有它-但逻辑上这不是案例:它仍然是有或没有显示某些属性相同的页面。

希望这有助于 - 我欣赏的解释可能是有点模糊:)



Answer 6:

这是一个非常有趣的问题。

您可以使用他们两个,有没有关于这个问题的任何严格的规则,但使用URI路径变量具有一定的优势:

  • 缓存 :大多数互联网上的Web缓存服务时包含查询参数不缓存GET请求。 他们这样做,因为有很多使用GET请求在服务器修改数据的RPC系统(失败!!获取必须是一个安全的方法)

但是,如果你使用路径变量,这一切服务可以缓存您的GET请求。

  • 层次 :路径变量可以表现不同层次:/城市/街道/广场

它提供了有关的数据结构中的用户的详细信息。

但是,如果你的数据不具有任何层次的关系,你仍然可以使用路径变量,用逗号或分号:

/市/经度,纬度

作为一项规则,使用逗号时的参数资料的分类,使用时的顺序并不重要分号:

/ IconGenerator /红色,蓝色,绿色

除了这些原因,也有一些情况时,这是很普遍使用的查询字符串变量:

  • 当你需要浏览器自动把HTML表单变量到URI
  • 当你正在处理算法。 例如,谷歌引擎使用查询字符串:

HTTP:// www.google.com/search?q=rest

归纳起来,有没有任何强有力的理由来使用这个方法之一,但只要你可以使用URI变量。



Answer 7:

作为席恩指出,REST不是一个标准。 但是,如果你正在寻找实现基于URI约定标准的,你可以考虑的OData URI约定 。 4版本已批准成为OASIS标准和图书馆存在的OData各种语言通过包括Java 的Apache Olingo 。 不要让事实,这是微软的产卵把你赶走,因为它是从其他行业玩家的支持获得,以及 ,其中包括红帽,思杰,IBM,黑莓,Drupal的,Netflix的Facebook和SAP

更多的采用在这里列出



Answer 8:

原因其实很简单。 当使用查询参数你可以在字符,如“/”和你的客户并不需要HTML编码它们。 还有其他的原因,但是这是一个简单的例子。 至于何时使用路径变量。 我想说,只要你是在处理IDS或者如果路径变量是查询一个方向。



Answer 9:

维基百科:统一资源定位器

的路径 ,其包含数据, 通常以分层形式组织 ,显示为用斜线分隔段的序列。

一个可选的查询 ,通过一个问号(?)从前面的部分分离,将含有非分层数据的查询字符串。

- 与URL的概念设计依据,我们可以实现一个PathParam分层数据/指令/定位器组件,或者实现QueryParam当数据是不分层。 这是有意义的,因为路径被自然有序的,而查询含有可任意有序变量(无序变量/值对)。

先前的网民写道,

我认为,如果该参数标识特定的实体,你应该使用路径变量。

另一个说,

使用@PathParam基于ID检索。 用户@QueryParam的过滤器,或者如果你有用户可以通过选项进行任何固定的列表。

另一个,

我建议你把任何所需参数的路径,以及任何可选参数当然应该是查询字符串参数。

- 然而,人们可能实行灵活的,非分级系统识别特定实体! 有人可能会对SQL表的多个唯一索引,并允许使用包括唯一索引字段的任意组合的实体被识别! 不同的组合(也许还下令不同),可以用于各种相关实体(引荐)链接。 在这种情况下,我们可能会处理非分层数据,用来识别单个的实体 - 或在其他情况下,可能只指定某些变量/域 - 唯一索引的某些组件 - 并检索列表/套的纪录。 在这种情况下,它可能是更容易,更符合逻辑,合理实施的URL为QueryParams!

能长十六进制字符串稀/减小在路径的其余部分关键字的价值? 这可能是值得考虑将变量/值路径,或在查询的潜在SEO的影响 ,并通过编辑的内容,我们是否希望用户能够穿越/探索URL的层次结构,人机接口的影响地址栏。 我的404未找到页面使用SSI变量无效的网址自动重定向到他们的父母! 搜索机器人也可能经过的路径层次。 在另一方面,就个人而言,当我分享到社交媒体的网址,我手动去掉任何私人的唯一标识符 - 通常是通过截断从URL查询,只留下路径:在这种情况下,存在将唯一标识符一些实用工具在路径中,而不是在查询中。 我们是否要方便使用路径组件的粗用户界面,也许取决于数据/组件是否是人类可读与否。 人类可读性的问题有所涉及层次的问题:常常,可以被表示为人类可读的关键字的数据也是分层; 而分层数据通常可以表示为人类可读的关键字。 (搜索引擎本身可能被定义为增强使用的网址作为用户界面。)关键字或指令的层次结构可能无法严格有序的,但它们通常是足够接近,我们可以覆盖在路径可供选择的情况下,并标注一个选项为“规范”的情况 。

基本上有几种我们可能会与网址为每个请求回答的问题:

  1. 在我们要求什么样的记录/事/服务?
  2. 哪个(些)是我们感兴趣呢?
  3. 我们如何想展示的信息/记录?

Q1几乎可以肯定是最好的覆盖路径,或PathParams。 Q3(其经由一组有序的任意可选参数和默认值可能控制); 几乎可以肯定是最好的QueryParams覆盖。 Q2:这取决于...



Answer 10:

你可以同时支持查询参数和路径参数,例如,在资源聚集的情况下 - 当子资源的收集,使自身的意义。

/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


Answer 11:

  1. @QueryParam可以用默认值标注可以方便地使用,这样就可以避免一个空指针异常,如果没有查询参数传递。

当你想从一个GET请求解析查询参数,你可以简单地定义相应的参数,以将处理GET请求,并加以注释方法@QueryParam注解

  1. @PathParam提取URI值和匹配到@Path 。 因此获取输入参数。 2.1 @PathParam可不止一个,并设置为方法的参数

     @Path("/rest") public class Abc { @GET @Path("/msg/{p0}/{p1}") @Produces("text/plain") public String add(@PathParam("p0") Integer param1, @PathParam("p1") Integer param2 ) { return String.valueOf(param1+param2); } } 

在上述例子中,
http://localhost:8080/Restr/rest/msg/{p0}/{p1}
p0匹配param1p1匹配param2 。 所以对于URI
http://localhost:8080/Restr/rest/msg/4/6
我们得到的结果10

在REST服务,JAX-RS提供@QueryParam@FormParam既用于从HTTP请求接受数据。 一个HTTP形式可以通过不同的方法,如GET和POST提交。

@QueryParam :接受GET请求和查询字符串读取数据。

@FormParam :接受POST请求和来自HTML形式或介质的任何请求取出数据



Answer 12:

我给一个exapmle做的时候,我们用它来undersand @Queryparam@pathparam

比如我正在一个种源是carResource

如果你想使你的种源法的输入manadatory然后用参数类型@pathaparam ,如果你的资源的方法的投入应是可选然后保留参数类型为@QueryParam PARAM

@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将种源给出了基于车型和颜色

 req uri://address:2020/carWeb/car/search/swift

如果给这样的REQ方法resoce将只显示迅速的基于模型车

req://address:2020/carWeb/car/search?carcolor=red

如果给这样的,我们会得到ResourceNotFound异常,因为在车种源I类声明carmodel作为@pathPram这是你必须和应该给carmodel为REQ URI否则将无法通过REQ以种源,但如果你不及格颜色也将通过REQ资源,为什么,因为颜色是@quetyParam它在REQ可选。



Answer 13:

在简单地说,

@Pathparam适用于价值通过资源和查询字符串

  • /用户/ 1
  • /用户?ID = 1

@Queryparam适用于价值只有通过查询字符串

  • /用户?ID = 1


文章来源: When to use @QueryParam vs @PathParam
标签: java rest jax-rs