访问REST服务中的子资源的正确方法

时间:2016-12-21 10:56:54

标签: rest spring-mvc

让我们想象一下,我们有一个资源,因为它包含Bs,而Bs又包含Cs。

要获得所有C,我通常会创建带有 As / Bs / Cs 等URL的控制器方法。为了获得特定的B,我会做 As / Bs / {bId} 。但这是对的吗?

其他人如何理解第一个URL中的“Cs”部分是子资源的名称,而不是{bId}?特别是如果B有一个字符串id。

不应该像通配符那样使第一个查询看起来像 As / * / Bs / * / Cs ,所以你会立即看到什么是id,什么是子资源?

1 个答案:

答案 0 :(得分:1)

简短回答

当URL匹配多个模式时,使用排序来查找最具体的匹配。它是如何确定的?具有较低URI变量和通配符计数的模式被认为更具体。

因此/servers/deployments/executions/servers/deployments/{deploymentId}更具体。

答案稍长

Spring MVC文档告诉你整个故事:

  

Path Pattern Comparison

     

当网址与多个模式匹配时,会使用排序来查找最具体的匹配。

     

具有较低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}更具体。
  •