J'écris une spécification pour une API RESTful pour un nouveau service Web interne. Ce n'est pas extrêmement long et assez simple, mais malgré tout, c'est la première fois que j'utilise strict REST (par opposition à la triche pour des raisons pratiques - en évitant PUT
et DELETE
parce qu'ils sont un problème en PHP, etc.). Je me demandais s'il y avait des méthodes standard ou des meilleures pratiques pour documenter une interface REST? Je veux que le reste de l'équipe comprendre en un coup d'œil, et pour quiconque veut écrire un client pour pouvoir le faire sans comprendre le code sous-jacent.
Dans le post de Roy ici il déclare
Une API REST doit consacrer presque tout son effort descriptif à définir le ou les types de support utilisés pour représenter les ressources et piloter l'état de l'application, ou pour définir des noms de relation étendus et/ou une marque activée par hypertexte -up pour les types de supports standard existants. Tout effort consacré à décrire les méthodes à utiliser sur les URI d'intérêt devrait être entièrement défini dans le cadre des règles de traitement pour un type de support (et, dans la plupart des cas, déjà défini par les types de support existants) .
Bien sûr, les API REST devraient idéalement utiliser HATEOAS et être basées sur l'hypertexte (avec une utilisation intensive des types de médias), mais il est également utile de disposer d'une documentation simple et conviviale pour les développeurs.
Quelques outils spécifiques utiles pour générer de la documentation comme celle-ci:
J'utilise http://apiary.io , ce qui est plutôt sympa. Vous pouvez également exporter la documentation de l'API vers github.
Une bonne documentation ReST signifierait documenter votre type de support et uniquement votre type de support.
Dans un scénario typique, vous produisez un document comme ceci:
Les liens vers diverses ressources sont décrits dans un document qui peut être trouvé en émettant une requête GET ou HEAD au serveur sur un URI de signet (généralement la racine du serveur, http: //www.acme.org ), et à la recherche d'un en-tête de lien HTTP:
Link: <xxx>;rel="http://rel.acme.org/services";type=application/vnd.acme.services+xml
où la partie rel
est la relation de liaison et la xxx
est l'URI pour lequel la relation a été établie.
Ce document définit les noms de relation suivants:
Le application/vnd.acme.services+xml
est un document avec une sérialisation xml
qui décrit une liste de liens qu'une application peut vouloir traiter.
<links>
<link rel="http://rel.acme.org/customers" href="http://www.acme.org/services/customers" type="application/vnd.acme.customers+xml" />
</link>
Le applcation/vnd.acme.customers+xml
est un document avec une sérialisation xml
qui décrit les clients.
<customers>
<customer firstname="Darth" lastname="Vador" href="http://www.acme.org/services/customers/28" />
</customer>
etc...
Il s'agit de donner au développeur un moyen de suivre les liens que vous définissez. Trouvez d'abord le lien vers l'index afin qu'ils puissent obtenir la liste des éléments sur lesquels ils peuvent naviguer.
Une fois qu'ils ont découvert ce document, ils découvrent qu'ils peuvent voir une liste de clients à un certain Uri et peuvent faire un GET
contre lui.
S'ils trouvent un client d'intérêt, ils peuvent suivre le lien défini dans /customers/customer/@href
et émettez un GET
pour récupérer une représentation de ce client.
À partir de là, votre type de média pourrait incorporer des actions disponibles pour l'utilisateur, en utilisant plus de liens. Vous avez également la possibilité supplémentaire d'émettre une demande OPTIONS sur la ressource pour savoir si vous pouvez autoriser la suppression de la ressource, ou un PUT si vous pouvez sauvegarder le document après modification.
Donc une bonne documentation ne fait jamais:
Le but de tout cela est de réaliser un couplage minimum entre les clients et les serveurs. Le client peut être très intelligent pour afficher et découvrir des ressources (montrer des formulaires et Dieu sait quoi d'autre), mais il est totalement stupide quant à ce qu'est le flux de travail réel: le serveur décide.
Dans mon entreprise, nous avons été très heureux d'utiliser WADL , Web Application Description Language. Wikipedia décrit comme: "un format de fichier basé sur XML qui fournit une description lisible par machine des applications Web basées sur HTTP". Je trouve que le WADL brut est facile à écrire, à lire et à comprendre, et il correspond directement aux concepts RESTful. Le projet officiel fournit une spécification simple, XSD et RELAX NG schemata, et Java tools.
Il existe un certain nombre d'outils et de ressources pour travailler avec WADL, notamment:
Un conseil: essayez d'inclure une documentation lisible par l'homme, comme les descriptions, les concepts, le démarrage, les conseils d'utilisation, etc., dans l'élément doc
du document WADL en incluant des éléments HTML, en utilisant l'espace de noms XHTML. Cela peut faire une grande différence!
Au départ, nous avons opté pour une documentation statique des ressources mais nous devions simplement répondre à trop de questions. Finalement, nous sommes passés à l'utilisation des pages de documentation Live en utilisant IO/Docs (en fait un fork ). Fonctionne très bien.
Vous pourriez trouver rest-tool utile.
Il suit une approche indépendante du langage pour écrire des spécifications, une simulation d'implémentation et des tests unitaires automatisés pour les API RESTful. Il fournit également un livre de cuisine, mais il est à un stade très précoce, mais son contenu ne cesse de croître.
Les services que vous venez de décrire peuvent être immédiatement utilisés, ils sont donc également utiles pour l'expérimentation.
Pour créer une compréhension/documentation, les solutions lourdes ne sont pas toujours nécessaires. Des exemples de (grands) outils lourds sont: IO/Docs/Apigee (bien que de grands outils).
Pour les petits projets qui ont déjà une configuration Docchain (doxygen/phpdoc/phpdoctor/custom/etc), j'utilise le shellscript suivant pour simplement inclure la page dans la documentation complète générée:
https://Gist.github.com/4496972
Une démo: http://pastie.org/565719
Il suffit d'utiliser des balises de commentaire personnalisées dans votre code source. Il peut également être un bon point de départ pour documenter n'importe quel code source (langue).