2010-12-28 20 views
31

)ReST/Sphinxを使用してRESTful Webサービスのメソッド/ URLをマークアップする最も良い方法は何ですか?可能なパラメータ、HTTPメソッド、ヘッダー、本文のコンテンツを持つURLをマークアップするのに適したデフォルトドメインがありますか?線に沿ってRESTful WebサービスAPIドキュメント(スフィンクス

何か:このようなものは、すでに

.. 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 

を存在しないか、使用可能なデフォルトの拡張子の一つである、または私は1つを自分で記述する必要がありますでしょうか?

+0

この問題の解決方法をお探しですか?同じ問題に直面しています:) –

+0

@Henrik See [answer below](http://stackoverflow.com/questions/4545828/web-service-api-documentation-with-sphinx/4732927#4732927) – deceze

答えて

25

Sphinx Contribプロジェクトには、RESTful HTTP APIを文書化するための HTTPドメインパッケージがあるようです。そのドキュメントはPython packagesサイトでご覧いただけます。 Sphinxを調べ始めたばかりで、RESTfulなAPIも文書化する必要があり、この寄贈されたパッケージに気付きました。

+0

+1があります。私は今日この拡張を試み、それが本当に良いスタートであることを発見しました。また、autodocのようにFlaskアプリケーションのルーティングテーブルをスキャンしてドキュメント化できるモジュールも用意されています。 (私はまだその部分を試していません) –

+0

これは、私が考えるより良い維持パッケージのように、これを受け入れたものとしてマークしています。私のバージョンは本質的に放棄されています(ただし、そのまま動作します)。 – deceze

+3

私は今、1年の生産でSphinx(_HTTP Domain_パッケージ)を使っているとコメントしています。私は、私たちの特別なニーズに合わせてローカルにいくつかの変更を加えましたが、一般的には結果に非常に満足しています。 –

18

任意の既存のソリューションがあるように表示されませんので、私はAPIメソッドをマークアップするために使用することができ、非常に単純なHTTPドメインを実装している:

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. 

これはスフィンクスとPythonの両方への私の最初の進出だったので、これは非常に初歩的なコードを考慮すべきです。もし誰かがこれを解き放つことに興味があれば、fork this project on Githubをください!

+1

素晴らしい!ありがとう!あなたはこのトピックについてより高いGoogleページランクを得るためにタイトルに安静という言葉を加えるべきです:)私はそれをすることができましたが、良い質問をするのは好きではありません。 –

+1

@Henrik良い点。 :)私はいくつかの共同開発を可能にするためにGithubでこれを投げることについて考えています。どう思いますか? – deceze

+0

Githubsの上にいる人は誰も害しません;) –