我想知道是在URL中使用矩阵还是查询参数。我发现该主题的旧版discussion不令人满意。
示例
乍看之下,矩阵参数似乎只有优势:
paramA=val1,val2
但是也有缺点:
由于该服务的开发人员可以选择支持矩阵参数的框架,所以唯一的缺点是浏览器默认创建查询参数。
还有其他缺点吗?你会怎么做?
重要的区别在于,矩阵参数适用于特定的路径元素,而查询参数适用于整个请求。当对多个级别的资源和子资源进行复杂的REST样式查询时,这会起作用:
http://example.com/res/categories;name=foo/objects;name=green/?page=1
这实际上归结为命名空间。如果仅使用查询参数,则最终将得到诸如“ category_name”和“ object_name”之类的参数,并且您将失去由请求中参数的局部性所增加的清晰度。另外,当使用JAX-RS之类的框架时,所有查询参数都将显示在每个资源处理程序中,从而导致潜在的冲突和混乱。
如果您的查询只有一个“级别”,那么区别并不是很重要,并且两种类型的参数可以有效地互换,但是查询参数通常得到更好的支持并且得到更广泛的认可。通常,我建议您坚持使用诸如HTML表单和简单的单级HTTP API之类的查询参数。
除了Tim Sylvester's答案外,我想提供一个示例,说明如何使用[JAX-RS处理矩阵参数。
最后一个资源元素处的矩阵参数
http://localhost:8080/res/categories/objects;name=green
您可以使用@MatrixParam
批注访问它们
@MatrixParam
Response]
@GET
@Path("categories/objects")
public String objects(@MatrixParam("name") String objectName) {
return objectName;
}
但是像Javadoc的状态一样
请注意,
green
批注值是指驻留在注入了矩阵参数值的路径注释Java结构的最后匹配路径段中的矩阵参数的名称。
...使我们指向第2点
URL中间的矩阵参数
@MatrixParam
您可以使用路径变量和http://localhost:8080/res/categories;name=foo/objects;name=green
@PathParam
在任何地方访问矩阵参数。
PathSegment
Response]
PathSegment
由于矩阵参数以@GET
@Path("{categoryVar:categories}/objects")
public String objectsByCategory(@PathParam("categoryVar") PathSegment categorySegment,
@MatrixParam("name") String objectName) {
MultivaluedMap<String, String> matrixParameters = categorySegment.getMatrixParameters();
String categorySegmentPath = categorySegment.getPath();
String string = String.format("object %s, path:%s, matrixParams:%s%n", objectName,
categorySegmentPath, matrixParameters);
return string;
}
形式提供,因此您可以通过以下方式访问每个参数
object green, path:categories, matrixParams:[name=foo]
或者,如果您只需要第一个]
MultivaluedMap
将所有矩阵参数作为一个方法参数
MultivaluedMap
使用
List<String> names = matrixParameters.get("name");
全部获得
]String name = matrixParameters.getFirst("name");
Response
http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size
-太重要而不能降级为评论部分。--