将非CRUD操作添加到RESTful服务的“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
这样的事情,其中“购买”本质上是一个方法名称是RESTful吗?或者我应该使用自定义HTTP动词,例如PURCHASE
而不是POST
?
或者非CRUD操作是否完全超出REST的范围?
答案 0 :(得分:59)
将购买视为RESTful字典中的业务实体或资源。话虽这么说,进行购买实际上是在创造一种新的资源。所以:
POST /api/purchase
将下新订单。应该通过发送到此地址的内容中的id(或URI)引用详细信息(用户,汽车等)。
订购汽车不仅仅是数据库中的简单INSERT并不重要。实际上,REST不是将数据库表暴露为CRUD操作。从逻辑的角度来看,您正在创建订单(购买),但服务器端可以自由地执行任意数量的处理步骤。
您甚至可以进一步滥用HTTP协议。使用Location
标头返回新创建订单的链接,仔细选择HTTP响应代码以通知用户有关问题(服务器端或客户端端)等。
答案 1 :(得分:14)
我理解的RESTful方式是你不需要新的HTTP动词,在某个地方有一个名词意味着你需要做什么。
购买汽车?那不是那个
POST /api/order
答案 2 :(得分:5)
您真正在做的是创建订单。因此,为订单添加另一个资源并在订单处理过程中发布并放在那里。
考虑资源而不是方法调用。
要完成订单,您可能会POST / api / order //完成或类似的事情。
答案 3 :(得分:3)
我认为REST API比提供语义更多地提供帮助。所以不能仅仅因为一些看起来在RPC操作风格中更有意义的调用而选择RPC样式。例如google maps api,用于查找两个地方之间的路线。看起来像这样: http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal
他们可以称之为&#34; findDirections&#34; (动词)并将其视为一项操作。相反,他们做了#34;方向&#34; (名词)作为资源和处理发现方向作为方向资源的查询(虽然内部可能没有真正的资源称为方向,它可以由业务逻辑实现,以查找基于参数的方向)。