3

我需要使用 RESTEasy 设计一个 RESTful 服务。客户可以使用他们想要的任意数量的查询参数来调用这个公共服务。我的 REST 代码应该能够以某种方式读取这些查询参数。例如,如果我有图书搜索服务,客户可以拨打以下电话。

http://domain.com/context/rest/books/searchBook?bookName=someBookName
http://domain.com/context/rest/books/searchBook?authorName=someAuthor& pubName=somePublisher
http://domain.com/context/rest/books/searchBook?isbn=213243
http://domain.com/context/rest/books/searchBook?authorName=someAuthor

我必须编写一个如下所示的服务类来处理这个问题。

@Path("/books")
   public class BookRestService{

    // this is what I currently have, I want to change this method to in-take all the 
    // dynamic parameters that can come
    @GET
    @Path("/searchBook")
    public Response searchBook(@QueryParam("bookName") String bookName,@QueryParam("isbn") String isbn) {

     // fetch all such params
     // create a search array and pass to backend

    }

    @POST
    @Path("/addBook")
    public Response addBook(......) {
    //....
     }
    }

抱歉格式不好(我无法理解代码格式在这个编辑器中的工作原理!)。如您所见,我需要更改方法 searchBook() 以便它接受任意数量的查询参数。

我在这里看到了类似的帖子,但找不到正确的解决方案。

如何设计一个带有可选参数的 RESTful URL 进行搜索?

任何人都可以对此有所了解吗?

4

2 回答 2

7

在这种情况下,最好的办法是使用包含搜索条件的所有字段的 DTO。例如,您提到了 4 个不同的参数。

  1. 书名(书名)
  2. 作者姓名(作者姓名)
  3. 发布者名称 (pubName)
  4. 国际标准书号 (isbn)

为您要将参数映射到的每个属性创建一个包含具有以下注释的字段的 DTO:

public class CriteriaDTO{

  @QueryParam("isbn")
  private String isbn;
.
.

Other getter and setters of other properties

}

这是一种方法供您参考:

@GET
@Produces("application/json")
@Path("/searchBooks")
public ResultDTO search(@Form CriteriaDTO dto){
}

使用以下 URL 将自动填充 CriteriaDTO 的属性 isbn:

your.server.ip:port/URL/Mapping/searchBooks?isbn=123456789&pubName=testing

于 2014-08-23T20:43:16.770 回答
1

这里提出了一个类似的问题:How do you map multiple query parameters to the fields on Jersey GET request?

我改为使用 kensen john 的答案(UriInfo)。它允许只遍历一组以检查传递了哪些参数。

于 2012-10-24T16:19:38.570 回答