2013-10-07 79 views
3

我是网络服务方面的新手。我负责将现有的软件组件转换为Web服务。我做了一些研究,并决定使用JAX-RS。我很难决定何时使用@QueryParam以及何时使用@Consume,因为他们似乎能够实现相同的目标。RESTful通过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。

在此先感谢...

+0

你的意思是@Consumes? – Vidya

+0

取决于您想要提供的客户端界面。查询参数对于浏览器来说“更容易”(如果你想坚持使用HTML表单),原始的JSON或XML对于其他工具来说更简单。 – Thilo

+0

Vidya,的确,我的意思是@Consumes。这是一个错字。谢谢,我纠正了我的帖子。 – beyonddc

回答

4

查询参数是非常最适合表示什么都没有做的一个资源表示请求的各个方面。例如,如果您要设计一个REST风格的Web服务,并且您要通过POST请求创建一本新书,那么请求的主体应该理想地包含所需媒体类型的资源表示 - application/jsontext/xml,application/x-www-form-urlencoded等。通过查询参数提供资源表示不在基于HTTP的REST API的设计方式上。此外,可以省略查询参数,因此提供的资源表示不完整,这违背了需要在POST和PUT操作中提供完整资源表示的设计原则。

查询参数将更适合GET请求。假设你想分页收集请求,那么你会接受像/books?start=0&pagesize=10这样的请求来获得前10本书。

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开始)。

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/“”

相关问题