矩阵URI(Matrix URIs)

what-is-url

矩阵URI(Matrix URIs) 是Tim Berners-Lee于1996年提出的一种新的Web体系结构,但遗憾的是,到目前为止并未成为 Web标准。

介绍

按照矩阵URI的定义,将URI中的斜杠(/)看成是层次分隔符,每个层次都可以使用属性作为条件,条件格式为name=value的形式,不同属性之间使用分号(;)分隔,如果没有属性,允许使用默认值,并且相同属性只能出现一次(TBL介绍中不推荐同一属性出现多次,因为会导致混乱;但如果可以做到识别多个相同属性,也是允许出现多次),属性之间保持无序性(color=red;size=largesize=large;color=red是等同的)

例子

例如我们需要定义查询指定用户在某一天的所有图片的URI,使用查询参数:

1
http://example.com/user/images?userId=1&date=20190930

或是REST风格:

1
http://example.com/user/1/images/20190930

而使用矩阵参数:

1
http://example.com/user;userId=1/images;date=20190930

个人认为相比传统的查询参数或是REST风格URI,矩阵URI有着更好的可读性;相比查询参数,矩阵URI没有转义的问题(?&);相比于REST风格,矩阵URI没有缺省参数的问题。

但是矩阵URI并非Web规范,所以并非所有框架都支持矩阵URI,因而查询参数URI有着更好的支持并且有更广泛的认可。

在SpringMVC中使用

配置

Java Config

1
2
3
4
5
6
7
8
9
10
11
12
@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
// 不过滤分号,即启用Matrix URIs
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}

Xml

1
<mvc:annotation-driven enable-matrix-variables="true"/>

测试类

1
2
3
4
5
6
7
8
9
@RestController
public class ImagesController {

@RequestMapping(path = "/user/image/{imageId}", method = RequestMethod.GET)
public String findImage(@MatrixVariable(pathVar = "imageId", required = false, defaultValue = "1") int p) {
System.out.println(p);
return "ok";
}
}

访问地址:

1
http://localhost:8081/user/image/123;p=123

具体使用介绍可以看Spring官方文档

参考

Matrix URIs - Ideas about Web Architecture
URL matrix parameters vs request parameters
Matrix Variables In SpringMVC