2011-05-27 70 views
36

在Web服务我的工作,我需要实现一个与URI查询参数看起来像/stats?store=A&store=B&item=C&item=D处理多个查询参数泽西

要打破它,我需要能够使用查询参数指定来自多个/所有商店的数据和来自这些商店的多个/所有商品的数据。到目前为止,我已经能够实现一个查询参数,以便拉取项目数据,但是我失去了如何实现更多查询,并且似乎无法找到我之前见过的资源与此实现。

我至今在我的方法沿着

@GET 
@Path("stats") 
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item) 
{ 
    /**Run data using item as variable**/ 
    return someStringOfData 
} 

这对于一个项目运作良好,并且将返回所有的数据,如果我不键入URI参数的线条。但是,我不确定如何处理更多的参数。

更新

我已想出如何通过简单地添加第二个参数的方法,像这样使用2个不同的参数:

public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store, 
    @DefaultValue("All") @QueryParam(value = "item") final String item) 

问题仍然如何实现多个值的相同参数。

+1

您可以通过编写来简化您的代码:@QueryParam(“store”) – Vincent 2013-01-11 07:28:52

回答

71

如果将item方法参数的类型从String更改为诸如List<String>的集合,则应该得到一个集合,该集合包含要查找的所有值。

@GET 
@Path("/foo") 
@Produces("text/plain") 
public String methodImCalling(@DefaultValue("All") 
           @QueryParam(value = "item") 
           final List<String> item) { 
    return "values are " + item; 
} 

的JAX-RS规范(3.2节)表示关于@QueryParam注解如下:

的支持以下类型:
  1. 基本类型
  2. 具有一个接受构造类型一个String参数。
  3. 类型具有名为valueOf的静态方法,其中有一个参数String。其中T满足以上2或3。
+0

定义列表不起作用。我认为ArrayList 将用于相同的目的? – ZKSteffel 2011-05-27 18:21:54

+0

'List item'没有工作,'ArrayList item'只是打破了我的代码...任何其他建议? – ZKSteffel 2011-05-27 19:06:59

+0

@ZSteffel:不知道为什么它不起作用,因为我做了一个快速测试,它为我工作。我将编辑我的答案以显示我使用的完整方法。你能给我更多关于失败的信息吗? – stand 2011-05-27 19:38:21

10

List<String> items=ui.getQueryParameters().get("item");

其中ui声明为在像这样剩下的资源的成员:

@Context UriInfo ui; 

的缺点是,它根本不会出现在方法的参数。

+1

虽然这张海报回答了错误的问题,但是这是我Google搜索的问题,所以我必须对它进行提示,因为它对我有帮助。 @Tal谢谢。 – JSager 2013-10-18 20:00:25

2

像axios js这样的一些库在发送多值参数请求时使用方括号表示法:/ stats?存储[] = A &商店[] = B &项[] = C &项[] = d

为了处理所有的情况下(有或没有方括号),则可以添加其他PARAM这样的:

public String methodImCalling(
    @QueryParam(value = "store") final List<String> store, 
    @QueryParam(value = "store[]") final List<String> storeWithBrackets, 
    @QueryParam(value = "item") final List<String> item, 
    @QueryParam(value = "item[]") final List<String> itemWithBrackets) { 
... 
} 

检查每个检查null的参数。