2011-05-25 108 views
4

我一直在研究Java/Jersey中的小型Web服务,它从XML文件中包含的客户端读取用户信息列表。我目前在所有这些功能中除了一个方面外:在URI中使用多个参数来表示拉取多组用户信息或多组客户端信息。我有一个当前有效的版本,但不是最好的方式,也不是项目描述所要求的。在Java中以REST风格处理多个参数

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

@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****} 

第一种方法是从“{}客户”的URI表示的“客户”处理用户的列表。第二种方法在URI中传递由“{name}”表示的“用户”信息。两者都会以一个参数运作。目前,为了处理多个'用户',我将“{name}”逗号分隔为“Client/Chick-Fil-A/users/Phil,Bradley”。我可以在使用@PathParam并解析后创建这些'用户'的数组,但我认为这不是处理这种情况的最佳方式,项目描述需要不同的东西。

有没有一种方法可以通过格式为“Client/Chick-Fil-A; cd = Phil,Bradley”的URI完成相同的任务? (The; cd =是什么给了我最大的麻烦。) 我还需要能够将这种格式用于多个客户端,即“Client; cd = Chick-Fil-A,Subway/users; cd = Phil,Bradley ”。

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

回答

3

因为URL是一个保留字符,所以不能在URL路径中使用'='。然而,还有许多其他角色可用作分隔符,如' - '和','。因此,可以使用' - '而不是'='。如果你真的很想使用'=',那么你将不得不URL-encode它;不过,我强烈建议不要这样做,因为它可能会让事情变得更加复杂。

你可以看到URL字符串,这里的语法:

http://www.w3.org/Addressing/URL/url-spec.txt

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

path     void | segment [/path ] 

segment     xpalphas 

这么说,我相信HTTP请求通常仅用于请求单个资源。所以我个人的意见是不按照你实施的方式实施这项服务。对于越来越多的客户我会使用查询参数过滤器是这样的:

Client/{cName}/users?filters=<value1>,<value2> ... 

编辑:从你到了那里的商业案例,好像你可能需要像

/users?<filters> 
/clients?<filters> 

服务所以说,你想从所有的客户端让彼得则可以有这种形式的请求:

/users?name=Peter 

同样,如果你想获得杰克和皮特r从星巴克那么你可以这样做:

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

希望这会有所帮助。

+0

尽管如此,在我看来这不会影响我的目的。我需要能够从多个客户端访问多个用户,而这些查询似乎没有被这些查询处理。 – ZKSteffel 2011-05-25 19:24:04

+0

哦,我明白了,如何将客户端名称移动到查询参数呢? 所以你有类似/ users?company = &user = ? – Alvin 2011-05-25 19:33:54

+0

在与我的项目中的其他人交谈之后,我们决定尽量远离查询参数。他们可能会为这个特定的代码工作,但正如我所提到的,这个代码更像是一个概念证明。我们要编写的实际代码会更复杂,因此URI中的查询将变得过于复杂。我更期待更有效地使用@PathParam,因为@MatrixParam仅适用于URI的最后一部分。 – ZKSteffel 2011-05-25 21:11:37

2

查询字符串有以下语法,你可以有多个同名的参数:

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

其中QUERY_STRING语法如下:

field1=value1&field1=value2&field1=value3… 

欲了解更多细节,维基百科看看这个条目:http://en.wikipedia.org/wiki/Query_string

+0

我已经查看了一下查询,但是我的理解是,它们不能像我最后一个示例所需的那样在URI路径的中间使用。 – ZKSteffel 2011-05-25 16:28:37