我有从浏览器以以下格式发送的查询参数

sort[0][field]:prodId
sort[0][dir]:asc


如何使用@QueryParam在服务器中检索以上参数?

从Chrome控制台

take:5
skip:0
page:1
pageSize:5
sort[0][field]:prodId
sort[0][dir]:asc

最佳答案

应该从附加在请求URL末尾的Query String中获取@QueryParam。就像是

http://host:port/app/something?key1=value2&key2=value2


然后,您可以使用value1value2

@QueryParam("key1") String value1,
@QueryParam("key2") String value2


现在,在您的帖子标题中,使用“表格”一词。如果这是您要提交的表单数据,则应考虑一些事项。将表单数据放入查询字符串中时,通常是使用不敏感的数据完成的,并且主要用于GET请求,其中的参数值用于帮助过滤以获取资源。如果这是应该存储在服务器上的敏感数据,则通常需要将POST数据作为请求主体中的表单数据,如your previous post的答案所示



更新

如果您不知道使用@QueryParam所需的键名,则可以从注入的UriInfo中获取整个查询字符串。就像是

@GET
@Path("/path/to/resource")
public Response getKendo( @Context UriInfo uriInfo) {

    MultivaluedMap params = uriInfo.getQueryParameters();
    StringBuilder builder = new StringBuilder();
    for (Object key : params.keySet()) {
        builder.append(key).append(":")
               .append(params.getFirst(key)).append("\n");
    }
    return Response.ok(builder.toString()).build();
}


getQueryParameters()将返回MultivalueMap中的所有键和值

或者,如果您知道密钥,这些密钥将显示在注释中发布的URL中

test.jsp?take=5&skip=0&page=1&pageSize=5&sort%5B0%5D%5Bfield%5D=prodId&sort%5B0%5D%5Bdir%5D=asc


那么您只需将所有这些键用于QueryParam,即

public Response getKendo(@QueryParam("take") int take,
                         @QueryParam("skip") int skip,
                         @QueryParam("page") int page,
                         @QueryParam("sort[0][field]") String field...) {
}


所有这些疯狂的东西sort%5B0%5D%5Bfield%5D就是使用特殊字符对URL进行编码的方式,但是JAX-RS会转换回其合法格式,即"sort[0][field]"

09-25 18:26