什么是添加非CRUD操作RESTful服务的“REST风格”的方式? 说我有一个服务,它允许这样的记录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变量。
但是,让我们说,我想购买一辆汽车,那操作比简单地更新“用户”记录的“自备车”属性更复杂。 它是基于REST简单地做这样的事情POST /api/car/123/purchase
,其中“购买”本质上是一个方法的名字吗? 或者我应该使用自定义HTTP动词,如PURCHASE
的,而不是POST
?
或者非CRUD操作完全REST的范围之内?
想想购买作为一个企业实体或REST风格的字典中的资源 。 话虽这么说,在购买实际上是创建一个新的资源。 所以:
POST /api/purchase
将建立新的订单。 详细内容(用户,汽车等)应发送到这个地址里面的内容ID(或URI)引用。
这不要紧,订购一辆汽车不只是在数据库中一个简单的插入。 其实,REST是不是暴露你的数据库表的CRUD操作。 但从逻辑上看要创建一个订单(购买),但在服务器端是免费的,因为它想要做的尽可能多的处理步骤。
你甚至可以更进一步滥用HTTP协议。 使用Location
标头的链接返回到新创建的顺序,仔细选择HTTP响应代码告知用户问题(服务器端或客户端),等等。
按我的理解是,你并不需要新的HTTP动词使用RESTful方式,有一个名词的地方,将意味着你需要做什么。
购买汽车? 那么是不是
POST /api/order
你真正做的是创建一个订单。 因此,添加其他资源秩序和柱和订购过程中放在那里。
想想资源,而不是方法调用的条款。
要完成你可能POST / API /阶//完整的或类似的东西的顺序。
我觉得的REST API帮助不仅仅是提供语义很多办法。 所以不能选择RPC风格,因为一些调用,似乎使RPC操作风格更感而已。 例子是谷歌地图API来两两地之间找到方向。 是这样的: http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal
他们可以把它叫做“findDirections”(动词),并把它作为一个操作。 相反,他们提出的“方向”(名词)作为一种资源和处理找到方向为上的指示资源的查询(尽管内部有可能是没有所谓的方向真正的资源,它可以通过业务逻辑来实现基础上找到PARAMS方向)。