从REST GET服务调用

时间:2016-03-10 21:09:38

标签: java spring rest spring-mvc

有没有办法在不解析整个查询字符串的情况下获取它?如:

http://localhost:8080/spring-rest/ex/bars?id=100,150&name=abc,efg

我希望得到一切关注?作为一个字符串。是的我稍后会解析它,但这允许我的控制器和所有后续代码更通用。

到目前为止,我已尝试使用@PathParam,@ RequestParam以及@Context UriInfo,结果如下。但我似乎无法得到整个字符串。这就是我想要的:

id=100,150&name=abc,efg

使用curl @PathParam

  

http://localhost:8080/spring-rest/ex/bars/id=100,150&name=abc,efg

产生id = 100,150

  @GET
  @Produces(MediaType.TEXT_PLAIN)
  @Path("/spring-rest/ex/qstring/{qString}")
  public String getStuffAsParam ( @PathParam("qstring") String qString) { 
         ...
  }

使用

的@RequestParam
  

http://localhost:8080/spring-rest/ex/bars?id=100,150&name=abc,efg

表示名字未被识别。

  

http://localhost:8080/spring-rest/ex/bars?id=100,150;name=abc,efg

产生异常。

  @GET
  @Produces(MediaType.TEXT_PLAIN)
  @Path("/spring-rest/ex/qstring")
  public String getStuffAsMapping (@RequestParam (value ="qstring", required = false) String[] qString) { 
    ...
  }

编辑 - 下面的方法是我喜欢的东西。

这几乎可以。它没有在MultivaluedMap中给我完整的查询字符串。它只给了我第一个字符串到&amp ;.我曾尝试使用其他字符作为分隔符但仍然无法正常工作。我需要将此字符串置于未解码状态。

使用UriInfo的@Context

  

http://localhost:8080/spring-rest/ex/bars?id=100,150&name=abc,efg

为queryParams id = [100,150]赋值。 name = 部分再次被截断。

  @GET
  @Produces(MediaType.TEXT_PLAIN)
  @Path("/spring-rest/ex/qstring")
  public String getStuffAsMapping (@Context UriInfo query) { 
      MultivaluedMap<String, String> queryParams = query.getQueryParameters();
    ...
  }

我认为正在解码的查询字符串是我真正不想要的。我如何获得整个字符串?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

您应该查看支持的参数列表:

https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-methods

在您的情况下,您可以添加HttpServletRequest参数并致电getQueryString()

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/spring-rest/ex/qstring")
public String getStuffAsMapping(HttpServletRequest request) { 
    String query = request.getQueryString();
    ...
}

另一种方法是使用@Context UriInfo,然后调用UriInfo.getRequestUri(),然后调用URI.getQuery()

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/spring-rest/ex/qstring")
public String getStuffAsMapping(@Context UriInfo uriInfo) { 
    String query = uriInfo.getRequestUri().getQuery();
    ...
}

答案 1 :(得分:1)

我会选择

http://localhost:8080/spring-rest/ex/bars?id=100,150;name=abc,efg

并拥有此RequestMapping

@RequestMapping(value="/spring-rest/ex/bars")
public String getStuffAsParam(@RequestParam("id")String id, @RequestParam("name")String name)

答案 2 :(得分:1)

如果您需要访问原始查询,则需要从请求对象获取它。请参阅此旧问题以访问它。尽管答案未被接受,但这是一个很好的研究回应。

Spring 3 MVC accessing HttpRequest from controller

以下代码段应在您获得HttpServletRequest访问权后提供查询字符串

broadcast_rpc_address

我发布此消息后,我看到@Andreas发布了类似的答案。如果解决方案可以帮助您,请接受他的回答。