什么是设计DELETE以获得宁静资源的最佳方式

时间:2016-04-21 23:31:53

标签: java spring rest jersey

试图找出设计删除的好方法。

尝试使用示例解释:

我有一个Employee资源。员工有以下字段

Employee{
    String firstName
    String lastName
    String emailId
    String managerEmployeeId
    String employeeId
}

我希望能够使用任何字段删除员工 例如firstName,lastName,employeeId或managerEmployeeId

我的资源路径应如何理想?

选项1: 这是一个不错的选择吗?是吗?不?为什么?

/employee/id/{employeeId}
/employee/firstName/{firstName}
/employee/lastName/{lastName}
/employee/managerId/{managerId}

选项2:

使用查询参数

    /employee?id=100  ( to delete employee with id 100)

    /employee?firstName=Tom&lastName=Winn (to delete an employee named Tom Winn)

   /employee?managerEmployeeId=400 (delete all employees having manager id as 400)

选项1对我来说非常具有RPC-ish

我喜欢第二个选项,但我发现它非常容易出错,因为必须指定字段。

在第二个选项中 我不喜欢有一个名为firstName的参数,然后将其映射到Java类Employee中的firstName字段。这是行业中使用过的范例吗?

此外,这是一个带有xml的后端应用程序,用java编写(使用松散字段名称对我来说非常非java)

我想了解行业中正在遵循的内容(特别是基于jersey,restEasy或Spring构建的强类型基于java + xml的休息系统)

1 个答案:

答案 0 :(得分:3)

我的投票将用于(略微改动)选项1.

DELETE /employees/{employeeId}

没有必要指定/id,我无法想象会有任何混淆(除非你有一个名叫奇怪UUID的员工......)。这也导致我为什么我会说其他人是的想法:

Employee应该只有一个 id,因此没有歧义的余地。可能会有很多具有相同的firstNamelastName(甚至组合也可能不是唯一的)。

如果你将/id放在字符串中,它意味着(至少对我来说)可能有其他方式来唯一地引用该资源(例如/firstName/lastName你建议);省略它会清楚地表明支持引用特定Employee方式,并且如果他们想要找到具有特定firstNamelastName的方式,应使用GET /employees?firstName=Tom&lastName=Winn类型请求检索。

查询DELETE声音中的参数对我来说是有风险的,更像是调用你服务的任何东西都应该负责。如果您想DELETE Employee所有managerId=400 GETGET /employees?managerId=400这些资源更有意义:DELETE,然后发出Employee在所有返回的File上。