RESTful服务中的非CRUD操作

时间:2011-07-27 19:33:38

标签: web-services rest

将非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的范围?

4 个答案:

答案 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; (名词)作为资源和处理发现方向作为方向资源的查询(虽然内部可能没有真正的资源称为方向,它可以由业务逻辑实现,以查找基于参数的方向)。