试图找出设计删除的好方法。
尝试使用示例解释:
我有一个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的休息系统)
答案 0 :(得分:3)
我的投票将用于(略微改动)选项1.
DELETE /employees/{employeeId}
没有必要指定/id
,我无法想象会有任何混淆(除非你有一个名叫奇怪UUID
的员工......)。这也导致我为什么我会说其他人是坏的想法:
Employee
应该只有一个 id
,因此没有歧义的余地。可能会有很多具有相同的firstName
,lastName
(甚至组合也可能不是唯一的)。
如果你将/id
放在字符串中,它意味着(至少对我来说)可能有其他方式来唯一地引用该资源(例如/firstName
或/lastName
你建议);省略它会清楚地表明支持引用特定Employee
的仅方式,并且如果他们想要找到具有特定firstName
和lastName
的方式,应使用GET /employees?firstName=Tom&lastName=Winn
类型请求检索。
查询DELETE声音中的参数对我来说是有风险的,更像是调用你服务的任何东西都应该负责。如果您想DELETE
Employee
所有managerId=400
GET
,GET /employees?managerId=400
这些资源更有意义:DELETE
,然后发出Employee
在所有返回的File
上。