URL矩阵参数与查询参数

问题描述 投票:172回答:3

我想知道是在URL中使用矩阵还是查询参数。我发现该主题的旧版discussion不令人满意。

示例

乍看之下,矩阵参数似乎只有优势:

  • 更具可读性
  • 不需要在XML文档中编码和解码“&”
  • 带有“?”的网址在许多情况下不会被缓存;具有矩阵参数的URL被缓存
  • 矩阵参数可以出现在路径的任何地方,并且不限于其结尾
  • 矩阵参数可以具有多个值:paramA=val1,val2

但是也有缺点:

  • JAX-RS之类的少数框架支持矩阵参数
  • [当浏览器通过GET提交表单时,参数变为查询参数。因此,对于同一任务,它以两种参数结束。为了不混淆REST服务的用户并限制服务开发人员的工作量,在此区域中使用始终查询参数会更容易。

由于该服务的开发人员可以选择支持矩阵参数的框架,所以唯一的缺点是浏览器默认创建查询参数。

还有其他缺点吗?你会怎么做?

http url rest parameters jax-rs
3个回答
206
投票

重要的区别在于,矩阵参数适用于特定的路径元素,而查询参数适用于整个请求。当对多个级别的资源和子资源进行复杂的REST样式查询时,这会起作用:

http://example.com/res/categories;name=foo/objects;name=green/?page=1

这实际上归结为命名空间。如果仅使用查询参数,则最终将得到诸如“ category_name”和“ object_name”之类的参数,并且您将失去由请求中参数的局部性所增加的清晰度。另外,当使用JAX-RS之类的框架时,所有查询参数都将显示在每个资源处理程序中,从而导致潜在的冲突和混乱。

如果您的查询只有一个“级别”,那么区别并不是很重要,并且两种类型的参数可以有效地互换,但是查询参数通常得到更好的支持并且得到更广泛的认可。通常,我建议您坚持使用诸如HTML表单和简单的单级HTTP API之类的查询参数。


13
投票

除了Tim Sylvester's答案外,我想提供一个示例,说明如何使用[JAX-RS处理矩阵参数。

  1. 最后一个资源元素处的矩阵参数

    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点

  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
  3. 将所有矩阵参数作为一个方法参数

  4. 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
    

10
投票

-太重要而不能降级为评论部分。--

© www.soinside.com 2019 - 2024. All rights reserved.