Java Rest控制器请求具有多个查询参数的多个路径变量
我们如何创建一个RESTAPI(Spring控制器),允许多个路径变量具有查询参数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
其中
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)
- 路径参数:用于选择资源的参数。(你班的方法)
- 查询参数:用于发送其他信息的参数
@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控制器方法时生成这些路径变量?