Standardmethoden zur Dokumentation einer RESTful-API [geschlossen]

70

Ich schreibe eine Spezifikation für eine RESTful-API für einen neuen internen Webdienst. Es ist nicht sehr lang und ziemlich einfach, aber trotzdem verwende ich zum ersten Mal striktes REST (im Gegensatz zu Betrug aus praktischen Gründen - Vermeiden PUTund DELETEweil sie in PHP schmerzhaft sind und so weiter). Ich habe mich gefragt, ob es Standardmethoden oder Best Practices für die Dokumentation einer REST-Schnittstelle gibt. Ich möchte, dass der Rest des Teams es auf einen Blick versteht und dass jeder, der einen Client schreiben möchte, dies tun kann, ohne den zugrunde liegenden Code zu verstehen.

Samir Talwar
quelle
Mögliches Duplikat der RESTful API-Dokumentation
cHao
1
Mögliches Duplikat der RESTful API-Dokumentation
iankit

Antworten:

48

Sicher, REST-APIs sollten idealerweise HATEOAS verwenden und hypertextgesteuert sein (bei starker Verwendung von Medientypen), aber es ist auch hilfreich, eine einfache, benutzerfreundliche Dokumentation zu haben, an der Entwickler arbeiten können.

Einige spezielle Tools, die zum Generieren der folgenden Dokumentation hilfreich sind:

  • Stolzieren
  • Mashery
    • Ein Open Source Projekt [ github ]
    • Werkzeuge zum Generieren
      • Dokumentation
      • Eine Explorationsschnittstelle für Ihre API
  • Bienenhaus und API Blueprint
    • Schreiben Sie die API-Beschreibung in ein DSL innerhalb von Markdown
    • Werkzeuge zur automatischen Generierung
      • Dokumentation
      • Mock Server
    • Scheint sich auf Ruby + Mac-Entwickler zu konzentrieren
  • RAML
    • Eine Spezifikation zur Beschreibung von REST-APIs [ github ]
  • WADL
  • APIgee
    • Ein kommerzielles Produkt mit einigen Dokumentationsfunktionen
  • 3skala
    • Ein kommerzielles Produkt mit einigen Dokumentationsfunktionen
  • Miredot
    • Kommerzieller REST API-Dokumentationsgenerator
    • Java-spezifisch
turtlemonvh
quelle
1
Sie sollten auch miredot miredot.com zur Liste hinzufügen
java_geek
@java_geek Klar, danke für die Aufnahme. Fühlen Sie sich frei zu bearbeiten, wenn Sie mehr finden.
Turtlemonvh
Erwähnenswert sind auch Konvertierungen zwischen API-Beschreibungsformaten, z. B. github.com/lucybot/api-spec-converter und studio.restlet.com
Erik Sundvall,
13

Ich habe http://apiary.io verwendet , was ziemlich nett ist. Sie können die API-Dokumentation auch nach github exportieren.

Martin Konecny
quelle
Dokumentiert es nicht, wie URIs erstellt werden? .. was klingt gegen HATEOAS?
Myobis
9

In Roys Post hier sagt er

Eine REST-API sollte fast den gesamten beschreibenden Aufwand für die Definition der Medientypen verwenden, die zur Darstellung von Ressourcen und zur Steuerung des Anwendungsstatus verwendet werden, oder für die Definition erweiterter Beziehungsnamen und / oder hypertextfähiger Markierungen für vorhandene Standardmedientypen. Jeder Aufwand, der aufgewendet wird, um zu beschreiben, welche Methoden für welche URIs von Interesse verwendet werden sollen, sollte vollständig im Rahmen der Verarbeitungsregeln für einen Medientyp definiert werden (und in den meisten Fällen bereits durch vorhandene Medientypen definiert).

Darrel Miller
quelle
9
Ich denke, Sie sagen, dass die API selbstdokumentierend und logisch genug sein sollte, um keine Dokumentation zu benötigen. Das ist gerecht genug. Irgendwann muss ich den Leuten jedoch zumindest eine Liste der erlaubten Anrufe geben. Ich möchte wissen, ob es für diese Liste eine akzeptierte Struktur gibt.
Samir Talwar
7
Medientypen benötigen definitiv Dokumentation. Hier einige Beispiele: iana.org/assignments/media-types/application Ihre Dokumentation sollte keine Liste von URLs enthalten. Dies wird Client-Entwickler lediglich dazu ermutigen, diese URLs in ihre Anwendung fest zu codieren.
Darrel Miller
5
Vielleicht kann ich mir ein nützliches Beispiel ausdenken. Stellen Sie sich vor, Sie gehen in ein fremdes Land, in dem Sie die Sprache nicht sprechen, und gehen in eine Bibliothek, um nach Informationen zu suchen. Stellen Sie sich vor, Sie hätten um Hilfe gebeten und die Person hätte Ihnen das Konzept eines Bücherregals, der ISBN-Katalogisierung, erklärt, dass Bücher Seiten enthielten und Sie das Buch von vorne nach hinten lesen. Alle gültigen Informationen, aber das wissen Sie bereits. Sie benötigen jemanden, der den Inhalt übersetzt. Im Web kennen wir uns mit URLs und Hyperlinks aus und wissen, wie man HTTP-Verben verwendet. Wir müssen nur die Details Ihres Inhalts verstehen.
Darrel Miller
2
Erwischt. Dies war auch mein Bauchgefühl: Geben Sie detaillierte Erklärungen darüber, was jeder Anruf tut , nicht was er ist . Ich denke, es gibt keine Standardmethode dafür, aber zum Teufel, ich schätze, es hat niemandem geschadet (zitiere mich nicht dazu). Danke für Ihre Hilfe.
Samir Talwar
1
@Mark Sie können also nur für jeden Endpunkt entwickeln, indem Sie zuerst den Endpunkt abfragen und dann Ihre eigene Dokumentation schreiben, um den Endpunkt zu beschreiben? Das scheint nicht sehr benutzerfreundlich zu sein.
Nick Coad
6

Eine gute ReST-Dokumentation würde bedeuten, dass Sie Ihren Medientyp und nur Ihren Medientyp dokumentieren.

In einem typischen Szenario würden Sie ein Dokument wie folgt erstellen:

Die Acme Corp XML-Formate

Linkerkennung

Links zu verschiedenen Ressourcen werden in einem Dokument beschrieben, das gefunden werden kann, indem eine GET- oder HEAD-Anforderung an den Server über einen Lesezeichen-URI (normalerweise das Stammverzeichnis des Servers, http://www.acme.org ) gesendet und nach einem gesucht wird HTTP Link Header:

Link: <xxx>;rel="http://rel.acme.org/services";type=application/vnd.acme.services+xml

Dabei ist der relTeil die Verknüpfungsbeziehung und xxxder URI, für den die Beziehung hergestellt wurde.

Beziehungen verknüpfen

Dieses Dokument definiert die folgenden Beziehungsnamen:

Medientypen

Dies application/vnd.acme.services+xmlist ein Dokument mit einer xmlSerialisierung, das eine Liste von Links beschreibt, die eine Anwendung möglicherweise verarbeiten möchte.

<links>
 <link rel="http://rel.acme.org/customers" href="http://www.acme.org/services/customers" type="application/vnd.acme.customers+xml" />
</link>

Das applcation/vnd.acme.customers+xml ist ein Dokument mit einer xmlSerialisierung, die Kunden beschreibt.

Beispieldokumente:

<customers>
 <customer firstname="Darth" lastname="Vador" href="http://www.acme.org/services/customers/28" />
</customer>

usw...

Der Punkt ist, dem Entwickler eine Möglichkeit zu geben, den von Ihnen definierten Links zu folgen. Suchen Sie zuerst den Link zum Index damit sie die Liste der Dinge erhalten, zu denen sie navigieren können.

Sobald sie dieses Dokument entdeckt haben, stellen sie fest, dass sie eine Liste von Kunden bei einem bestimmten Uri sehen und eine ausführen können GET können.

Wenn sie einen Kunden von Interesse finden, können sie dem in definierten Link folgen /customers/customer/@hrefund a ausgebenGET , um eine Darstellung dieses Kunden abzurufen.

Von dort aus kann Ihr Medientyp Aktionen einbetten, die dem Benutzer mithilfe weiterer Links zur Verfügung stehen. Sie haben auch die zusätzliche Möglichkeit, eine OPTIONS-Anforderung für die Ressource auszugeben, um festzustellen, ob Sie das Löschen der Ressource zulassen können, oder einen PUT, wenn Sie das Dokument nach der Änderung wieder speichern können.

Eine gute Dokumentation gibt es also nie:

  • Geben Sie statische Links
  • Geben Sie eine Interaktion wie "Sie können mit diesem Medientyp einen POST für den Kunden ausstellen, und das bedeutet den Verschiebungsvorgang". Der Client sollte einen POST nur gegen den Kunden ausstellen, weil Ihr XML-Dokument dies so angegeben hat.

Bei alledem geht es darum, eine minimale Kopplung zwischen Clients und Servern zu erreichen. Der Client kann sehr intelligent Ressourcen anzeigen und entdecken (Formulare anzeigen und Gott weiß was noch), ist aber völlig dumm, was der eigentliche Workflow ist: Der Server entscheidet.

SerialSeb
quelle
OK, daher sollte ich hauptsächlich die Linkerkennung verwenden, um die API zu dokumentieren. Wie genau erstelle ich ein solches XML-Dokument? Hast du irgendwelche Links?
Samir Talwar
Ja, Sie würden dokumentieren, wie Sie Links und Aktionen in Ihrem Medientyp erkennen. Schauen Sie sich ATOM und HTML an, das ist so ziemlich alles, was Sie brauchen: ein <link rel = href => und eine Möglichkeit, eine Aktion zu vermitteln, die Sie in Ihrem Client anzeigen möchten.
SerialSeb
4

In meinem Unternehmen haben wir WADL , Web Application Description Language, sehr gerne verwendet . Wikipedia beschreibt es als: "ein XML-basiertes Dateiformat, das eine maschinenlesbare Beschreibung von HTTP-basierten Webanwendungen bietet". Ich finde es einfach, rohe WADL zu schreiben, zu lesen und zu verstehen, und sie ist direkt RESTful-Konzepten zugeordnet. Das offizielle Projekt bietet eine einfache Spezifikation, XSD- und RELAX NG-Schemata sowie Java-Tools.

Für die Arbeit mit WADL stehen eine Reihe von Tools und Ressourcen zur Verfügung, darunter:

Ein Tipp: Versuchen Sie, lesbare Dokumentationen wie Beschreibungen, Konzepte, Erste Schritte, Verwendungstipps usw. in das docElement des WADL-Dokuments aufzunehmen, indem Sie HTML-Elemente mithilfe des XHTML-Namespace einfügen. Es kann einen großen Unterschied machen!

Avi Flachs
quelle
1
Eine laufende Diskussion in Rest-Diskussion [1] zeigt, dass eine Reihe von REST-Befürwortern wenig Vorteile für die Verwendung von WADL sehen. [1] tech.groups.yahoo.com/group/rest-discuss/message/12680
Darrel Miller
1
Ich habe mich mit WADL befasst, aber es scheint, dass es eher auf maschinelle Interpretation als auf Dokumentation ausgerichtet ist. Ich muss dem Computer nicht sagen, wie er mit der API umgehen soll - das muss nur einmal geschrieben werden. Ich muss den Leuten sagen, wie man Kunden schreibt, und deshalb sind die Leute mein primäres Publikum.
Samir Talwar
Sie können auch clientseitige Stubs mit WADL für stark typisierte Sprachen generieren. ZB siehe wadl2java
DSO
2

Anfangs haben wir uns für die statische Dokumentation von Ressourcen entschieden, mussten aber einfach zu viele Fragen stellen. Schließlich haben wir Live-Dokumentationsseiten mit IO / Docs (eigentlich eine Abzweigung ) verwendet. Ich habe großartig gearbeitet.

Raghu
quelle
2

Möglicherweise finden Sie Rest-Tool hilfreich.

Es folgt einem sprachunabhängigen Ansatz zum Schreiben von Spezifikationen, zur Scheinimplementierung und zum automatisierten Testen von Einheiten für RESTful-APIs. Es bietet auch ein Kochbuch, obwohl es sich in einem sehr frühen Stadium befindet, aber sein Inhalt wächst kontinuierlich.

Die Dienste, die Sie gerade beschrieben haben, können sofort verwendet werden, sodass Sie auch gut experimentieren können.

Tombenke
quelle
0

Um Verständnis / Dokumentation zu schaffen, werden nicht immer schwergewichtige Lösungen benötigt. Beispiele für (großartige) Schwergewichtswerkzeuge sind: IO / Docs / Apigee (obwohl großartige Werkzeuge).

Für kleine Projekte, die bereits ein Docchain-Setup haben (doxygen / phpdoc / phpdoctor / custom / etc), verwende ich das folgende Shellscript, um nur die Seite in die vollständig generierte Dokumentation aufzunehmen:

https://gist.github.com/4496972

Eine Demo: http://pastie.org/5657190

Es werden nur benutzerdefinierte Kommentar-Tags in Ihrem Quellcode verwendet. Es kann auch ein guter Ausgangspunkt für die Dokumentation eines beliebigen Quellcodes (einer beliebigen Sprache) sein.

coderofsalvation
quelle
1
Es wäre vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
j0k