在Java中处理URI(RESTfull)中的多个参数

在Java中处理URI(RESTfull)中的多个参数,java,rest,uri,jersey,Java,Rest,Uri,Jersey,我一直在用Java/Jersey开发一个小型web服务,它从XML文件中包含的客户端读取用户信息列表。目前,除了一个方面外,我在所有方面都有这样的功能:在URI中使用多个参数来表示提取多组用户信息或多组客户端信息。我有一个版本,目前的工作,但不是最好的方式,也不是什么项目的描述要求 目前,我的代码如下所示: @Path("Client/{client}/users") public class UserPage { @GET @Produces(MediaType.TE

我一直在用Java/Jersey开发一个小型web服务,它从XML文件中包含的客户端读取用户信息列表。目前,除了一个方面外,我在所有方面都有这样的功能:在URI中使用多个参数来表示提取多组用户信息或多组客户端信息。我有一个版本,目前的工作,但不是最好的方式,也不是什么项目的描述要求

目前,我的代码如下所示:

@Path("Client/{client}/users")
public class UserPage 
    {
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String userChoice(@PathParam(value = "client") final String client) 
    {****Method here which handles a list of 'users'****}

@GET
@Path("{name}")
@Produces(MediaType.TEXT_HTML)
public String userPage(@PathParam(value = "client") final String client, @PathParam(value = "name") final String name)
    {****Method here which handles 'user' information****}
Client/{cName}/users?filters=<value1>,<value2> ...
第一个方法处理URI中由“{client}”表示的“client”中的用户列表。第二个方法在URI中提供由“{name}”表示的“用户”信息。两者都将使用一个参数运行。目前,为了处理多个“用户”,我使用“{name}”逗号分隔,如“Client/Chick-Fil-A/users/Phil,Bradley”。我可以在使用@PathParam后解析它,并创建这些“用户”的数组,但我觉得这并不是处理这个问题的最佳方式,项目描述需要一些不同的东西

有没有一种方法可以使用格式为“Client/Chick-Fil-a;cd=Phil,Bradley”的URI完成同样的任务?(给我带来最大麻烦的是;cd=) 我还需要能够对多个客户端使用此格式,即“Client;cd=Chick-Fil-A,Subway/users;cd=Phil,Bradley”

编辑:澄清项目:
客户信息包含在6个单独的文件中。这些文件中的每一个都有相同的3个用户(这是一个有效的概念证明)。我需要能够提取不同的信息子集,例如,来自麦当劳的用户Phil和Chick-Fil-A,或来自麦当劳的用户Phil和Peter,或来自所有客户端的名为Peter的用户,等等。

查询字符串具有以下语法,您可以使用相同名称的多个参数:

http://server/path/program?<query_string>

有关更多详细信息,请查看Wikipedia中的以下条目:

您不能在URL路径中使用“=”,因为它是保留字符。但是,还有许多其他字符可以用作分隔符,如“-”和“,”。因此,可以使用“-”代替“=”。如果你真的想使用“=”,那么你必须使用它;然而,我强烈建议不要这样做,因为这样做可能会使事情变得更加复杂

您可以在此处看到URL字符串的语法:

复制并搜索以下字符串以跳到路径语法:

 path                    void |  segment  [  / path ] 

 segment                 xpalphas
也就是说,我相信HTTP请求通常只用于请求单个资源。因此,我个人的意见是不要以您实施的方式实施服务。要获取多个客户端,我将使用查询参数作为过滤器,如下所示:

@Path("Client/{client}/users")
public class UserPage 
    {
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String userChoice(@PathParam(value = "client") final String client) 
    {****Method here which handles a list of 'users'****}

@GET
@Path("{name}")
@Produces(MediaType.TEXT_HTML)
public String userPage(@PathParam(value = "client") final String client, @PathParam(value = "name") final String name)
    {****Method here which handles 'user' information****}
Client/{cName}/users?filters=<value1>,<value2> ...
同样,如果你想从星巴克得到杰克和彼得,你可以:

/users?name=Peter,Jack&client=Starbucks

希望这有帮助。

我已经查过了一些查询,但是我的理解是,它们不能像我的最后示例需要那样在URI路径的中间使用。我需要能够从多个客户端访问多个用户,这似乎不是由这些查询处理的。哦,我明白了,将客户端名称也移动到查询参数中如何?所以你有一些像/users?company=&user=?在和我的项目中的其他人讨论过之后,我们决定我们需要尽量远离查询参数。它们可能适用于这个特定的代码,但正如我所提到的,这个代码更多的是一个概念证明。我们将要编写的实际代码将更加复杂,因此URI中的查询将变得过于复杂。我在寻找更有效地使用@PathParam的方法,因为@MatrixParam只对URI的最后一段有效。你知道吗,我最终不得不使用类似于你编辑的最后一个案例的东西。我想PathParam没有我想象的那么好用。。。谢谢你对URI的建议。没问题。你比我更了解你正在处理的问题,所以你会做出比我更好的决定。很高兴我的建议对你有帮助。
/users?name=Peter,Jack&client=Starbucks