3

我是网络服务方面的新手。我的任务是将现有的软件组件转换为 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。

提前致谢...

4

3 回答 3

4

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

例如,如果您正在设计一个 RESTful Web 服务,并且您正在通过 POST 请求创建一本新书,那么理想情况下,请求的主体应该包含所需媒体类型中的资源表示 - application/jsontext/xmlapplication/x-www-form-urlencoded。提供通过查询参数的资源表示不会符合基于 HTTP 的 REST API 的设计方式。此外,查询参数可以省略,因此提供的资源表示不完整,这将违反要求在 POST 和 PUT 操作中提供完整资源表示的设计原则。

查询参数更适合 GET 请求。假设您想要一个分页请求集合,那么您将接受/books?start=0&pagesize=10获取前 10 本书的请求。

于 2013-10-07T04:34:33.620 回答
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 一起使用来修改资源。请参阅此链接以获取简要说明,但请随时了解更多详细信息(您可以从此处开始)。

于 2013-10-07T04:22:00.457 回答
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/ ""

于 2013-10-07T04:26:24.037 回答