JAX-RS @QueryParam
和@MatrixParam
之间有什么区别?
从文档中,queryparam和matrixparam都可以在特殊条件下定位一个资源。那么用例差异是什么?
ps:
Queryparam:
url ? key=value;
Matrixparam
url; key=value;
答案 0 :(得分:13)
如this Oracle documentation中所述:
@PathParam
和其他基于参数的注释,@MatrixParam
,@HeaderParam
,@CookieParam
,@FormParam
遵守 与@QueryParam
相同的规则。@MatrixParam
从中提取信息 网址路径段。@HeaderParam
从HTTP中提取信息 头。@CookieParam
从声明的cookie中提取信息 在cookie相关的HTTP标题中。
示例(摘自here):
@Path("/books")
public class BookService {
@GET
@Path("{year}")
public Response getBooks(@PathParam("year") String year,
@MatrixParam("author") String author,
@MatrixParam("country") String country) {
return Response
.status(200)
.entity("getBooks is called, year : " + year
+ ", author : " + author + ", country : " + country)
.build();
}
}
请参阅以下URI模式和结果:
URI模式:“/ books / 2012 /”
getBooks被调用,年份:2012年,作者:null,国家:null
URI模式:“/ books / 2012; author = andih”
getBooks被称为,年份:2012,作者:andih,country:null
URI模式:“/ books / 2012; author = andih; country = germany”
getBooks被称为,年份:2012年,作者:andih,国家:德国
URI模式:“/ books / 2012; country = germany; author = andih”
getBooks被称为,年份:2012年,作者:andih,国家:德国
有关差异的解释,您可以查看 URL matrix parameters vs. request parameters
答案 1 :(得分:11)
@MatrixParam
注释将应用于URL和中存在的特定资源@QueryParam
将适用于整个请求网址。
举一个超市的例子,如果你想要满足多种条件的所有水果,比如类型=水果和价格范围从300开始,列出匹配的10个水果,你可以去下面的API设计,
http://dev.brandstore.com/inventory/grocery;type=fruits/price;range=300/?limit=10
在上面的示例中,第一个Matrix Param type=fruits
仅适用于杂货店资源,同一range=300
仅适用于价格资源但查询参数用于分页limit=10
适用于整个请求网址。是的,如果只使用了查询参数,你最终会得到像" grocery_type"等参数。和" grocery_price"并且您将失去请求中参数的位置所添加的清晰度。