我正在为新的内部Web服务编写RESTful API规范。这不是很长很简单,但即便如此,这是我第一次使用严格的REST(而不是出于实际原因作弊 - 避免PUT
和DELETE
,因为它们是PHP的痛苦,并且等等)。我想知道是否有任何标准方法或最佳实践来记录REST接口?我希望团队的其他成员能够一目了然地理解它,对于任何想要编写客户端而无需了解底层代码的人来说。
答案 0 :(得分:46)
当然,REST APIs should ideally use HATEOAS and be hypertext driven(大量使用媒体类型),但也有简单的人性化文档供开发人员使用,这是有帮助的。
一些有助于生成此类文档的特定工具:
答案 1 :(得分:13)
我一直在使用http://apiary.io,这非常好。您还可以将API文档导出到github。
答案 2 :(得分:9)
在Roy的帖子中here他说
REST API应该花费几乎全部 它在定义中的描述性努力 用于表示的媒体类型 资源和驾驶应用 状态,或定义扩展 关系名称和/或 支持超文本的现有标记 标准媒体类型。任何努力都花了 描述在什么方面使用什么方法 感兴趣的URI应该是完全的 在范围内定义 处理媒体类型的规则 (并且,在大多数情况下,已经定义了 按现有媒体类型)。
答案 3 :(得分:6)
良好的ReST文档意味着记录您的媒体类型,并且只记录您的媒体类型。
在典型情况下,您会生成如下文档:
通过在书签URI(通常是服务器的根目录http://www.acme.org)上向服务器发出GET或HEAD请求,并查找HTTP,可以找到文档中描述的各种资源的链接。链接标题:
Link: <xxx>;rel="http://rel.acme.org/services";type=application/vnd.acme.services+xml
其中rel
部分是链接关系,xxx
是已建立关系的URI。
本文档定义了以下关系名称:
application/vnd.acme.services+xml
是一个xml
序列化的文档,用于描述应用程序可能要处理的链接列表。
<links>
<link rel="http://rel.acme.org/customers" href="http://www.acme.org/services/customers" type="application/vnd.acme.customers+xml" />
</link>
applcation/vnd.acme.customers+xml
是一个描述客户的xml
序列化文档。
<customers>
<customer firstname="Darth" lastname="Vador" href="http://www.acme.org/services/customers/28" />
</customer>
等...
重点是让开发人员遵循您定义的链接。首先找到索引的链接,以便他们可以获取他们可以导航到的内容列表。
一旦他们发现该文档,他们就会发现他们可以在某个Uri上看到一个客户列表,并且可以对其进行GET
。
如果他们找到感兴趣的客户,他们可以按照/customers/customer/@href
中定义的链接发出GET
来检索该客户的代表。
从那里,您的媒体类型可以使用更多链接嵌入用户可用的操作。您还可以选择在资源上发出OPTIONS请求以了解是否允许删除资源,或者如果您可以在修改后保存文档,则可以选择PUT。
所以好的文档永远不会出现:
所有这一切的目的是实现客户端和服务器之间的最小耦合。客户端可以非常智能地显示和发现资源(显示表单和上帝知道还有什么),但对于实际工作流程是完全愚蠢的:服务器决定。
答案 4 :(得分:4)
在我的公司,我们非常高兴使用WADL,Web应用程序描述语言。维基百科describes为:“基于XML的文件格式,提供基于HTTP的Web应用程序的机器可读描述”。我发现原始WADL易于编写,阅读和理解,并且它直接映射到RESTful概念。官方项目提供了一个简单的规范,XSD和RELAX NG模式以及Java工具。
有许多工具和资源可供使用WADL,包括:
提示:通过使用XHTML命名空间包含HTML元素,尝试在WADL文档的doc
元素中包含人类可读的文档,如描述,概念,入门,使用技巧等。它可以产生很大的不同!
答案 5 :(得分:2)
最初,我们去了资源的静态文档,但只需要提出太多问题。最后,我们开始使用IO / Docs使用Live文档页面(实际上是fork)。 工作得很好。
答案 6 :(得分:2)
您可能会发现rest-tool有用。
它遵循与语言无关的方法来编写RESTful API的规范,模拟实现和自动化单元测试。它还提供了一本烹饪书,但它处于一个很早的阶段,但其内容却在不断增长。
您刚才描述的服务可以立即使用,因此它也适合进行实验。
答案 7 :(得分:0)
要创建理解/文档,并不总是需要重量级解决方案。 (伟大的)重量级工具的例子有:IO / Docs / Apigee(虽然很棒的工具)。
对于已经有docchain设置的小项目(doxygen / phpdoc / phpdoctor / custom / etc),我使用以下的shellcript将页面包含在完整生成的文档中:
https://gist.github.com/4496972
它只是在源代码中使用自定义注释标记。 它也可以作为记录任何源代码(语言)的良好起点。