REST API 设计指南

标签 rest api-design

我正在为我们的 REST 接口(interface)设计一个公共(public) 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?

最佳答案

在您的两个设计之间进行选择,我会投票给您的第二个,它使用 POST,但进行了一些小修改:使用 PUT相反:

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

{ action: abord }

此 API 清楚地说明了其意图:您有 campaignruns(最好保留此复数),您希望campainrun 的 {id} = 1,该资源有一个名为 action 的属性,我想要更新

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

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

关于REST API 设计指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16051051/

相关文章:

rest - REST 端点如何调用 gRPC 服务器/微服务中的方法?

java - JSON 到 Java 映射参数/通用类型

facebook - Azure 移动服务 OAuth REST 客户端

Objective-C API : Can an NSNumber become an Int in Swift?

c# - 如何在 ASP.NET Core 2.0 Controller 上同时拥有 'get by id' 和 'get by name' 路由?

api - 如何保护我在 playframework 中开发的 REST api

java - 我可以提供一个接口(interface)让另一个类让我访问它的私有(private)变量吗?

rest - 如何在不实际执行的情况下模拟 HTTP DELETE 操作的后果

json - 用于检索摘要信息的 REST api 设计

.net - RestSharp 将图像发布到 WCF REST 服务