我需要使用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?
请问有人对此有所了解吗?
答案 0 :(得分:7)
在这种情况下,最好的办法是使用包含搜索条件所有字段的DTO。例如,您提到了4个不同的参数。
创建一个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)。它允许迭代一组来检查传递了哪些参数。