在 Jersey 中处理多个查询参数

发布于 2024-11-10 06:54:02 字数 842 浏览 2 评论 0原文

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

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

In the web service I'm working on, I need to implement a URI with query parameters which look like /stats?store=A&store=B&item=C&item=D

To break it down, I need to be able to use query parameters to specify data from multiple/all stores and data for multiple/all items from those stores. So far I have been able to implement one query argument just fine in order to pull item data, but I'm lost as far as to how to implement more queries, and can't seem to find the resources I had seen before which deal with this implementation.

What I have so far in my method is along the lines of

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

which works well for one item, and will return all data if I don't type the parameter in the URI. However, I am unsure how to handle any more parameters than this.

Update:

I have figured out how to use 2 different parameters by simply adding a second argument to the method like so:

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

The question remains of how to implement multiple values of the same parameter.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

沫离伤花 2024-11-17 06:54:02

如果将 item 方法参数的类型从 String 更改为 List 等集合,您应该得到一个包含以下内容的集合:您正在寻找的所有值。

@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. ListSetSortedSet 其中 T满足上述2或3。

If you change the type of your item method parameter from String to a collection such as List<String>, you should get a collection that holds all the values you are looking for.

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

The JAX-RS specification (section 3.2) says the following regarding the @QueryParam annotation:

The following types are supported:

  1. Primitive Types
  2. Types that have a constructor that accepts a single String argument.
  3. Types that have a static method named valueOf with a single String argument.
  4. List<T>, Set<T>, or SortedSet<T> where T satisfies 2 or 3 above.
风为裳 2024-11-17 06:54:02

列表<字符串> items=ui.getQueryParameters().get("item");

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

@Context UriInfo ui;

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

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

where ui is declared as a member in the rest resource like so :

@Context UriInfo ui;

the downside is that it doesn't appear in the methods arguments at all.

心意如水 2024-11-17 06:54:02

像 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) {
...
}

检查每个参数是否为 null。

Some libs like axios js use the square brackets notation when sending a multi-value param request: /stats?store[]=A&store[]=B&item[]=C&item[]=D

To handle all cases (with or without square brackets) you can add another param like this:

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) {
...
}

Inspecting each of the arguments checking for null.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文