记录RESTful API的标准方法


70

我正在为新的内部Web服务编写RESTful API规范。它不是很长,也不是很简单,但是即使如此,这也是我第一次使用严格的REST(而不是出于实际原因作弊-避免这样做,PUT并且DELETE因为它们在PHP中很痛苦,依此类推)。我想知道是否有任何标准方法或最佳实践来记录REST接口?我希望团队中的其他成员能够一目了然地理解它,对于希望编写客户端的任何人,也可以在不了解底层代码的情况下做到这一点。



Answers:


48

当然,理想的REST API应该使用HATEOAS并由超文本驱动(大量使用媒体类型),但是对于开发人员来说,使用简单的人性化文档也很有帮助。

一些有助于生成文档的特定工具,例如:


1
您还应该将miredot miredot.com添加到列表中
java_geek

@java_geek当然,谢谢你的记录。如果发现更多内容,请随时进行编辑。
turtlemonvh 2014年

API说明格式之间的转换也值得注意,例如github.com/lucybot/api-spec-converterstudio.restlet.com
Erik Sundvall 2015年


9

在罗伊的帖子在这里,他指出

REST API应该花费几乎所有的描述性精力来定义用于表示资源和驱动应用程序状态的媒体类型,或者为现有标准媒体类型定义扩展的关系名称和/或启用超文本的标记。花费所有精力描述应该在媒体类型的处理规则范围内(并且在大多数情况下已由现有媒体类型定义)完全定义要在感兴趣的URI上使用的方法。


9
我认为您要说的是该API应该具有自我文档编制功能,并且逻辑性强,不需要文档编制。这很公平。但是,在这条线的某个地方,我将至少需要向人们提供允许的通话清单。我想知道上述列表是否有某种可接受的结构。
萨米尔·

7
否。媒体类型一定需要文档。这是一堆示例iana.org/assignments/media-types/application您的文档不应该包含的是URL列表。这只会鼓励客户开发人员将这些网址硬编码到他们的应用程序中。
达雷尔·米勒

5
也许我可以组成一个有用的例子。想象一下去一个不讲英语的外国,然后去图书馆寻找一些信息。想象一下,如果您寻求帮助,并且此人向您解释了书架的概念,即ISBN编目,则该书包含页面,您从前到后阅读该书。所有有效信息,但您已经知道。您需要某人来翻译内容。在网上,我们了解Urls和超链接,我们知道如何使用HTTP动词。我们只需要了解您内容的细节。
Darrel Miller

2
知道了 这也是我的直觉:请详细说明每个呼叫的作用,而不是它的作用。我以为没有标准的方法可以执行此操作,但是该死,我想通过翼操作它永远不会伤害任何人(不要在此引用我)。谢谢你的帮助。
萨米尔·塔尔瓦尔

1
@Mark因此,您只能通过首先实际查询端点,然后编写自己的文档来描述端点来为每个端点进行开发?这似乎不太用户友好。
尼克·科德

6

好的ReST文档将意味着仅记录您的媒体类型,而仅记录您的媒体类型。

在典型的情况下,您将生成如下文档:

Acme Corp XML格式

链接发现

可以通过在书签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。

因此,从来没有好的文档:

  • 给出静态链接
  • 进行交互,例如“您可以使用这种媒体类型在客户身上发布POST,这将意味着移动操作”。客户端只应对客户发出POST,因为您的XML文档已经指定了POST。

所有这些的目的是实现客户端和服务器之间的最小耦合。客户端可以非常聪明地显示和发现资源(显示表单,上帝知道其他什么),但是对于实际的工作流程却完全是愚蠢的:服务器决定。


好的,所以我主要应该使用链接发现来记录API。我究竟该如何构造这样的XML文档?有任何链接吗?
萨米尔·塔尔瓦尔

是的,您将记录如何发现媒体类型中的链接和操作。至于如何做,请看一下ATOM和HTML,这几乎就是您所需要的:<link rel = href =>和某种传达您要在客户端中显示的操作的方法。
SerialSeb

4

在我公司,使用Web应用程序描述语言WADL非常高兴。Wikipedia描述为:“一种基于XML的文件格式,提供了基于HTTP的Web应用程序的机器可读描述”。我发现原始的WADL易于编写,阅读和理解,并且直接映射到RESTful概念。官方项目提供了一个简单的规范,XSD和RELAX NG模式以及Java工具。

存在许多使用WADL的工具和资源,包括:

  • wadl_stylesheets,用于从WADL文件创建HTML文档的XSLT样式表
  • Restlet是用于构建RESTful服务器和客户端的Java框架,包括WADL扩展

提示:尝试doc使用XHTML命名空间将HTML元素包括在内,从而在WADL文档的元素中包含易于理解的文档,例如描述,概念,入门,使用技巧等。可以有很大的不同!


1
在Rest-discuss [1]中正在进行的讨论表明,许多REST倡导者认为使用WADL几乎没有优势。[1] tech.groups.yahoo.com/group/rest-discuss/message/12680
Darrel Miller,2009年

1
我已经研究过WADL,但似乎它更倾向于机器解释而不是文档。我不需要告诉计算机如何处理API-只需编写一次即可。我确实需要告诉人们如何编写客户,因此人们是我的主要受众。
萨米尔·塔尔瓦尔

您也可以使用WADL为强类型语言生成客户端存根。例如,请参见wadl2java
DSO,

2

最初,我们去找资源的静态文档,但是只需要回答太多问题。最终,我们转而使用IO / Docs(实际上是fork)来使用Live文档页面。一直很好。


2

您可能会发现rest-tool有用。

它遵循一种与语言无关的方法来编写RESTful API的规范,模拟实现和自动单元测试。它还提供了一本烹饪书,尽管它还处于早期阶段,但是其内容正在不断增长。

您刚刚描述的服务可以立即使用,因此也很适合尝试。


0

要创建理解/文档,并非总是需要重量级的解决方案。重量级工具的示例包括:IO /文档/ Apigee(尽管功能强大)。

对于已经具有docchain设置的小型项目(doxygen / phpdoc / phpdoctor / custom / etc),我使用以下shellscript将页面包含在完整的生成文档中:

https://gist.github.com/4496972

演示:http//pastie.org/5657190

它只在源代码中使用自定义注释标签。对于记录任何源代码(语言),这也是一个不错的起点。


1
最好在此处包括答案的基本部分,并提供链接以供参考。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.