我们如何创建允许多个路径变量具有查询参数的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
答案 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
然后提取所需的路径参数。