2

我正在为我们的 REST 接口设计一个公共 API。出现的一件事是使用 http 动词,特别是 DELETE 动词。

我们希望公开启动/停止或执行/中止特定作业的方法。这两种API设计的两种风格是:

邮政

http://localhost/api/campaignrun/1

执行 id 为 1 的活动

删除

http://localhost/api/campaignrun/1

中止 id 为 1 的广告系列运行

或者...

邮政

http://localhost/api/campaignrun/1

{ action=execute}

执行 id 为 1 的活动

邮政

http://localhost/api/campaignrun/1

{ action=abort }

中止 id 为 1 的活动

如果有我最喜欢的,哪一个更 RESTful?

4

5 回答 5

3

在您的两个设计之间进行选择,我会投票给您的第二个,它使用POST,但稍作修改:PUT改用:

PUT http://localhost/api/campaignrun/1

{ action: abord }

这个 API 清楚地说明了它的意图:你有campaignruns(最好保留这个复数),你想要有 的campainrun {id} = 1,并且该资源有一个名为 action 的属性,我想更新它。

这样,您的 API 与http 动词的幂等PUT性保持一致:应该是幂等的,POST不应该是幂等的。对于您的情况,这意味着无论用户点击上述请求多少次,结果都是相同的:id=1 的活动运行将被中止。

注意:我看到您已经接受了在 URI 处提出动词的答案,然后使用POST它们。这篇文章不是支持或反对 REST 的地方,但由于您的问题是关于哪种设计更 RESTful,您应该三思而后行。您可能想查看这本非常不错的 38 页免费电子书,其中介绍了设计 API 的最佳实践。除其他外,它建议将动词放在基本 URL之外,除非在极少数情况下。检查一下,它会证明有帮助!

于 2013-04-17T09:41:23.680 回答
0

第一个是更“宁静”。您将遇到的唯一问题是您是否需要删除而不是中止将来运行的广告系列。如果您将来需要活动运行删除记录功能,您可以随时将操作传递给 DELETE。

于 2013-04-17T03:54:30.167 回答
0

如果你可以使用 DELETE,那就太好了。但是,只有在停止活动运行意味着客户端不应再次访问该资源(该特定 URL)时,您才应该这样做。如果合理地期望客户端在之后与资源交互,请使用 POST(或 PUT 到子资源,当然)。

于 2013-04-17T04:40:28.817 回答
0

是否可以重新启动已停止的作业?如果是这样,我建议您使用,POST因为您并没有真正删除任何资源。但是,您可以更改 url 以更好地指示您要实现的目标:

邮政

http://localhost/api/campaignrun/1/start

邮政

http://localhost/api/campaignrun/1/stop

因此,不需要提供请求主体来指示操作的类型。

旁注:对我来说DELETE,表示该活动将被永久删除,因此无法重新启动。因此,如果客户端尝试访问资源,将返回 404。

于 2013-04-17T04:52:44.917 回答
0

正如许多人在这里所说,删除资源意味着相关的活动不再可访问(404 Not Found 应该在之后返回)。我猜这不是中止竞选活动的意图。

以下将更符合问题中提到的任何替代方案的 REST:

邮政

http://localhost/api/campaignruns

注意复数名词(更 RESTful,collection->instance->collection->instance...)。

此请求创建一个活动运行。比方说,campaignrun创建的 ID 是 1。

邮政

http://localhost/api/campaignruns/1/operations

{
    "operation": "execute"
}

邮政

http://localhost/api/campaignruns/1/operations

{
    "operation": "abort"
}
  • 操作API 支持以下HTTP 方法:GET、POST
  • 操作API 可能被实现为异步调用(返回 202 Accepted)。

假设中止操作 ID 为 2。

这是它在POST之后的显示方式(假设是异步操作) :

得到

http://localhost/api/campaignruns/1/operations/2

Response:

{
    "id": 2,
    "operation": "abort",
    "status": "processing"
}

完成后的外观如下:

得到

http://localhost/api/campaignruns/1/operations/2

Response:

{
    "id": 2,
    "operation": "abort",
    "status": "completed"
}
于 2015-04-02T08:58:47.317 回答