路径变量或请求参数?

时间:2018-10-17 10:40:29

标签: spring rest api endpoint

在设计Rest api时,据说在需要标识资源时使用Path Variable,在需要进行排序,过滤,搜索,分页等操作时使用Request Parameters 。让我们以Employee的情况为例:

Employee具有三个字段,例如namecompanyNamesocialSecurityNo

现在我想要一个拥有socialSecurityNo = ABC的员工。

因为端点是带有/employees/{socialSecurtityNo}之类的路径变量,这似乎很好,因为我们正在标识资源。

同样直观的是,我们在socialSecurityNo的基础上进行过滤,并拥有一个像/employees?socialSecurityNo=ABC这样的端点

当我感到困惑并认为两者都适用时,正确的方法是什么。

1 个答案:

答案 0 :(得分:0)

这是一个很好的问题。

/employees?socialSecurityNo=ABC

正在过滤socialSecurityNo上的所有员工。如果socialSecurityNo对于员工是唯一的,则此端点中没有任何意义,客户应使用/employees/{socialSecurtityNo}

对唯一字段值(socialSecurtityNo)进行过滤没有任何问题,并且如果客户发现使用此版本更容易(出于任何技术原因),那很好。没有“正确”的方法。存在API的最终原因是允许客户端进行有价值的工作。与客户合作,以​​允许发生这种情况,但要牢记最佳实践,并知道解决方案何时不是最佳解决方案,而是在实际情况中最实用的解决方案。

我希望看到:

/employees?surname=Smith

这是针对非唯一字段值的过滤,因此应返回Employee个对象的集合。

要做的“正确”事情是保持结果一致。如果您有两种寻找雇员的方法,请确保每种情况下返回的结果都相同。