休息控制器请求具有多个查询参数的多个路径变量

时间:2019-06-05 22:36:11

标签: java spring rest

我们如何创建允许多个路径变量具有查询参数的Rest API(Spring控制器)?

其中
 1)函数是路径变量,而id = functionname是查询参数
2)子函数是路径变量,而id = subfuntionname是查询参数

Request URL : /content/v1/clients/clientname/function?id=functionname&subfunction?id=subfunctionname

更新我正在使用

建议的矩阵变化

/ content / v1 / clients / clientname / function; id =功能名称/子功能; id =子功能名称
下面显示的方法无法正常工作。
方法定义应该是什么样?

 public HashMap<String, List<Model>> getContent(
        @PathVariable String clientname,            
        @MatrixVariable(name="id", pathVar="function") List<String> capabilitiesId,            
        @MatrixVariable(name="id", pathVar="subfunction") List<String> subcapabilitiesId) {

}

Error : Missing matrix variable 'id' for method parameter of type List

2 个答案:

答案 0 :(得分:0)

不可能。 在REST控制器中,您有两种类型的参数:

  • 路径参数:参数可用于选择资源。 (您课堂上的方法)

  • 查询参数:用于发送其他信息的参数。

对于您而言,我认为这是一个好主意,请使用POST或PUT http方法将所有这些信息发送到有效负载中。

如果您不能使用有效负载,则可以获得以下解决方案: 请求网址:/ content / v1 / clients / clientname / function1 / function2?id1 = functionnamec&id2 = subfunctionaname

通过这种方式,您可以使用2个路径参数和2个查询参数创建控制器:

@GET
@Path("/basePath/{funct1}/{funct2}")
public Response <methodName>(@PathParam("funct1") String funct1, @PathParam("funct2") String funct2, @QueryParam("id1") String id1, @QueryParam("id2") String id2) 

答案 1 :(得分:0)

/content/v1/clients/clientname/function?id=functionnamec&subfunction?id=subfunctionaname

URI的解析由RFC 3986定义。特别是,U+003F QUESTION MARK保留的字符,其第一个实例用作相对部分和查询之间的定界符。

因此您的示例中断将解析为

path: /content/v1/clients/clientname/function
query: id=functionnamec&subfunction?id=subfunctionaname

如果我们要解析查询,就好像它是一个application/x-www-form-urlencoded值。...

>>> import urllib.parse
>>> urllib.parse.parse_qs("id=functionnamec&subfunction?id=subfunctionaname")
{'id': ['functionnamec'], 'subfunction?id': ['subfunctionaname']}

我们看到第二个问号成为参数名称的一部分。

简而言之,它是一个完全有效的URI,但不太可能产生您期望的结果。

/content/v1/clients/clientname/function/subfunction?id=functionnamec&id=subfunctionaname

这可能是有用的,但是对于重复的id查询参数可能会有一些困惑

>>> urllib.parse.parse_qs("id=functionnamec&id=subfunctionaname")
{'id': ['functionnamec', 'subfunctionaname']}

/content/v1/clients/clientname/function/subfunction?function.id=functionnamec&subfunction.id=subfunctionaname

>>> urllib.parse.parse_qs("function.id=functionnamec&subfunction.id=subfunctionaname")
{'function.id': ['functionnamec'], 'subfunction.id': ['subfunctionaname']}

那可能更容易。

我认为从查询中取出数据并将其放在路径上是很常见的

/content/v1/clients/clientname/function/functionname/subfunction/subfunctionaname

然后提取所需的路径参数。