URL 矩阵参数与查询参数

Posted

技术标签:

【中文标题】URL 矩阵参数与查询参数【英文标题】:URL matrix parameters vs. query parameters 【发布时间】:2011-01-04 02:57:05 【问题描述】:

我想知道是否在我的网址中使用矩阵或查询参数。我发现一个较旧的discussion 对该主题不满意。

例子

带有查询参数的 URL:http://some.where/thing?paramA=1&paramB=6542 带有矩阵参数的 URL:http://some.where/thing;paramA=1;paramB=6542

乍一看矩阵参数似乎只有优点:

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

但也有缺点:

只有JAX-RS 等少数框架支持矩阵参数 当浏览器通过 GET 提交表单时,参数变为查询参数。因此,对于同一任务,它最终会得到两种参数。为了不让 REST 服务的用户感到困惑并限制服务开发人员的工作量,在这方面使用始终查询参数会更容易。

由于服务的开发者可以选择支持矩阵参数的框架,剩下的唯一缺点就是浏览器会默认创建查询参数。

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

【问题讨论】:

我不确定矩阵 URL 有什么大不了的。根据 TBL 撰写的 w3c 设计文章,这只是一个设计理念,并明确指出它不是网络的一个特性。使用它时没有实现诸如相对 URL 之类的东西。如果您想使用它,那很好;只是没有标准的使用方式,因为它不是标准。 @Steve Pomeroy:这是你提到的文章吗:w3.org/DesignIssues/MatrixURIs.html @Marcel:是的。对于那些考虑矩阵 URL 的人,请注意文档顶部的“状态:个人视图”。 矩阵参数可以有多个值吗?真的吗? 查询参数也可以有多个值:some.where/thing?paramA=1&paramA=6542 【参考方案1】:

--太重要了,不能放到评论区。--

我不确定矩阵 URL 有什么大不了的。根据 TBL 写的 w3c 设计文章,这只是一个设计理念,并明确指出它不是 Web 的功能。使用它时没有实现诸如相对 URL 之类的东西。如果您想使用它,那很好;只是没有标准的使用方式,因为它不是标准。

——Steve Pomeroy.

所以简短的回答是,如果您出于业务目的需要 RS,则最好使用请求参数。

【讨论】:

有人告诉 Angular 2 开发人员,他们认为他们是如此独特,他们需要实现这一点! @MattPileggi 我也是因为 Angular 2 而阅读这篇文章。Angular 2 的几乎每个方面都是高度专业化的、非传统的,并且与现有的使用模式不一致。尚未证明这会增加缓解价值。 所以伙计们,我也是出于同样的原因,但让我在 Angular 2 团队 github 页面上针对 url 矩阵和 google analytis 的这个问题添加一些观点:github.com/angular/angular/issues/11740 但是经过一些研究,url矩阵表示法似乎比url查询参数更易于阅读,主要是当我们需要一些中间或url的参数时(不仅在结束)。 我想每个认为这是非标准的人都不熟悉 uri 模板规范吗?在路径参数中编码复杂对象是 uri 模板的一个非常有用的特性;仅仅因为大多数人不知道或不使用它并不意味着它是 Angular 开发者为你的生活注入无用复杂性的邪恶阴谋。 Pffft - “ 是 非标准的,因此保留了我无知的可接受性”。 TBL 对一个想法做了什么或没有决定做什么在很大程度上是无关紧要的。它不是 2001 年 他的 web 的一个特性。web 的 特性 是客户端和服务器实现者选择的任何内容。如果 Angular 支持矩阵参数并且 JAX-RS 支持它们并且这些是您选择的实现工具,那么继续使用有效的工具。【参考方案2】:

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

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

这真的归结为命名空间。

注意:这里的资源“级别”是categoriesobjects

如果只对多级 URL 使用查询参数,您最终会得到

http://example.com/res?categories_name=foo&objects_name=green&page=1

这样你也会失去请求中参数的位置所增加的清晰度。此外,在使用 JAX-RS 之类的框架时,所有查询参数都会显示在每个资源处理程序中,从而导致潜在的冲突和混乱。

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

【讨论】:

无关:/? 是否代表资源? ? 启动请求的查询参数部分。与矩阵参数相反,查询参数是最常见的 URL 参数类型。问号前面的斜线确保查询参数page 不会碰到斜线前面的矩阵参数。我想如果没有附加到categories 的矩阵参数,查询参数可以在没有斜杠的情况下附加,如下所示:http://example.com/res/categories?page=1 虽然矩阵参数确实可以在任何路径段中指定,但例如 JAX-RS 不会将它们与使用 @MatrixParam 注入时附加到的路径段相关联。根据“带有 JAX-RS 2.0 的 Restful Java”,像“GET /mercedes/e55;color=black/2006/interior;color=tan”这样的请求对颜色矩阵参数的定义不明确。虽然看起来如果您单独处理每个 PathSegment,您就可以弄清楚...非常有用,但比您指定 categoryName=foo;objectName=green 需要更多的工作。【参考方案3】:

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

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

    http://localhost:8080/res/categories/objects;name=green
    

    您可以使用@MatrixParam 注释访问它们

    @GET
    @Path("categories/objects")
    public String objects(@MatrixParam("name") String objectName) 
      return objectName;
    
    

    回应

    green
    

    但就像 Javadoc 状态一样

    请注意,@MatrixParam 注释值是指矩阵参数的名称,该参数位于注入矩阵参数值的带路径注释的 Java 结构的最后匹配的路径段中。

    ...是什么让我们来到第 2 点

    网址中间的矩阵参数

    http://localhost:8080/res/categories;name=foo/objects;name=green
    

    您可以使用路径变量和@PathParam 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 的形式提供,您可以通过以下方式访问每个参数

    List<String> names = matrixParameters.get("name");
    

    或者如果你只需要第一个

    String name = matrixParameters.getFirst("name");
    

    获取所有矩阵参数作为一个方法参数

    http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size
    

    使用List&lt;PathSegment&gt; 获取所有信息

    @GET
    @Path("all/var:.+")
    public String allSegments(@PathParam("var") List<PathSegment> pathSegments) 
      StringBuilder sb =  new StringBuilder();
    
      for (PathSegment pathSegment : pathSegments) 
        sb.append("path: ");
        sb.append(pathSegment.getPath());
        sb.append(", matrix parameters ");
        sb.append(pathSegment.getMatrixParameters());
        sb.append("<br/>");
      
    
      return sb.toString();
    
    

    回应

    path: categories, matrix parameters [name=foo]
    path: objects, matrix parameters [name=green]
    path: attributes, matrix parameters [name=size]
    

【讨论】:

以上是关于URL 矩阵参数与查询参数的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV单应性矩阵发现参数估算方法详解

Tensorflow用于处理checkpoint中参数名称与矩阵数值的工具类

Tensorflow用于处理checkpoint中参数名称与矩阵数值的工具类

单应矩阵是啥?怎么用呀

springboot开启矩阵传参MatrixVariable

1. 编写一个M函数,用于计算两个矩阵的积(两个矩阵作为输入参数,不能使用矩阵乘运算符)。