【问题标题】:Handling Multiple Query Parameters in Jersey在 Jersey 中处理多个查询参数
【发布时间】:2011-05-27 16:03:07
【问题描述】:

在我正在开发的 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)

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

【问题讨论】:

  • 你可以通过编写来简化你的代码:@QueryParam("store")

标签: java rest path jersey


【解决方案1】:

如果您将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 参数的类型。
  4. List&lt;T&gt;Set&lt;T&gt;SortedSet&lt;T&gt; 其中<i>T</i> 满足上述 2 或 3。

【讨论】:

  • 但是,Defining List 不起作用。我认为 ArrayList 会起到同样的作用?
  • List item 不起作用,ArrayList&lt;String&gt; item 刚刚破坏了我的代码...还有其他建议吗?
  • @ZKSteffel:不知道为什么它不起作用,因为我做了一个快速测试并且它对我有用。我将编辑我的答案以显示我使用的完整方法。你能告诉我更多关于失败的信息吗?
  • 原来我从错误的包中导入了 List,我的代码开始出现问题。它现在对我有用。感谢您的帮助!
  • @Teivere:应该是www.myurl.com/foo?item=listitem1&amp;item=listitem2
【解决方案2】:

List&lt;String&gt; items=ui.getQueryParameters().get("item");

ui 被声明为其余资源中的成员,如下所示:

@Context UriInfo ui;

缺点是它根本不出现在方法参数中。

【讨论】:

  • 虽然这张海报回答了错误的问题,但这是我在谷歌上搜索的问题,所以我必须对其进行投票,因为它对我有帮助。 @Tal 谢谢。
【解决方案3】:

像 axios js 这样的一些库在发送多值参数请求时使用方括号表示法:/stats?store[]=A&store[]=B&item[]=C&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) {
...
}

检查每个参数是否为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2013-12-14
    • 2016-05-31
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多