在我正在处理的Web服务中,我需要实现一个带有/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)
问题仍然是如何实现相同参数的多个值。
答案 0 :(得分:74)
如果您将item
方法参数的类型从String
更改为List<String>
等集合,则应该会获得一个包含您要查找的所有值的集合。 / p>
@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
注释说明如下:
支持以下类型:
- 原始类型
- 具有接受单个
String
参数的构造函数的类型。- 具有名为
valueOf
且带有单个String
参数的静态方法的类型。- 醇>
List<T>
,Set<T>
或SortedSet<T>
T
满足上述2或3。
答案 1 :(得分:9)
List<String> items=ui.getQueryParameters().get("item");
其中ui
被声明为其余资源中的成员,如下所示:
@Context UriInfo ui;
缺点是它根本没有出现在方法参数中。
答案 2 :(得分:2)
axios js等一些lib在发送多值param请求时使用方括号表示法:/ stats?store [] = A&amp; store [] = B&amp; item [] = C&amp; item [] = D
要处理所有情况(使用或不使用方括号),您可以添加另一个这样的参数:
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的参数。