向 RESTful 服务添加非 CRUD 操作的“RESTful”方式是什么?假设我有一项服务允许 CRUD 访问这样的记录:
GET /api/car/123 <- Returns information for the Car object with ID 123
POST /api/car <- Creates a new car (with properties in the request)
PUT /api/car/123 <- Updates car 123 (with properties in the request)
DELETE /api/car/123 <- Deletes car 123
POST /api/car/123/wheel/ <- Creates a wheel and associates it to car 123
如果我想更改汽车的颜色,我只需 POST/api/car/123
并包含新颜色的 POST 变量。
但是假设我想购买一辆汽车,并且该操作比简单地更新“用户”记录的“拥有的汽车”属性更复杂。简单地执行诸如 POST/api/car/123/purchase 之类的操作(其中“purchase”本质上是一个方法名称)是 RESTful 吗?或者我应该使用自定义 HTTP 动词,例如 PURCHASE
而不是 POST
?
或者非 CRUD 操作完全超出了 REST 的范围吗?
最佳答案
将购买视为 RESTful 字典中的业务实体或资源。话虽这么说,购买实际上是在创造新资源。所以:
POST /api/purchase
将下新订单。详细信息(用户、汽车等)应通过发送到该地址的内容中的 id(或 URI)进行引用。
没关系,订车不仅仅是数据库中简单的INSERT。实际上,REST 并不是将数据库表公开为 CRUD 操作。从逻辑的角度来看,您正在创建订单(购买),但服务器端可以自由地执行任意数量的处理步骤。
您甚至可以进一步滥用 HTTP 协议(protocol)。使用 Location
header 返回新创建订单的链接,仔细选择 HTTP 响应代码以通知用户有关问题(服务器端或客户端)等。
关于web-services - RESTful 服务中的非 CRUD 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6850187/