首页 文章

URL矩阵参数与请求参数

提问于
浏览
163

我想知道是否在我的URL中使用矩阵或查询参数 . 我发现这个话题的年龄较大discussion并不令人满意 .

例子

带查询参数的

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

  • 更具可读性

  • 不需要在XML文档中编码和解码"&"
    带有"?"的

  • 网址在很多情况下都没有缓存;具有矩阵参数的URL被缓存

  • 矩阵参数可以出现在路径中的任何位置,并且不限于其末尾

  • 矩阵参数可以有多个值: paramA=val1,val2

但也有缺点:

  • 只有少数像JAX-RS这样的框架支持矩阵参数

  • 当浏览器通过GET提交表单时,参数变为查询参数 . 因此,对于同一任务,它最终会出现两种参数 . 为了不混淆REST服务的用户并限制服务开发人员的工作量,在这个领域中使用始终查询参数会更容易 .

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

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

3 回答

  • 189

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

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

    这真的归结为命名空间 . 如果仅使用查询参数,则最终会使用“category_name”和“object_name”之类的参数,并且您将失去请求中参数的位置所添加的清晰度 . 此外,当使用类似JAX-RS的框架时,所有查询参数都会显示在每个资源处理程序中,从而导致潜在的冲突和混淆 .

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

  • 11
    • 降级评论部分非常重要.--

    我不确定矩阵URL的重要性 . 根据TBL写的w3c设计文章,它只是一个设计理念,并明确指出它不是网络的一个特征 . 使用它时,不会实现相对URL之类的内容 . 如果你想使用它,那很好;没有标准的方法来使用它,因为它不是标准 . - 史蒂夫波默罗伊

    如此简短的回答是,如果您出于商业目的需要RS,最好使用请求参数 .

  • 6

    除了Tim Sylvester's回答之外,我想提供一个如何使用 JAX-RS 处理矩阵参数的示例 .

    • Matrix parameters at the last resource element
    http://localhost:8080/res/categories/objects;name=green
    

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

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

    Response

    green
    

    但就像Javadoc所说的那样

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

    ......是什么把我们带到了第2点

    • Matrix parameters in the middle of an URL
    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;
    }
    

    Response

    object green, path:categories, matrixParams:[name=foo]
    

    由于矩阵参数以MultivaluedMap形式提供,因此您可以访问每个参数

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

    或者如果你只需要第一个

    String name = matrixParameters.getFirst("name");
    
    • Get all matrix parameters as one method parameter
    http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size
    

    使用 List<PathSegment> 获取所有内容

    @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("
    "); } return sb.toString(); }

    Response

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

相关问题