======Documentation des API Rest (docs, tests, mocks)======
==== Différents outils de génération de doc ====
Classement par préférence :
- [[http://raml.org/|RAML]] : v1.0 (2015-11-03) [Licence MIT]
- [[https://apiblueprint.org/|API-BluePrint]] : v1A9 (2015-06-08) [Licence MIT]
- [[http://swagger.io/specification/|Swagger]] : v2.0 (2014-09-08) [Licence Apache, v2.0]
- [[http://apidocjs.com/|ApiDocJs]] : v0.13.0 (2015-05-08) Permet de générer une doc à partir d'une syntaxe PHPdoc. Simple mais avec peu d'outils liés. [Licence MIT]
===== RAML =====
Site principal : [[http://raml.org/|RAML]] : v1.0 (2015-11-03) [Licence MIT]
* Permet de rédiger la doc en Markdown.
* Très similaire à Apiblueprint.
* Écosystème très riche (plus qu'Apiblueprint).
* De très nombreux outils (dans différents langage) à disposition : doc, test, designer, mock server...
===== Apiblueprint =====
Site principal : [[https://apiblueprint.org/|API-BluePrint]] : v1A9 (2015-06-08) [Licence MIT]\\
Permet de rédiger la doc en Markdown. Relativement complexe pour se retrouver dans la doc.
=== Ressources ===
* [[https://apiblueprint.org/| Site officiel]]
* [[https://raw.githubusercontent.com/danielgtaylor/aglio/master/example.apib|Exemple]] : exemple de fichier markdown.
* [[https://github.com/danielgtaylor/aglio|Agglio]] : interface de consultation de la doc API Blueprint (PHP). [Licence MIT]
* [[https://htmlpreview.github.io/?https://raw.githubusercontent.com/danielgtaylor/aglio/blob/master/examples/flatly.html#notes-note-list-get|Rendu]] : Exemple de rendu avec Aglio.
* [[http://dredd.readthedocs.org/en/latest/|Dredd]] : outils vérifiant la synchro entre l'implémentation des services web et la doc API Blueprint. [Licence MIT]
* [[https://github.com/stekycz/restful-api-testing/tree/master/chapters|Retour sur les API REST et les outils de tests]], dont Dredd & API Blueprint
* [[https://github.com/stekycz/cucumber-4-api-blueprint|Cucumber-4-Api-blueprint]] : jonction entre Cucumber (framework de test JS) et Api-blueprint. [Licence MIT]
* [[https://github.com/localmed/api-mock|Api-Mock]] : créer un serveur qui renvoie les données fournies en exemple pour chaque service web. [Licence MIT]
* [[https://github.com/kminami/apib2swagger/|Apib2Swagger]] : convertisseur de API Blueprint 1A8 vers Swagger 2.0. [Licence MIT]
* Pour les tutoriels, voir le site Apiary :
* [[https://apiary.io/blueprint|Tutoriel]] : tutoriel pour la création d'une doc API Blueprint.
* [[https://docs.apiary.io/api_101/api_blueprint_tutorial/|API Blueprint]]
* [[https://docs.apiary.io/api_101/mson-tutorial/|MSON]]
* [[https://docs.apiary.io/api_101/uri-templates/|URI Templates]]
* [[https://docs.apiary.io/api_101/json-schema/|JSON Schema]]
* Les spécifications :
* [[https://github.com/apiaryio/api-blueprint/blob/master/API%20Blueprint%20Specification.md|API Blueprint]]
* [[https://github.com/apiaryio/mson|MSON]]
=== Notes ===
* Pour pouvoir gérer différente version de //nodejs// (et //npm//), il faut utiliser : **//nvm//**
* Installer //npm// globallement avec //nvm// : ## n=$(which node);n=${n%/bin/node}; chmod -R 755 $n/bin/*; sudo cp -r $n/{bin,lib,share} /usr/local ##
* Pour que //Protagonist// fonctionne, il faut bien compiler tous les paquets avec la même version de //Node//.
* Comma separated URI parameter : https://github.com/apiaryio/api-blueprint/issues/120
===== Swagger =====
Site principal : [[http://swagger.io/specification/|Swagger]] : v2.0 (2014-09-08) [Licence Apache, v2.0]
Ancien, mais toujours actif. Syntaxe YAML. Editeur et doc utilise nodejs. L'écosystème semble moins développer que les précédents. Le générateur de SDK est en Java...
=== Ressources ===
* [[https://github.com/swagger-api/swagger-editor|Swagger-Editor]] : interface web (utilise Node.js)
* [[https://github.com/swagger-api/swagger-ui|Swagger-ui]] : interface de consultation de la doc Swagger (HTML 5). [Licence Apache, v2.0]
===== Initialisation d'un projet de doc avec Apiblueprint =====
- Installer le gestionnaire de version de node : ## nvm ##
- Installer la version 0.12.8 : ##nvm install 0.12.8##
- Basculer sur la version de node 0.12.8 : ##nvm use 0.12.8##
- Avec npm initialiser un projet de doc : ##npm init##
- Puis installer les paquets :
* aglio : pour générer la doc au format HTML.
* drakov : serveur qui 'mocke' une api en fonction de la doc APIblueprint.
* dredd : pour tester la doc vis à vis de l'api développée. Permet de vérifier la consistance de la doc vis à vis de l'API réelle.
* hercule : permet de réaliser la transclusion de contenu présent dans différents fichiers.
=== Aglio (node : v0.12.8) ===
Pour simplifier, on peut rajouter ces commandes dans la partie //scripts// du fichier //package.json//, avec les entrées :
"aglio-server": "./node_modules/.bin/aglio -i mon-api.apib --theme-full-width --theme-variables flatly -s",
"aglio-convert": "./node_modules/.bin/aglio -i mon-api.apib --theme-full-width --theme-variables flatly -o mon-api.html"
=== Drakov (node : v0.12.8) ===
Serveur de mock de l'API.
Ajouter dans la partie //scripts// du fichier //package.json// :
"drakov": "./node_modules/.bin/drakov -f mon-api.apib"
=== Dredd (node : v0.12.8) ===
* Pour initialiser //Dredd// et créer le fichier de config //dredd.yml//, lancer la commande : ##./node_modules/.bin/dredd init##
* Pour lancer les tests avec Dredd : ##./node_modules/.bin/dredd##
* Pour simplifier, on peut rajouter ces commandes dans la partie //scripts// de //package.json// :
"dredd": "./node_modules/.bin/dredd"
On pourra ensuite utiliser les commandes :
* ## npm run dredd init ##
* ## npm run dredd ##
===Hercule (node v0.12.8) ===
Permet de découper une document Markdown en plusieurs sous partie.
* Pour simplifier, on peut rajouter une commande dans la partie //scripts// de //package.json// :
"hercule": "./node_modules/.bin/hercule mon-api.src.apib -o mon-api.apib"
=== Gulp (node v0.12.8) ===
Permet d'automatiser le fonctionnement des modules ci-dessus : aglio, dredd et hercule.
var gulp = require('gulp');
var plumber = require('gulp-plumber');
var rename = require("gulp-rename");
var es = require('event-stream');
var hercule = require('hercule');
var dredd = require('dredd');
var exec = require('child_process').exec;
gulp.task('default', ['startWatcher', 'startAglioServer']);
gulp.task('startAglioServer', function() {
exec('./node_modules/.bin/aglio -i mon-api.apib --theme-full-width --theme-variables flatly -s', function (error, stdout, stderr) {
console.log('Stdout: ' + stdout);
console.log('Stderr: ' + stderr);
if (error !== null) {
console.log('Exec error: ' + error);
}
});
});
gulp.task('startWatcher', function() {
var watcher = gulp.watch('mon-api.src.apib', ['doHercule']);
var watcherDest = gulp.watch('mon-api.apib', ['doDredd']);
watcher.on('change', function(event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});
});
gulp.task('doHercule', function() {
function transclude() {
// you're going to receive Vinyl files as chunks
function transform(file, cb) {
hercule.transcludeString(file.contents.toString(), function(output) {
file.contents = new Buffer(output);
});
cb(null, file);
}
return es.map(transform);
};
gulp.src('mon-api.src.apib')
.pipe(plumber())
.pipe(transclude())
.pipe(rename('mon-api.apib'))
.pipe(gulp.dest('./'));
});
gulp.task('doDredd', function() {
var dreddConfig = {
server: 'http://api.mon-site.org/mon-api/v1', // your URL to API endpoint the tests will run against
options: {
'path': 'mon-api.apib', // Required Array if Strings; filepaths to API Blueprint files, can use glob wildcards
'dry-run': false, // Boolean, do not run any real HTTP transaction
'names': false, // Boolean, Print Transaction names and finish, similar to dry-run
'level': 'verbose', // String, log-level (info, silly, debug, verbose, ...)
'silent': false, // Boolean, Silences all logging output
'only': [], // Array of Strings, run only transaction that match these names
'header': [], // Array of Strings, these strings are then added as headers (key:value) to every transaction
'user': null, // String, Basic Auth credentials in the form username:password
'hookfiles': [], // Array of Strings, filepaths to files containing hooks (can use glob wildcards)
//'reporter': ['dot', 'html'], // Array of possible reporters, see folder src/reporters
//'output': [], // Array of Strings, filepaths to files used for output of file-based reporters
'inline-errors': false, // Boolean, If failures/errors are display immediately in Dredd run
'color': true,
'timestamp': false
}
//'emitter': EventEmitterInstance, // optional - listen to test progress, your own instance of EventEmitter
//'hooksData': {
// 'pathToHook' : ''
//}
};
var dredd = new dredd(dreddConfig);
dredd.run(function (err, stats) {
if (err) {
console.log(err);
}
});
});