RPC调用的RESTful表示

RPC调用的RESTful表示,rest,Rest,我们正在尝试将SOAP API重新设计为RESTful API(使用ASP.NET Web API) 我知道如何用REST替换RPC风格的调用的问题经常出现,但我仍然没有找到任何能让我达到目的的方法。这可能是想象力的失败或对REST原则的根本误解(我让你来判断!) 我在下面创建了一个示例,大致对应于我试图实现的目标 假设我们有一个资源,我称之为预订 获取…/预订/预订/1 我们有一个要求,取消这项预订,此前,这项预订将以类似的方式进行建模 …取消预订(1,原因。无需) 这就是预订ID和原因码 或

我们正在尝试将SOAP API重新设计为RESTful API(使用ASP.NET Web API)

我知道如何用REST替换RPC风格的调用的问题经常出现,但我仍然没有找到任何能让我达到目的的方法。这可能是想象力的失败或对REST原则的根本误解(我让你来判断!)

我在下面创建了一个示例,大致对应于我试图实现的目标

假设我们有一个资源,我称之为预订

获取…/预订/预订/1

我们有一个要求,取消这项预订,此前,这项预订将以类似的方式进行建模

…取消预订(1,原因。无需)

这就是预订ID和原因码

或者,我们可能需要在一次请求中取消多个预订

…取消预订(“1,2,3”,原因。不再需要)

(有点粗糙,但我尽量让这个例子简单!)

我们如何在RESTful架构中对此进行最佳建模

一个建议是,我们有一个叫做CancellationRequest的资源,我们将其中一个发布到服务器上

POST .../Bookings/CancellationRequest    
{
  "BookingIDs" : "1,2,3",   
  "CancellationReason" : "NotRequired"
}
也许这会进行处理,然后返回重定向到已取消的预订

但我不知道这是否是休息的最佳方式

有人能提供建议吗

(注意:说
/Bookings/Bookings/:id
是多余的。我还认为资源应该以小写字母开头。在这种情况下,您可以将资源命名为
/Bookings/:id

设计师们对正确的方法有相当多的意见。我个人并不喜欢如此严格地遵守RESTful约定,以至于API变得健谈、难以理解

然而,您的情况似乎非常简单:

多种资源:

DELETE /bookings?reasonCode=Reasons.NoLongerRequired&id=1&id=2&id=3
单一资源:

DELETE /bookings?reasonCode=Reasons.NoLongerRequired&id=1
退化为

DELETE /bookings/:id?reasonCode=Reasons.NoLongerRequired

另请参见

非常感谢。(是的,我不完全确定我为什么要描述这些额外的/预订-可能是睡眠不足!!我也会接受你所说的小写)。假设我们想保留预订记录。假设这个动词类似于“suspend”?表示我们想对此预订执行某些操作,但不想将其删除的内容。本质上是地位的改变。我想我说的是,我用了一个“取消”的坏例子。(又失眠了?)。我来看看你包含的链接。再次感谢。这只是一个更新,因此正确的动词应该是一个
PUT
,具有适当的负载:
PUT/bookings/:id
,负载类似于
{“status”:“cancelled”,“reason”:“Reasons.NoLongerRequired”}
。我曾在许多系统上工作过,这些系统以这种方式对“取消”进行建模,在API中找不到一个
DELETE
。@Perpatim这样的PUT是不合适的,因为PUT应该更新整个资源以匹配您的身体。这意味着整个预订资源必须在您的请求中才能正确;仅发送其中的一部分(例如状态)将导致所有其他字段为空。像这样的部分更新是一个补丁。但是,我认为它也不应该是删除,因为资源实际上没有被删除。要使用DELETE,我想说,只有当该资源在删除之后不再具有可获取的表示时,才适合使用DELETE。