如何自动化文档化REST API(Jersey实现)

64

我用Java Jersey(和JAXB)编写了一个相当广泛的REST API。我也使用维基书写了文档,但这是一个完全手动的过程,非常容易出错,特别是当我们需要进行修改时,人们往往会忘记更新维基。

从观察其他大多数REST API来看,它们也是手动创建其文档。但我想知道是否有好的解决方案。

需要为每个端点记录的内容包括:

  • 服务名称
  • 类别
  • URI
  • 参数
  • 参数类型
  • 响应类型
  • 响应类型模式(XSD)
  • 示例请求和响应
  • 请求类型(Get/Put/Post/Delete)
  • 描述
  • 可能返回的错误代码

然后当然还有一些全局通用的东西,比如:

  • 安全性
  • REST概述
  • 错误处理
  • 等等

这些通用的东西描述一次就可以了,不需要自动化,但对于Web服务方法本身,自动化似乎非常有必要。

我考虑过使用注解,并编写一个生成XML的小程序,然后使用XSLT生成实际的HTML文档。使用自定义的XDoclet是否更合理?


3
Enunciate.codehaus.org 从 Javadoc 中提取文档:它是开源的,可以与 Jersey 配合使用,所以也许你可以研究一下这个? - Tim
可能是RESTful API文档的重复问题。 - cHao
1
我已经使用Enunciate几年了,它有一些怪癖。它不能很好地处理自定义类型,并且在处理抽象DTO时会变得非常混乱。事实上,我现在正在查找它的替代品。 - Christian Bongiorno
7个回答

42

2
更多信息请参见:http://swagger.wordnik.com,集成文档请参见:https://github.com/wordnik/swagger-core/wiki。 - fehguy
这是开源的吗? - Balaji Boggaram Ramanarayan
是的,先生,@BalajiBoggaramRamanarayan,我确定。 - Nicholas DiPiazza

22

很遗憾,Darrel的答案在技术上是正确的,但在现实世界中却是虚假的。它基于只有一些人同意的理想,并且即使你非常小心,机会也是你无法完全符合。

即使你可以,可能需要使用你的API的其他开发人员可能不关心或不知道RESTful模式的细节...请记住,创建API的重点是使其易于他人使用,而良好的文档则是必须的。

Achim关于WADL(Web应用程序描述语言)的观点是好的。因为它存在,我们应该能够创建一个基本工具来生成API的文档。

一些人已经采取了这种做法,并开发了XSL样式表进行转换: https://wadl.dev.java.net/


1
你能告诉我在哪里可以找到相关文档,向网页浏览器开发者展示如何访问stackoverflow.com上的信息吗?或者这些人不属于现实世界吗? - Darrel Miller
2
不要挑起争端,达瑞尔。我不知道Stack Overflow的人在API方面设置了什么,而且我也不太关心,因为我没有这方面的需求。如果他们没有为他们的API提供文档,那么我为必须进行集成的人感到遗憾。 - Brill Pappin
2
没有任何攻击意图。我也不是指Stackoverflow API。我指的是网站。该网站通过HTTP工作,并由名为“Web浏览器”的客户端应用程序使用。我的观点是,当您构建网站时,您不需要打电话给Google告诉他们如何调整Chrome以便它可以使用您的网站。通过使用良好记录的媒体类型,就不需要“API”文档。 - Darrel Miller
8
Chrome由人类操作员控制。大多数API客户端都是自动的。如果你想使用机器人浏览Stackoverflow.com,你需要对该网站的结构和预期用途有深入了解。你不能从根URL开始"探索它",也不应指望"文本/ HTML"这种媒体类型提供太多帮助。你最终只能手动浏览它,以创建一个好的API文档提供的地图。 - Alexander Ljungberg
4
stackoverflow的API文档非常好(请参见https://api.stackexchange.com/docs)。在现实世界中,不记录ReSTful API是荒谬的,这并没有以任何方式帮助回答原始问题。 - Randyaa

16
虽然我不确定它是否完全符合您的需求,但可以看一下 enunciate。它似乎是一个适用于各种Web服务架构的好文档生成器。 编辑 Enunciate 可在 Github 上使用。

3
最佳答案。此外,Enunciate有Maven支持(易于集成)。 - h3xStream
2
还有 swagger - Adam Gent
我看了一下Enunciate,然后转向了Swagger。 - Ben
它正在要求输入用户名和密码。 - shashwat
是的,Codehaus 已经关闭了,所以 Enunciate 一定已经搬走了... - Riduidel
我喜欢 Codehaus,它是我生活的一部分,看到它不再开放,让我感到泪目!一个时代的结束。 - Nicholas DiPiazza

8

您可能对Jersey提供的所谓“WADL”感兴趣,它能在运行时以XML格式为所有已发布资源提供描述(从注释中自动生成)。这应该已经包含了基本文档所需的内容。此外,您可能还可以添加其他的JavaDoc,但这需要更多的配置。

请查看这里:https://jersey.java.net/documentation/latest/wadl.html


2

达瑞尔的回答完全正确。不应该向REST API的客户端提供这种类型的描述,因为它会导致客户端开发人员将客户端的实现与服务的当前实现耦合在一起。这就是REST超媒体约束的目的所在。

您仍然可以开发一个以此方式描述的API,但您应该意识到,由此产生的系统将不会实现REST架构风格,因此不具备REST所保证的属性(尤其是可演化性)。

您的接口可能仍然比RPC等更好的解决方案。但请注意您正在构建的内容。


能否请那些给我点踩的人留下评论?这样大家就知道发生了什么事情了。 - Jan Algermissen

0

你可能会发现rest-tool很有用。

它采用了语言无关的方法来编写RESTful API的规范、模拟实现和自动化单元测试。

你可以仅使用它来记录你的API,但是这个规范可以立即用于质量保证真实服务的实现。

如果你的服务尚未完全实现,但例如应该被Web前端应用程序使用,rest-tool提供基于服务描述的即时模拟。内容模式验证(JSON模式)也可以很容易地添加到文档中,并由单元测试使用。


-2

不想打击你,但如果你觉得需要记录你列举的事情,那么很可能你并没有创建REST接口。

REST接口通过确定单个根URL并描述从该URL返回的表示形式的媒体类型及可以通过表示形式中链接访问的所有媒体类型来进行文档化。

你使用了哪些媒体类型?

此外,在你的文档中加入RFC2616的链接,这将向任何使用者解释如何与你的服务交互。


16
这很荒谬。REST API只是一个API而已。无论它们有多么自我记录,都没有办法编写一个通用客户端,知道如何与每个REST API互动。客户端将会有一些关于API内置的知识,并且生成描述该API的文档似乎很合理。 - Ted Mielczarek
4
@Ted,你能帮我找到网页浏览器开发人员在支持StackOverflow网站时所使用的文档吗?在你回答之前,请先考虑一下“但是网页浏览器是不同的”的问题。请问它们为什么不同呢?它们是本地应用程序,可以从HTTP服务器获取HTML/CSS/jpeg/png等资源类型。 - Darrel Miller
4
Chrome之所以能够工作,是因为其符合标准并进行解析渲染。它不会与服务交互,除非被告知这样做,即使是在这种情况下,用户也需要提供确切的指令和Chrome所需的URI来执行该交互。这不是魔术。大多数REST客户端都有基于响应数据结构的自定义交互和渲染方案。如果没有文档,我不知道你如何才能过得去,除非你是唯一的消费者。请不要谈论浏览器和网络,而是展示一些实际上没有文档但易于编写客户端的REST服务。 - Lo-Tan
3
@Nate,我讨厌这种回答。文档不仅仅是为开发人员准备的。我不能把HTTP的RFC规范交给销售人员,并要求他们让潜在客户自己弄明白。啊,你做了20多年的软件 - 现在一切都有意义了... - tpow
6
根据Roy Fielding(http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven)的说法,您是正确的,RESTful系统必须是以超文本驱动的。然而,我认为这是一个极端的观点,有一大类API采用HTTP并强调名词、媒体类型、无状态、文档版本等,但摒弃了HATEOAS,并允许客户端构建自己的URL...这就是大多数人口语上现在所称的“REST”。如果我们能为此找到一个新术语,那将是很好的。 - Michael Iles
显示剩余19条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接