web-services - RESTful 服务中的非 CRUD 操作

标签 web-services rest

向 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/

相关文章:

node.js - 如何为 NodeJS 设置 einaros/ws 模块以接受 wss(安全 ws)连接?

.net - "The operation has timed out"Azure 中托管的 Web 服务出现不一致的超时错误

.net - basicHttpBinding 与 wsHttpBinding

python - Python REST API 的最佳 gunicorn-worker 配置(数量和类)

c# - 单声道/WCF : Cannot determine caller IP on Ubuntu

JAVA:HTTP POST 请求 - 异常

javascript - 在 Django REST API 中添加数组名称

javascript - 带函数参数的 Rest 运算符

java - Hibernate- 无法延迟初始化角色集合 : beans. Language.patients,无法初始化代理 - 无 session

javascript - Sails.js 创建的 REST API 真的是 RESTful 的并且遵循约定吗?