使用RESTful URL传递不确定的查询参数并在RESTEasy中读取它们

时间:2012-05-24 09:49:57

标签: resteasy url-parameters

我需要使用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(),以便它可以使用任意数量的查询参数。

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

How to design a RESTful URL for search with optional parameters?

请问有人对此有所了解吗?

2 个答案:

答案 0 :(得分:7)

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

  1. 书名(bookName)
  2. 作者姓名(authorName)
  3. 发布商名称(pubName)
  4. ISBN(isbn)
  5. 创建一个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){
    }
    

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

    your.server.ip:端口/ URL /映射/ searchBooks ISBN = 123456789&安培; pubName =测试

答案 1 :(得分:1)

此处提出了类似的问题:How do you map multiple query parameters to the fields of a bean on Jersey GET request?

我选择了肯森约翰的回答(UriInfo)。它允许迭代一组来检查传递了哪些参数。