使用 Sphinx 的 RESTful Web 服务 API 文档 [已关闭]

RESTful web service API documentation with Sphinx [closed]

提问人:deceze 提问时间:12/28/2010 最后编辑:deceze 更新时间:10/3/2011 访问量:11168

问:


我们不允许向读者、工具、软件库等寻求推荐的问题。您可以编辑问题,以便用事实和引文来回答。

5年前关闭。

使用 ReST/Sphinx 标记 RESTful Web 服务的方法/URL 的最佳方法是什么?是否有适合使用可能的参数、HTTP 方法、标头和正文内容标记 URL 的默认域?

大致如下:

.. rest:method:: GET /api/foo

   :param bar: A valid bar
   :extension: json or xml

   Retrieve foos for the given parameters. E.g.::

      GET /api/foo.json?bar=baz

这样的东西是否已经存在,或者其中一个默认扩展可用,或者我必须自己编写一个?

REST 文档 python-sphinx

评论

0赞 Henrik P. Hessel 1/19/2011
你找到解决这个问题的方法了吗?面对同样的“问题”:)
0赞 deceze 1/19/2011
@Henrik 请参阅下面的答案

答:

18赞 deceze 1/19/2011 #1

由于似乎没有任何现有的解决方案,因此我实现了一个非常简单的 HTTP 域,可用于标记 API 方法:

import re

from docutils import nodes

from sphinx import addnodes
from sphinx.locale import l_, _
from sphinx.domains import Domain, ObjType
from sphinx.directives import ObjectDescription


http_method_sig_re = re.compile(r'^(GET|POST|PUT|DELETE)?\s?(\S+)(.*)$')

class HTTPMethod(ObjectDescription):

    def handle_signature(self, sig, signode):
        m = http_method_sig_re.match(sig)
        if m is None:
            raise ValueError

        verb, url, query = m.groups()
        if verb is None:
            verb = 'GET'

        signode += addnodes.desc_addname(verb, verb)
        signode += addnodes.desc_name(url, url)

        if query:
            params = query.strip().split()
            for param in params:
                signode += addnodes.desc_optional(param, param)

        return url


class HTTPDomain(Domain):
    """HTTP language domain."""
    name = 'http'
    label = 'HTTP'
    object_types = {
        'method':    ObjType(l_('method'),    'method')
    }
    directives = {
        'method':       HTTPMethod
    }

def setup(app):
    app.add_domain(HTTPDomain)

它允许我标记这样的方法,并且它们的样式在视觉上会很好:

.. http:method:: GET /api/foo/bar/:id/:slug

   :param id: An id
   :param slug: A slug

   Retrieve list of foobars matching given id.

这是我第一次尝试 Sphinx 和 Python,所以这应该被认为是非常基本的代码。如果有人有兴趣充实这个项目,请在 Github 上分叉这个项目

评论

1赞 Henrik P. Hessel 1/19/2011
伟大!谢谢!您应该在标题中添加术语 Restful,以获得更高的 google pagerank 关于此主题:)我可以做到,但我不喜欢搞砸好问题。
1赞 deceze 1/19/2011
@Henrik 好点子。:)我正在考虑将其扔到 Github 上,以便进行一些协作开发。你觉得怎么样?
0赞 Henrik P. Hessel 1/19/2011
如果它在 Githubs 上结束,不会伤害任何人;)
0赞 ʇsәɹoɈ 10/14/2011
我今天从 python 包索引安装了它,但它根本不起作用。引发了此异常:TypeError:__init__() 得到了一个意外的关键字参数“can_collapse”
25赞 Viktor Haag 10/3/2011 #2

Sphinx Contrib 项目似乎也有一个 HTTP 域包,用于记录 RESTful HTTP API。您可以在 Python 包站点上找到其文档。我不能说它的适用性:我才刚刚开始研究狮身人面像,我还需要记录 RESTful API,并注意到这个贡献的包。

评论

0赞 ʇsәɹoɈ 10/14/2011
+1.我今天尝试了这个扩展,发现这是一个非常好的开始。它还带有一个模块,可以扫描 Flask 应用程序的路由表以获取文档,就像 autodoc 一样。(我还没有尝试过那部分。
0赞 deceze 10/23/2012
将此标记为已接受,因为我认为这是维护得更好的软件包。我的版本现在基本上被放弃了(尽管它确实可以按原样工作)。
4赞 Viktor Haag 10/25/2012
我现在可以评论说,我们已经在生产中使用 Sphinx(带有 HTTP 域包)一年了,它做得很好。我做了一些局部的改变,以满足我们的特定需求,但总的来说,我对结果非常满意。
0赞 proteneer 2/17/2014
注意:sphinxcontrib.autohttp.tornado 仅适用于 Python 2.x,因为它导入了 StringIO。
1赞 Viktor Haag 2/19/2014
@proteneer,据我所知,这不是我所指的扩展包:我指的是.sphinxcontrib-httpdomain