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

Java Rest控制器请求具有多个查询参数的多个路径变量,java,spring,rest,Java,Spring,Rest,我们如何创建一个RESTAPI(Spring控制器),允许多个路径变量具有查询参数 其中 1) 函数是路径变量,id=functionname是查询参数 2) subfunction是一个路径变量,id=SubFunctionName是查询参数 Request URL : /content/v1/clients/clientname/function?id=functionname&subfunction?id=subfunctionname 更新我正在使用建议的矩阵变体 /conte

我们如何创建一个RESTAPI(Spring控制器),允许多个路径变量具有查询参数

其中
1) 函数是路径变量,id=functionname是查询参数
2) subfunction是一个路径变量,id=SubFunctionName是查询参数

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) {
这是不可能的。 在REST控制器中,有两种类型的参数:

@GET
@Path("/basePath/{funct1}/{funct2}")
public Response <methodName>(@PathParam("funct1") String funct1, @PathParam("funct2") String funct2, @QueryParam("id1") String id1, @QueryParam("id2") String id2) 
  • 路径参数:用于选择资源的参数。(你班的方法)

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

在您的情况下,我认为这是一个好主意,使用POST或PUT http方法在有效负载内发送所有这些信息

如果无法使用有效负载,则可以获得以下解决方案: 请求URL:/content/v1/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) 
@GET
@路径(“/basePath/{funct1}/{funct2}”)
公共响应(@PathParam(“funct1”)字符串funct1、@PathParam(“funct2”)字符串funct2、@QueryParam(“id1”)字符串id1、@QueryParam(“id2”)字符串id2)
URI的解析由定义。特别是,
U+003F问号
是一个保留字符,它的第一个实例用作相对部分和查询之间的分隔符

因此,您的示例将解析为

path: /content/v1/clients/clientname/function
query: id=functionnamec&subfunction?id=subfunctionaname
如果我们要解析查询,就像它是一个
应用程序/x-www-form-urlencoded
值一样

>>> import urllib.parse
>>> urllib.parse.parse_qs("id=functionnamec&subfunction?id=subfunctionaname")
{'id': ['functionnamec'], 'subfunction?id': ['subfunctionaname']}
我们看到第二个问号成为参数名的一部分

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

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

>>> urllib.parse.parse_qs("function.id=functionnamec&subfunction.id=subfunctionaname")
{'function.id': ['functionnamec'], 'subfunction.id': ['subfunctionaname']}
这可能是可用的,但可能会对重复的id查询参数产生一些混淆

>>> urllib.parse.parse_qs("id=functionnamec&id=subfunctionaname")
{'id': ['functionnamec', 'subfunctionaname']}
/content/v1/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/clientname/function/functionname/subfunction/subfunctionaname

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

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

看起来不是有效的URL。只有一个
,然后是
&
。要求允许每个功能具有多个功能和多个子功能。如何在请求映射中实现这一点?很难理解您想要实现什么。您能回顾一下您的问题并添加更多详细信息吗?您忘记了“矩阵参数”,它几乎可以完全满足问题的要求,例如
/content/v1/clients/clientname/funtion;id=功能名称C/子功能;id=子功能名称
谢谢您的建议。使用此方法时,函数和子函数始终是常量名称。如何在定义rest控制器方法时生成这些路径变量?