让我们想象一下,我们有一个资源,因为它包含Bs,而Bs又包含Cs。
要获得所有C,我通常会创建带有 As / Bs / Cs 等URL的控制器方法。为了获得特定的B,我会做 As / Bs / {bId} 。但这是对的吗?
其他人如何理解第一个URL中的“Cs”部分是子资源的名称,而不是{bId}?特别是如果B有一个字符串id。
不应该像通配符那样使第一个查询看起来像 As / * / Bs / * / Cs ,所以你会立即看到什么是id,什么是子资源?
答案 0 :(得分:1)
当URL匹配多个模式时,使用排序来查找最具体的匹配。它是如何确定的?具有较低URI变量和通配符计数的模式被认为更具体。
因此/servers/deployments/executions
比/servers/deployments/{deploymentId}
更具体。
Spring MVC文档告诉你整个故事:
当网址与多个模式匹配时,会使用排序来查找最具体的匹配。
具有较低URI变量和通配符计数的模式被认为更具体。例如
/hotels/{hotel}/*
有1个URI变量和1个外卡,被认为比/hotels/{hotel}/**
更具体,它是1个URI变量和2个外卡。如果两个模式具有相同的计数,则更长的模式被认为更具体。例如
/foo/bar*
更长,被认为比/foo/*
更具体。当两个模式具有相同的计数和长度时,具有较少通配符的模式被认为更具体。例如,
/hotels/{hotel}
比/hotels/*
更具体。还有一些额外的特殊规则:
- 默认映射模式
/**
的特定程度低于任何其他模式。例如,/api/{a}/{b}/{c}
更具体。- 诸如
/public/**
之类的前缀模式不如任何其他不包含双通配符的模式具体。例如,/public/path3/{a}/{b}/{c}
更具体。