我想知道是否在我的URL中使用矩阵或查询参数 . 我发现这个话题的年龄较大discussion并不令人满意 .
例子
带查询参数的
- 网址:http://some.where/thing?paramA=1¶mB=6542
带有矩阵参数的 - 网址:http://some.where/thing;paramA=1;paramB=6542
乍一看,矩阵参数似乎只有优势:
-
更具可读性
-
不需要在XML文档中编码和解码"&"
带有"?"的 -
网址在很多情况下都没有缓存;具有矩阵参数的URL被缓存
-
矩阵参数可以出现在路径中的任何位置,并且不限于其末尾
-
矩阵参数可以有多个值:
paramA=val1,val2
但也有缺点:
-
只有少数像JAX-RS这样的框架支持矩阵参数
-
当浏览器通过GET提交表单时,参数变为查询参数 . 因此,对于同一任务,它最终会出现两种参数 . 为了不混淆REST服务的用户并限制服务开发人员的工作量,在这个领域中使用始终查询参数会更容易 .
由于服务开发人员可以选择支持矩阵参数的框架,唯一的缺点是浏览器默认创建查询参数 .
还有其他缺点吗?你会怎么做?
3 回答
重要的区别在于矩阵参数适用于特定路径元素,而查询参数作为整体应用于请求 . 在对多个级别的资源和子资源进行复杂的REST样式查询时,这会发挥作用:
这真的归结为命名空间 . 如果仅使用查询参数,则最终会使用“category_name”和“object_name”之类的参数,并且您将失去请求中参数的位置所添加的清晰度 . 此外,当使用类似JAX-RS的框架时,所有查询参数都会显示在每个资源处理程序中,从而导致潜在的冲突和混淆 .
如果您的查询只有一个“级别”,那么差异并不重要,两种类型的参数可以有效地互换,但查询参数通常得到更好的支持和更广泛的认可 . 一般来说,我建议您坚持使用查询参数来处理HTML表单和简单的单级HTTP API .
我不确定矩阵URL的重要性 . 根据TBL写的w3c设计文章,它只是一个设计理念,并明确指出它不是网络的一个特征 . 使用它时,不会实现相对URL之类的内容 . 如果你想使用它,那很好;没有标准的方法来使用它,因为它不是标准 . - 史蒂夫波默罗伊
如此简短的回答是,如果您出于商业目的需要RS,最好使用请求参数 .
除了Tim Sylvester's回答之外,我想提供一个如何使用 JAX-RS 处理矩阵参数的示例 .
您可以使用@MatrixParam注释访问它们
Response
但就像Javadoc所说的那样
......是什么把我们带到了第2点
您可以使用路径变量和
@PathParam
PathSegment在任何地方访问矩阵参数 .Response
由于矩阵参数以MultivaluedMap形式提供,因此您可以访问每个参数
或者如果你只需要第一个
使用
List<PathSegment>
获取所有内容Response