RESTful通过JAX-RS,@ QueryParam和@Consume的常见用法是什么?

时间:2013-10-07 04:11:33

标签: java web-services rest jax-rs

我是网络服务方面的新手。我的任务是将现有的软件组件转换为Web服务。我做了一些研究,我决定使用JAX-RS。我很难决定何时使用@QueryParam以及何时使用@Consume,因为它们似乎能够实现相同的目标。

例如,假设我有一个名为read()的方法,它将一本书作为参数。

public class AReader { public void read(Book book){...} }
public class Book { public String author; public String name; }

使用JAX-RS注释进行翻译时,我可以

  • 使用@POST和@QueryParam接受作者和名称参数或
  • 使用@POST和@Consumes来使用正文中XML或JSON格式的Book的文本表示。

我的问题是@QueryParam和@Consume的常见用法是什么。这只是个人偏好还是有一种常见做法?

我发现了很多关于@PathParam和@QueryParam使用的信息,但没有找到@QueryParam和@Consumes。

提前致谢...

3 个答案:

答案 0 :(得分:4)

查询参数最适合表示与资源表示无关的请求的各个方面。

例如,如果您正在设计RESTful Web服务,并且如果您通过POST请求创建新Book,那么请求的主体应该理想地包含所需媒体类型中的资源表示 - {{1 }},application/jsontext/xml等。通过查询参数提供资源表示不会涉及基于HTTP的REST API的设计方式。此外,可以省略查询参数,因此提供的资源表示是不完整的,这将违反要求在POST和PUT操作中提供完整资源表示的设计原则。

查询参数更适合GET请求。假设您想要一个分页的请求集合,那么您将接受application/x-www-form-urlencoded之类的请求来获取前10本书。

答案 1 :(得分:1)

当你说你可以使用@QueryParam和@Consumes来实现一个共同的目标时,你是对的,但要注意这些注释的语义是非常不同的。

在您的情况下,由于您只对两个值感兴趣,因此我认为这两种方法都是等价的。如果您正在处理更复杂的对象(即具有多个属性的POJO),我建议您让JAX-RS实现处理使用@Consumes和/或@Produces注释方法的对象编组/解组。

此示例代码:

@GET
@Path("/books")
public void books(@PathParam("title") String title, @PathParam("author") String author, @PathParam("ISBN") String isbn, @PathParam("category") String category, @PathParam("price") String price) {
  Book book = new Book(title, author, isbn, category, price);
  ...
}

可以缩减为

@POST
@Path("/books")
@Consumes(MediaType.APPLICATION_XML)
public void books(Book newBook) {
  Book book = newBook;
  ...
}

此外,REST架构为HTTP动词和代码带来了新的语义。根据其指南,您不应该使用@POST和@PathParam甚至@GET来修改资源。有关简要说明,请参阅此link,但请随时详细了解(您可以here开始)。

答案 2 :(得分:0)

在JAX-RS中,您可以使用@QueryParam注释将URI查询参数注入Java方法。例如,

/users/query?url=nini.com 在上面的URI模式中,查询参数是“url = nini.com”,您可以使用@QueryParam(“url”)获取url值。

==

“”http://docs.oracle.com/cd/E19776-01/820-4867/ggqqr/“”