L'API HTTP a pour but d'offrir un accès standard aux données de Dynacase.
L'architecture de cette api s'appuie sur une architecture REST (Representational state transfer) et permet de manipuler les ressources Dynacase suivantes :
L'api présentée dans la suite du document est de type REST et utilise le vocabulaire propre à ces API, ce qui inclut :
ressource
: une ressource est un type de donnée et son contenu, dans notre cas un document, la description d'un
fichier, etc.,collection
: une collection est un type de ressource. Dans notre cas, la liste des documents, la liste des fichiers, etc.
La collection est utilisée pour référencer une ressource, créer une ressource, détruire une ressource,identifiant
: l'identifiant est la clef unique permettant de trouver une ressource au sein d'une collection. Dans
notre cas, c'est l'id
d'un document, le vaultid
d'un fichier, etc.La structure est conforme au standard REST.
Les actions du CRUD sont implémentées et associées aux méthodes de HTTP, suivant la liste d'équivalence suivante :
Action | Méthode HTTP | URL | Action effectuée |
---|---|---|---|
Create |
POST |
/api/v1/<collection> |
Créé une nouvelle ressource dans la collection et répond avec la ressource |
Read |
GET |
/api/v1/<collection> |
Lit le contenu de la collection et répond avec une liste de ressources |
Read |
GET |
/api/v1/<collection>/<id> |
Lit la ressource id et répond avec la ressource |
Update |
PUT |
/api/v1/<collection> |
Remplace l'intégralité de la collection et répond avec une liste de ressources |
Update |
PUT |
/api/v1/<collection>/<id> |
Modifie la ressource id de la collection et répond avec la ressource |
Delete |
DELETE |
/api/v1/<collection> |
Supprime l'intégralité de la collection et répond avec une liste de ressources |
Delete |
DELETE |
/api/v1/<collection>/<id> |
Supprime la ressource id de la collection et répond avec la ressource |
Les accès à l'API HTTP Dynacase se font par l'url http[s]://<url_du_contexte>/api/v1/
.
Tous les échanges, entrées et retours de l'API, sont encodés en UTF-8.
Les éléments de la requête sont les suivants :
Le type de retour attendu (format) est précisé soit :
[http] PUT /api/v1/<collection>/<identifier>.<type>
accept
.Actuellement, seul le type json
est géré. Celui-ci est renvoyé dans le corps
de la requête HTTP.
Le type exprimé dans l'URL est prioritaire à celui du header HTTP.
Pour supporter certains navigateurs ne possédant pas les objets XMLHttpRequest
v2, il est possible d'ajouter le paramètre GET alt=html
et d'avoir ainsi le
retour de la donnée json
dans un textarea au sein d'une page web. 1.0.1
Les données à enregistrer dans la ressource peuvent être envoyées sous 2 formes :
Les options de mise à jour sont envoyées via des variables sur l'URL.
Le corps de la requête est vide.
Les options de consultation, suppression sont envoyées dans l'url à l'aide de variables dans l'URL.
Exemples :
212
: GET
: /api/v1/documents/212
IUSER_JEAN_REMI
: DELETE
: /api/v1/documents/IUSER_JEAN_REMI
Certains clients ne permettant pas d'effectuer des requêtes autre que GET
et
POST
, un fonctionnement en mode compatiblité est possible. Pour ce faire, il
faut modifier le header HTTP en ajoutant X-HTTP-Method-Override
:
Simuler une méthode PUT
:
X-HTTP-Method-Override: PUT
Simuler une méthode DELETE
:
X-HTTP-Method-Override: DELETE
L'API répond via plusieurs éléments, le contenu (content
) du retour et les
entêtes (headers
) HTTP.
Dans le cas d'un retour JSON, la structure retournée contient les éléments suivants :
{ "success" : true, // false ou true "messages" : [{ "type" : "warning", // type de message error, userMessage, warning, notice, notification "contentText" : "once upon a time", "contentHtml" : "", "code" : "", // code identifiant la catégorie du message "uri" : "", // url d'accès à la page web correspondant à l'erreur "data" : { } // données supplémentaires }], "data" : {} // données demandées par la requête
}
Ce retour est envoyé quelque soit le résultat de la requête, y compris en cas d'erreur.
L'API utilise les codes standards du protocole HTTP.
Si l'action demandée a été exécutée, le code HTTP 2xx est retourné.
Exemple de retour :
{ "success" : true, // false ou true "messages" : [], "data" : { "document" : { "properties" : { "id" : 1224, "title" : "Hello world" }, "attributes" : { "ba_ttle" : {"value" : "Hello world"}, "ba_desc" : {"value" : "Nice Day"}, } } } }
Dans l'enveloppe retournée, le booléen success est à true.
Si l'action demandée n'a pas pu aboutir, un code HTTP 4xx
ou en 5xx
est retourné.
Exemple de retour, cas d'un 404 :
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"22222\" not found", "contentHtml" : "", "code" : "API0200", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"22222\" not found" }
Dans l'enveloppe retournée, le booléen success est à false est un ensemble de messages explicitant l'erreur
est ajouté dans le tableau messages
.
Il est nécessaire de préciser la version de l'API pour s'assurer de l'immuabilité des retours et des entrées.
La version de l'api doit être indiquée dans l'url :
/api/v1/documents/1234.json
La version de l'api est le chiffre indiqué après la lettre "v".
L'accès aux ressources est contrôlé par les ressources elles-même mais l'utilisation de l'api est aussi contrôlée de manière générale par l'application "HTTPAPI".
Cette application définit 4 droits (ACL) qui autorisent l'utilisation des méthodes sur les ressources/collections :
PUT
;POST
;GET
;DELETE
.Ces droits s'appliquent de manière globale sur toute l'API quelque soit la ressource/collection concernée.
Si un utilisateur ne possède pas le droit, il ne peut pas effectuer de demande de ce type.
L'accès aux routes est contrôlé si la configuration de la route indique un droit spécifique.
L'accès à l'api requiert une session valide préexistante et préalablement ouverte à l'aide des mécanismes d'authentification de Dynacase (voir manuel de référence de Dynacase Core).
L'api n'est pas utilisable en mode "anonyme" ou "invité".
L'utilisation de l'api dans le cadre d'une interface issue d'une action ne nécessite pas d'autorisation particulière. Le cookie de session est transmis naturellement par le navigateur.
L'accès à l'api peut être autorisé à l'aide d'un jeton d'authentification.
Le jeton peut être indiqué dans le header HTTP :
GET api/v1/documents/9.json Authorization: DcpOpen e2bb65612c70e7ac78d5ccbfe12aa234
Le terme "DcpOpen" est le "HTTP Authentication Scheme" pour identifier le mode d'autorisation.
Il peut être indiqué aussi dans le paramètre GET dcpopen-authorization
GET api/v1/documents/9.json?dcpopen-authorization=e2bb65612c70e7ac78d5ccbfe12aa234
Si un cookie de session est aussi utilisé, il sera ignoré. Le jeton est prioritaire sur le cookie de session.
Le jeton d'accès peut être obtenu avec la méthode suivante :
string Dcp\HttpApi\V1\Authent::getAuthorizationToken( \Account $userAccount, array $routes , int $expireDelay = -1, bool $oneshot = false)
Cette méthode retourne un jeton : une chaîne de caractères composée de caractères hexadécimaux (0-9a-f).
/api/v1
, ne fait pas partie de la vérification.Une route peut être notée de différentes manières :
%^/documents/[0-9]+(.json)?$%
PUT %^/documents/[0-9]+(.json)?$%
Route avec contrainte de paramètre d'url
[ "route" => "%^/vendor/my/logs$%", "methods" => ["GET"], "query" => ["level" => "warning"] ]
Dans ce dernier exemple, la route vers les logs de niveau "waring" sera autorisée seulement:
api/v1/vendor/logs?level=warning
Exemple : Construction d'un jeton utilisable à vie pour l'utilisateur "john.doe"
$john=new account(); $john->setLoginName("john.doe"); $t=Dcp\HttpApi\V1\Authent::getAuthorizationToken($john, ["%.*%"]); print $t; // > cad68f8e1848f12df16e44857c595f9a72124f41
Cet exemple autorise toutes les routes à vie pour l'utilisateur "john.doe".
Exemple : Construction d'un jeton utilisable à vie pour l'utilisateur "john.doe" limité aux données de documents.
$john=new account(); $john->setLoginName("john.doe"); $t=Dcp\HttpApi\V1\Authent::getAuthorizationToken( $john, [ "%^/documents/[0-9]+(.json)?$%", "%^/families/[^/]+/[0-9]+(.json)?$%" ]);
Ici les routes autorisées peuvent être :
Exemple : Construction d'un jeton utilisable à vie pour l'utilisateur "john.doe" limité à la consultation des données de documents.
$john=new account(); $john->setLoginName("john.doe"); $t=Dcp\HttpApi\V1\Authent::getAuthorizationToken( $john, [ "GET %^/documents/[0-9]+(.json)?$%", "GET %^/families/[^/]+/[0-9]+(.json)?$%" ]);
En ligne de commande : à l'aide du programme curl
:
curl -H "Authorization: DcpOpen 8e05b60aac3f67447ab4e352a524633839924eda" http://www.example.net/api/v1/documents/12
En ligne de commande : à l'aide du programme wget
:
wget http://www.example.net/api/v1/documents/12?dcpopen-authorization=cb713422beb7745f9567710ce011039fabf49224 -O 12.json
Sur un client web en javascript avec jQuery :
var token="8e05b60aac3f67447ab4e352a524633839924eda"; $.ajax({ dataType: "json", url: "api/v1/documents/12", headers: { "Authorization":"DcpOpen " + token } }).done(function (data) { console.log("Response", data); }).fail(function () { console.error("Fail", arguments); });
En PHP :
$token="8e05b60aac3f67447ab4e352a524633839924eda"; $url="http://www.example.net/api/v1/documents/12"; $opts = array( 'http'=>array( 'method'=>"GET", 'header'=>"Authorization: DcpOpen $token\r\n" ) ); $context = stream_context_create($opts); $file = file_get_contents($url, false, $context); print $file;
Cette authentification est basée sur l'authentification HTTP basic.
L'accès peut être effectué en indiquant le login et le mot de passe dans le header HTTP.
GET api/v1/documents/9.json Authorization: Basic am9obi5kb2U6c2VjcmV0
Dans ce cas, celui-ci doit contenir la méthode utilisée (Basic) suivi de la représentation en Base64 du nom de l'utilisateur et du mot de passe séparés par le caractère « : » (deux-points).
L'accès peut être effectué via une url comportant le login est le mot passe
Ce type d'authentification ne comporte pas d'autorisation particulière comme pour les jetons. Toute route est accessible en fonction des droits de l'utilisateur identifié.
Si un cookie de session est aussi utilisé, il sera ignoré. L'utilisation du login et du mot de passe est prioritaire.
Par contre, la requête HTTP contient un header "Authorization" avec la méthode "DcpOpen" et que l'url contient le login et le mot de passe alors, ce sera la méthode "Dcp" qui sera utilisée et non la méthode "Basic".
Note : On ne peut pas avoir 2 headers "Authorization" dans la requête.
En ligne de commande : à l'aide du programme curl
:
Avec les informations en clair :
curl --user "john.doe:secret" "http://www.example.net/api/v1/documents/12" curl "http://john.doe:secret@www.example.net/api/v1/documents/12"
Note : Dans ce cas curl
utilise les informations de connexion pour écrire dans
le header la clef "Authorization" avec la méthode "basic" d'authentification.
Le programme "wget" ne supporte pas cette notation d'url avec les mots de passe.
Avec les informations encodées.
curl -H "Authorization: Basic am9obi5kb2U6c2VjcmV0" http://www.example.net/api/v1/documents/12
Sur un client web en javascript avec jQuery :
var login="john.doe"; var password="secret"; $.ajax({ dataType: "json", url: "api/v1/documents/12", headers: { "Authorization":"Basic " + btoa(login + ":" + password) } }).done(function (data) { console.log("Response", data); }).fail(function () { console.error("Fail", arguments); });
En php :
$url="http://john.doe:secret@www.example.net/api/v1/documents/12"; $f=file_get_contents($url); print $f;
Ce chapitre contient un descriptif des améliorations entre les releases de l'api HTTP.
Modifications | Chapitre | Version |
---|---|---|
Restauration de document | Restauration | Mise à jour |
Ajout des liens vers les propriétés | Tous les chapitres sur les ressources documents | Mise à jour |
Réorganisation du plan de l'API | Chapitre cycle de vie, tags | Mise à jour |
Précision sur l'authentification requise au préalable | Authentification | Mise à jour |
Ajout de middleware | Middleware | Nouveau |
Modifications | Chapitre | Version |
---|---|---|
Correction du répertoire d'extension | Extension | Mise à jour |
Précisions sur les formats de retour | Introduction | Mise à jour |
Liste des transitions | Liste des états | Mise à jour |
Restauration de document | Restauration | Mise à jour |
Type | URL | Implanté | Signification |
---|---|---|---|
GET | /api/v1/documents/ | Oui | Liste de documents |
PUT | /api/v1/documents/ | N/A | N/A |
POST | /api/v1/documents/ | N/A | N/A |
DELETE | /api/v1/documents/ | N/A | N/A |
GET | /api/v1/documents/<docid> | Oui | Récupération d'un document |
PUT | /api/v1/documents/<docid> | Oui | Mise à jour d'un document |
POST | /api/v1/documents/<docid> | N/A | N/A |
DELETE | /api/v1/documents/<docid> | Oui | Mise à la poubelle d'un document |
GET | /api/v1/documents/<docid>/history/ | Oui | Récupération des messages d'historique |
PUT | /api/v1/documents/<docid>/history/ | N/A | N/A |
POST | /api/v1/documents/<docid>/history/ | Future version | Ajout d'un message d'historique |
DELETE | /api/v1/documents/<docid>/history/ | N/A | N/A |
GET | /api/v1/documents/<docid>/revisions/ | Oui | Liste des révisions d'un document |
PUT | /api/v1/documents/<docid>/revisions/ | N/A | N/A |
POST | /api/v1/documents/<docid>/revisions/ | N/A | N/A |
DELETE | /api/v1/documents/<docid>/revisions/ | N/A | N/A |
GET | /api/v1/documents/<docid>/revisions/<revisionNumber> | Oui | Révision <revisionNumber> |
PUT | /api/v1/documents/<docid>/revisions/<revisionNumber> | N/A | N/A |
POST | /api/v1/documents/<docid>/revisions/<revisionNumber> | N/A | N/A |
DELETE | /api/v1/documents/<docid>/revisions/<revisionNumber> | N/A | N/A |
GET | /api/v1/families/ | Oui | Liste des familles |
PUT | /api/v1/families/ | N/A | N/A |
POST | /api/v1/families/ | Future version | Création d'une nouvelle famille |
DELETE | /api/v1/families/ | N/A | N/A |
GET | /api/v1/families/<family> | Oui | Consultation du document décrivant la famille |
PUT | /api/v1/families/<family> | Future version | Modification de la configuration de la famille |
POST | /api/v1/families/<family> | N/A | N/A |
DELETE | /api/v1/families/<family> | Future version | Suppression de la famille et des documents associés |
GET | /api/v1/families/<family>/documents/ | Oui | Liste des documents de cette famille |
PUT | /api/v1/families/<family>/documents/ | Future version | Modification en masse de documents de cette famille |
POST | /api/v1/families/<family>/documents/ | Oui | Création d'un document de cette famille |
DELETE | /api/v1/families/<family>/documents/ | Future version | Mise à la poubelle en masse des documents de cette famille |
GET | /api/v1/families/<family>/documents/<docid> | Oui | Récupération d'un document de la famille |
PUT | /api/v1/families/<family>/documents/<docid> | Oui | Mise à jour d'un document de la famille |
POST | /api/v1/families/<family>/documents/<docid> | N/A | N/A (Création d'un document avec un identifiant donné) |
DELETE | /api/v1/families/<family>/documents/<docid> | Oui | Suppression d'un document de la famille |
GET | /api/v1/families/<family>/enumerates/ | Oui | Récupération de la liste des énumérés |
PUT | /api/v1/families/<family>/enumerates/ | N/A | N/A |
POST | /api/v1/families/<family>/enumerates/ | N/A | N/A |
DELETE | /api/v1/families/<family>/enumerates/ | N/A | N/A |
GET | /api/v1/families/<family>/enumerates/<docid> | Oui | Récupération de la liste des valeurs |
PUT | /api/v1/families/<family>/enumerates/<docid> | Future version | Modification d'une valeur de la liste des énumérés |
POST | /api/v1/families/<family>/enumerates/<docid> | Future version | Ajout d'une valeur à la liste d'énumérés |
DELETE | /api/v1/families/<family>/enumerates/<docid> | Future version | Suppression d'un énuméré |
GET | /api/v1/temporaryFiles/ | N/A | N/A |
PUT | /api/v1/temporaryFiles/ | N/A | N/A |
POST | /api/v1/temporaryFiles/ | Oui | Création d'un fichier temporaire |
DELETE | /api/v1/temporaryFiles/ | Future version | Suppression d'un fichier temporaire |
GET | /api/v1/trash/ | Oui | Liste des documents de la poubelle |
PUT | /api/v1/trash/ | N/A | N/A |
POST | /api/v1/trash/ | N/A | N/A |
DELETE | /api/v1/trash/ | Future version | Supprime définitivement les documents de la poubelle |
GET | /api/v1/trash/<docid> | Oui | Récupération d'un document mis à la poubelle |
PUT | /api/v1/trash/<docid> | N/A | N/A |
POST | /api/v1/trash/<docid> | N/A | N/A |
DELETE | /api/v1/trash/<docid> | Future version | Suppression définitive d'un document mis à la poubelle |
GET | /api/v1/folders/ | Oui | Liste de documents de type dossier |
PUT | /api/v1/folders/ | N/A | N/A |
POST | /api/v1/folders/ | N/A | N/A |
DELETE | /api/v1/folders/ | N/A | N/A |
GET | /api/v1/folders/<folderId> | Future version | Description du dossier |
PUT | /api/v1/folders/<folderId> | N/A | N/A |
POST | /api/v1/folders/<folderId> | N/A | N/A |
DELETE | /api/v1/folders/<folderId> | N/A | N/A |
GET | /api/v1/folders/<folderId>/documents/ | Oui | Contenu du dossier folderId |
PUT | /api/v1/folders/<folderId>/documents/ | N/A | N/A |
POST | /api/v1/folders/<folderId>/documents/ | Future version | Ajout d'un document au dossier |
DELETE | /api/v1/folders/<folderId>/documents/ | Future version | Suppression d'un document du dossier |
GET | /api/v1/searches/ | Oui | Liste de documents de type recherche |
PUT | /api/v1/searches/ | N/A | N/A |
POST | /api/v1/searches/ | N/A | N/A |
DELETE | /api/v1/searches/ | N/A | N/A |
GET | /api/v1/searches/<searchId> | Future version | Description de la recherche |
PUT | /api/v1/searches/<searchId> | N/A | N/A |
POST | /api/v1/searches/<searchId> | N/A | N/A |
DELETE | /api/v1/searches/<searchId> | N/A | N/A |
GET | /api/v1/searches/<searchId>/documents/ | Oui | Contenu d'une recherche |
PUT | /api/v1/searches/<searchId>/documents/ | N/A | N/A |
POST | /api/v1/searches/<searchId>/documents/ | N/A | N/A |
DELETE | /api/v1/searches/<searchId>/documents/ | N/A | N/A |
GET | /api/v1/documents/<docid>/usertags/ | Oui | Liste des tags utilisateurs d'un document |
PUT | /api/v1/documents/<docid>/usertags/ | N/A | N/A |
POST | /api/v1/documents/<docid>/usertags/ | N/A | N/A |
DELETE | /api/v1/documents/<docid>/usertags/ | N/A | N/A |
GET | /api/v1/documents/<docid>/usertags/<tagIdentifier> | Oui | Tag utilisateur <tagIdentifier> |
PUT | /api/v1/documents/<docid>/usertags/<tagIdentifier> | Oui | Modification d'un tag utilisateur <tagIdentifier> |
POST | /api/v1/documents/<docid>/usertags/<tagIdentifier> | Oui | Création d'un tag utilisateur <tagIdentifier> |
DELETE | /api/v1/documents/<docid>/usertags/<tagIdentifier> | Oui | Suppression d'un tag utilisateur <tagIdentifier> |
GET | /api/v1/documents/<docid>/workflows/states/ | Oui | Liste des états possibles d'un document |
PUT | /api/v1/documents/<docid>/workflows/states/ | N/A | N/A |
POST | /api/v1/documents/<docid>/workflows/states/ | N/A | N/A |
DELETE | /api/v1/documents/<docid>/workflows/states/ | N/A | N/A |
GET | /api/v1/documents/<docid>/workflows/states/<state> | Oui | Caractéristiques de l'état |
PUT | /api/v1/documents/<docid>/workflows/states/<state> | N/A | N/A |
POST | /api/v1/documents/<docid>/workflows/states/<state> | Oui | Changement d'état d'un document <state> |
DELETE | /api/v1/documents/<docid>/workflows/states/<state> | N/A | N/A |
GET | /api/v1/documents/<docid>/workflows/transitions/ | Oui | Liste des transitions possibles d'un document |
PUT | /api/v1/documents/<docid>/workflows/transitions/ | N/A | N/A |
POST | /api/v1/documents/<docid>/workflows/transitions/ | N/A | N/A |
DELETE | /api/v1/documents/<docid>/workflows/transitions/ | N/A | N/A |
GET | /api/v1/documents/<docid>/workflows/transitions/<transitions> | Oui | Caractéristiques de la transition |
PUT | /api/v1/documents/<docid>/workflows/transitions/<transitions> | N/A | N/A |
POST | /api/v1/documents/<docid>/workflows/transitions/<transitions> | Oui | Passage d'une transition |
DELETE | /api/v1/documents/<docid>/workflows/transitions/<transitions> | N/A | N/A |
Légende :
Les entrées documents de famillies et de trash possède aussi les sous-collections :
Les entrées en Future version sont prévues pour une implémentation future mais non présentes dans la version courante de l'API.
Cette collection décrit les documents de Dynacase.
L'url d'accès est : api/v1/documents
La collection documents implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/ |
Retourne la liste des documents |
POST |
api/v1/documents/ |
N/A |
PUT |
api/v1/documents/ |
N/A |
DELETE |
api/v1/documents/ |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<id> |
Retourne le document id |
POST |
api/v1/documents/<id> |
N/A |
PUT |
api/v1/documents/<id> |
Modifie le document id |
DELETE |
api/v1/documents/<id> |
Supprime le document id |
GET /api/v1/documents/
Récupération de la liste des documents présents sur la plateforme.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination et orderBy),uri
: URI d'accès de la collection,documents
: un tableau de document (sous la même forme que les documents unitaires)Chaque document est un objet contenant les entrées suivantes :
properties
: liste des propriétés du document,attributes
: liste des attributs du document (facultatif),uri
: URI d'accès du document.Exemple :
{ "success": true, "messages": [], "data": { "requestParameters": { "slice": 10, "offset": 0, "length": 10, "orderBy": "title asc, id desc" }, "uri": "/api/v1/documents/", "documents": [ { "properties": { "id": 1003, "title": "accord", "icon": "api/v1/images/assets/sizes/24x24c/wask.png", "initid": 1003, "name": "WASK", "revision": 0 }, "uri": "/api/v1/documents/1003.json" }, [...] ] } }
Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Sens de l'orderBy inconnu | 400 | CRUD0501 |
Attribut ou propriété d'orderBy invalide | 400 | CRUD0502 |
La liste des documents est paginée et ordonnée.
Les mots clefs GET sont les suivants :
<attribut|propriété>:<asc:desc>
title:asc
,all
,COLLECTION_DEFAULT_SLICE
de l'application HTTPAPI_V1
(10), Les paramètres appliqués sont résumés
dans le retour de la collection
requestParameter
.
Exemple :
/documents/?orderBy=title:asc,id:desc&slice=100&offset=20
Les documents peuvent être retournés avec plus ou moins d'information.
Par défaut : fields=document.properties
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère l'ensemble des propriétés par défaut | "id", "title", "icon", "initid", "name" |
document.properties.all |
Récupère toutes les propriétés | |
document.properties.<prop> |
Récupère la propriété indiquée | |
document.attributes.my_attribute |
Ajoute l'attribut my_attribute | si l'attribut n'existe pas dans un des documents il est retourné vide |
requestParameters.slice |
Nombre maximum de document demandé | |
requestParameters.offset |
Nombre de premiers document à ignorer | |
requestParameters.orderBy |
Tri demandé | |
requestParameters.length |
Nombre de document effectivement retourné |
La liste des propriétés est documentée dans la documentation de format collection.
La collection n'a pas de cache.
GET /api/v1/documents/<documentId>
Récupération de la dernière révision du document ayant l'identifiant <documentId>
.
L'extension ".json" peut être ajoutée pour expliciter le format de sortie.
Exemple :
GET /api/v1/documents/1234.json
L'identifiant ajouté peut-être soit :
initid
, id de révision
, lastid
du document,name
: nom logique du document.Dans tous les cas le document retourné est le dernier de sa lignée documentaire.
Si vous souhaitez accéder à une révision précise du document, il faut utiliser
la collection /api/v1/documents/<documentId>/revisions/
.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient 3 champs :
document.uri
: uri d'accès à la ressource modifiéedocument.properties
: liste des valeurs des propriétésdocument.attributes
: liste des valeurs des attributsExemple :
{"success" : true, "messages" : [], "data" : { "document" : { "uri" : "api/v1/documents\/1057.json", "properties" : { "title" : "La culture des perles", "state" : null, "name" : null, "icon" : "api/v1/images/assets/sizes/24x24c/doc.png", "fromname" : "MY_ARTICLE", [...] }, "attributes" : { "my_title" : {"value" : "La culture des perles", "displayValue" : "La culture des perles"}, "my_description" : {"value" : "Sur les bords de la rivière...", "displayValue" : "Sur les bords de la rivière..."}, "my_annexes" : [], [...] } } } }
Les valeurs retournées correspondent aux valeur de la vue de consultation par défaut.
Les attributs en visibilité "I" dans la vue de consultation par défaut ne sont pas retournés. Leur existence n'est pas dévoilée ni dans les données ni dans la structure.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Document non trouvé | 404 | CRUD0200 |
Privilège insuffisant pour accéder au document | 403 | CRUD0201 |
Document supprimé | 404 | CRUD0219 |
Propriété demandée inexistante | 400 | CRUD0202 |
Attribut demandé inexistant | 400 | CRUD0218 |
Exemple :
Cas d'erreur de document non trouvé
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1200\" not found", "contentHtml" : "", "code" : "API0200", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1200\" not found" }
Le document peut être retourné avec plus ou moins d'information.
Par défaut : fields=document.properties,document.attributes
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère l'ensemble des propriétés "visibles" | "state", "fromname", "id", "postitid", "initid", "locked", "revision", "wid", "cvid", "profid", "fromid", "owner", "domainid" |
document.properties.<prop> |
Récupère la propriété indiquée | |
document.attributes |
Récupère les valeurs et les valeurs affichable des attributs | |
document.attributes.<id> |
Récupère la valeur d'un attribut particulier | |
document.family.structure |
Récupère la structure de la famille |
La liste des propriétés est documentée dans la documentation de format collection.
Dans le cadre du cache, le Etag
est calculé à l'aide des éléments
suivants :
L'ensemble de ces éléments sont concaténés et ensuite le sha1 de cette
concaténation consitue le Etag
.
Vous pouvez aussi accéder à cette ressource via :
GET /api/v1/families/<famName>/documents/<documentId>
Récupération de la dernière révision du document de la famille <famName>
ayant
l'identifiant <documentId>
.
La différence entre les collection
families
et documents
est que pour la collection
families/<famName>/documents/
l'identifiant doit être dans la famille indiquée
pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.
Un document "supprimé" peut être récupéré via l'url trash.
Les documents accédés via les
collections families/<famName>/documents/
et trash
possèdent aussi les sous-
collections :
history
,revisions
.PUT /api/v1/documents/<id>
Modification de la dernière révision document ayant l'identifiant <documentId>
.
L'extension ".json" peut être ajoutée pour expliciter le format de sortie.
Exemple :
PUT /api/v1/documents/1234.json
Attention : L'identifiant du document peut être son nom logique, son identifiant numérique. L'identifiant numérique peut référencer n'importe quelle révision du document. Dans tous les cas, la modification porte sur la dernière révision du document.
Le contenu de la requête doit contenir une donnée JSON avec la liste des attributs modifiés.
{ "document": { "attributes": { "attrid": { "value": "<value>" } } } }
Le type de la requête est application/json
.
Exemple :
{ "document": { "attributes": { "my_title": { "value": "Hello world" } } } }
Note : Toute donnée additionnelle sera ignorée.
Le contenu de la requête contient la liste des valeurs d'attributs à enregistrer. Chaque variable (PUT) est le nom de l'attribut (casse insensible).
Le type de la requête est application/x-www-form-urlencoded
.
Note : Ce format peut être utilisé directement depuis un formulaire HTML.
Cette forme permet aussi d'enregistrer des fichiers dans le document.
Le retour est une donnée JSON.
La partie data
contient 3 champs :
document.uri
: uri d'accès à la ressource modifiéedocument.properties
: liste des valeurs des propriétésdocument.attributes
: liste des valeurs des attributschanges
: liste des valeurs modifiéesExemple :
{"success" : true, "messages" : [], "data" : { "document" : { "uri" : "api\/v1\/documents\/1057.json", "properties" : { "title" : "Hello World", [...] }, "attributes" : { "my_title" : {"value" : "Hello World", "displayValue" : "Hello World"}, [...] } } }, "exceptionMessage" : "" }
La liste des propriétés est documentée dans la documentation de format collection.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour modifier le document | 403 | API0201 |
Tentative de modification échouée | 500 | API0212 |
Impossible de modifier l'attribut | 500 | API0211 |
Le document est une famille | 403 | API0109 |
NB : On ne peut pas modifier les documents de familles.
Exemple :
Cas d'erreur de privilège
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Update forbidden", "contentHtml" : "", "code" : "API0201", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1057\" access deny : Pas de privil\u00e8ge edit pour le document Hello world [1057]" }
Vous pouvez aussi accéder à cette ressources via :
PUT /api/v1/families/<famName>/documents/<documentId>
Modification de la dernière révision du document de la famille <famName>
ayant
l'identifiant <documentId>
.
La différence entre les collection
families
et documents
est que pour la collection
families/<famName>/documents/
l'identifiant doit être dans la famille indiquée
pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.
DELETE /api/v1/documents/<id>
Suppression de la lignée documentaire dont un des membres a l'identifiant <documentId>
.
L'extension ".json" peut être ajoutée pour expliciter le format de sortie.
Exemple :
DELETE /api/v1/documents/1234.json
La suppression donne l'ordre de mettre le document dans la poubelle. Dans ce cas, toute la lignée documentaire du document est mise à la poubelle.
L'identifiant du document peut être son nom logique, son identifiant numérique, ou celui de n'importe laquelle de ses révisions.
La suppression "physique" (réelle suppression de la ligne en base de données) n'est pas possible.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient 3 champs :
document.uri
: uri d'accès à la ressource supprimée;document.properties
: liste des valeurs des propriétés du document supprimé;document.attributes
: liste des valeurs des attributs du document supprimé.Les attributs en visibilité "I" ne sont pas retournés. Leur existence n'est pas dévoilée ni dans les données ni dans la structure.
Un document mis à la poubelle n'est plus accessible via la ressource documents
mais reste accessible par la ressource trash
.
Exemple :
{"success" : true, "messages" : [], "data" : { "document" : { "uri" : "api\/v1\/trash\/1057.json", "properties" : { "title" : "La vie des escargots", [...] }, "attributes" : { "my_title" : {"value" : "La vie des escargots", "displayValue" : "La vie des escargots"}, [...] } } }, "exceptionMessage" : "" }
La liste des propriétés est documentée dans la documentation de format collection.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour supprimer le document | 403 | API0216 |
Erreur lors de la suppression | 400 | API0215 |
Document déjà supprimé | 404 | API0219 |
Exemple :
Cas d'erreur de privilège
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1057\" deleted", "contentHtml" : "", "code" : "API0219", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1057\" deleted" }
Vous pouvez aussi accéder à cette ressources via :
DELETE /api/v1/families/<famName>/documents/<documentId>
Suppression de la lignée documentaire de la famille <famName>
dont un des
membres a l'identifiant <documentId>
.
La différence entre les collection
families
et documents
est que pour la collection
families/<famName>/documents/
l'identifiant doit être dans la famille indiquée
pour être retourné sinon une erreur 404 (ressource non trouvée) est retournée.
Cette sous-collection décrit les révisions des documents.
L'url d'accès est : api/v1/documents/<documentId>/revisions/
La sous-collection revisions
implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<documentId>/revisions/ |
Liste des urls de révisions |
POST |
api/v1/documents/<documentId>/revisions/ |
N/A |
PUT |
api/v1/documents/<documentId>/revisions/ |
N/A |
DELETE |
api/v1/documents/<documentId>/revisions/ |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<documentId>/revisions/<revisionNumber> |
Récupère une révision |
POST |
api/v1/documents/<documentId>/revisions/<revisionNumber> |
N/A |
PUT |
api/v1/documents/<documentId>/revisions/<revisionNumber> |
N/A |
DELETE |
api/v1/documents/<documentId>/revisions/<revisionNumber> |
N/A |
GET /api/v1/documents/<documentId>/revisions/
Récupération de la liste des révisions du document <documentId>
.
L'identifiant du document peut être son nom logique, son identifiant numérique.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination et orderBy),uri
: URI d'accès de la collection,revisions
: un tableau de révision (sous la même forme que les documents unitaires)Chaque révision est un objet contenant les entrées suivantes :
properties
: liste des propriétés de la révision,attributes
: liste des attributs du document révisé (facultatif),uri
: URI d'accès du document.Exemple :
{ "success": true, "messages": [], "data": { "requestParameters": { "slice": 10, "offset": 0, "length": 2, "orderBy": "revision desc, id desc" }, "uri": "http://www.example.net/api/v1/documents/1427/revisions/", "revisions": [ { "properties": { "id": 13511, "title": "Éléonore d'aquitaine", "icon": "api/v1/images/assets/sizes/24x24c/article.png", "initid": 1427, "name": null, "status": "alive", "revision": 1 }, "attributes": { "an_nom": { "value": "Éléonore d'aquitaine", "displayValue": "Éléonore d'aquitaine" },... }, "uri": "http://www.example.net/api/v1/documents/1427/revisions/1.json" }, { "properties": { "id": 1427, "title": "Éléonore", "icon": "api/v1/images/assets/sizes/24x24c/article.png", "initid": 1427, "name": null, "status": "fixed", "revision": 0 }, "attributes": { "an_nom": { "value": "Éléonore", "displayValue": "Éléonore" },... }, "uri": "http://www.example.net/api/v1/documents/1427/revisions/0.json" } ] } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Document non trouvé | 404 | API0200 |
Exemple :
Cas d'erreur de document non trouvé
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1200\" not found", "contentHtml" : "", "code" : "API0200", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1200\" not found" }
Dans le cadre du cache, le Etag
est calculé à l'aide des éléments suivants :
L'ensemble de ces éléments sont concaténés et ensuite le sha1 de cette
concaténation consitue le Etag
.
Vous pouvez aussi accéder à cette ressources via :
GET /api/v1/families/<famName>/documents/<documentId>/revisions/
Récupération de la liste des révisions de la dernière révision d'un document de
la famille <famName>
ayant l'identifiant <documentId>
.
La différence entre les collection
families
et documents
est que pour la collection
/api/v1/families/<famName>/documents/<documentId>/revisions/
l'identifiant doit être dans la famille indiquée pour être retourné sinon une
erreur 404 (ressource non trouvée) est retournée.
Les révisions d'un document "supprimé" pevent être récupérés via l'url
GET /api/v1/trash/<documentId>/revisions/
GET /api/v1/documents/<documentId>/revisions/<revisionNumber>
Récupération de la révision <revisionNumber>
de la dernière révision d'un
document ayant l'id <documentId>
.
L'extension ".json" peut être ajoutée pour expliciter le format de sortie.
Exemple :
GET /api/v1/documents/1234/revisions/0.json
L'identifiant du document peut être son nom logique, son identifiant numérique.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient 3 champs :
revision.uri
: uri d'accès à la ressource modifiéerevision.properties
: liste des valeurs des propriétésrevision.attributes
: liste des valeurs des attributsLes attributs en visibilité "I" ne sont pas retournés.
Exemple :
{ "success": true, "messages": [], "data": { "revision": { "properties": { "id": 28203, "title": "Le monde sous-marin", "icon": "api/v1/images/assets/sizes/24x24c/article.gif", "initid": 7120, "name": null, "revision": 17, "state": { "reference": "my_transmited", "color": "#A8E5FF", "activity": null, "stateLabel": "Transmis", "displayValue": "Transmis" } }, "attributes": { "de_reference": { "value": "1", "displayValue": "1" }, "de_version": { "value": "Deuxième", "displayValue": "Deuxième" },... }, "uri": "http://www.example.net/api/v1/documents/7120.json" } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Révision ou document non trouvé | 404 | API0220 |
Privilège insuffisant pour accéder au document | 403 | API0201 |
Document supprimé | 404 | API0219 |
Propriété demandée inexistante | 400 | API0202 |
Attribut demandé inexistant | 400 | API0218 |
Exemple :
Cas d'erreur de document non trouvé
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1200\" not found", "contentHtml" : "", "code" : "API0200", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1200\" not found" }
Le document peut être retourné avec plus ou moins d'information.
Par défaut : fields=document.properties,document.attributes
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère l'ensemble des propriétés "visibles" | "state", "id", "initid", "revision", "icon", "name" |
document.properties.<prop> |
Récupère la propriété indiquée | |
document.attributes |
Récupère les valeurs et les valeurs affichable des attributs | |
document.attributes.<id> |
Récupère la valeur d'un attribut particulier | |
document.family.structure |
Récupère la structure de la famille |
La liste des propriétés est documentée dans la documentation de format collection.
Dans le cadre du cache, le Etag
est calculé à l'aide des éléments suivants :
L'ensemble de ces éléments sont concaténés et ensuite le sha1 de cette concaténation consitue le Etag
.
Vous pouvez aussi accéder à cette ressources via :
GET /api/v1/families/<famName>/documents/<documentId>/revisions/<revisionNumber>
Récupération de la révision <revisionNumber>
de la dernière révision d'un document de la famille <famName>
ayant
l'identifiant <documentId>
.
La différence entre les collection families
et documents
est que pour
la collection /api/v1/families/<famName>/documents/<documentId>/revisions/<revisionNumber>
l'identifiant doit être dans la famille indiquée pour être retourné sinon une
erreur 404 (ressource non trouvée) est retournée.
La révision d'un document "supprimé" pevent être récupérés via l'url
GET /api/v1/trash/<documentId>/revisions/<revisionNumber>
Cette sous-collection décrit les messages de l'historique des documents
L'url d'accès est : api/v1/documents/<documentId>/history/
La sous-collection history
implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<documentId>/history/ |
Liste des messages historique |
POST |
api/v1/documents/<documentId>/history/ |
N/A |
PUT |
api/v1/documents/<documentId>/history/ |
N/A |
DELETE |
api/v1/documents/<documentId>/history/ |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/families/<famName>/documents/<documentId>/history/ |
Liste des messages historique |
POST |
api/v1/families/<famName>/documents/<documentId>/history/ |
N/A |
PUT |
api/v1/families/<famName>/documents/<documentId>/history/ |
N/A |
DELETE |
api/v1/families/<famName>/documents/<documentId>/history/ |
N/A |
GET /api/v1/documents/<documentId>/history/
Récupération de l'historique du document ayant
l'identifiant <documentId>
.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient les éléments suivants :
Clef | Description | Exemple |
---|---|---|
history | Liste des caractéristiques des révisions | [{documentId:13514, uri:api/v1/documents/7120/revisions/3, title:Document de test, fixed:false,…}] |
requestParameters: | Filtre utilisé | {slice:-1, offset:0, revision:3} |
Chaque élément de l'historique history
contient la structure suivante :
properties
qui contient :Clef | Description | Exemple |
---|---|---|
id | Identifiant numérique du document | 13514 |
revision: | Numéro de la révision | 3 |
revisionDate: | Date de la révision | "2014-10-16 13:58:56" |
state.reference : | État de la révision | "zoo_realised" |
state.color: | Couleur de l'état | "#8870FF" |
state.stateLabel: | Libelle de l'état | "Réalisé" |
state.activity: | Libelle de l'activité | "Contrôle des vis-à-vis" |
status: | Indique si le status de la révision "fixed" , "alive", "deleted" | "fixed" |
title: | Titre de la révision | "Alberta" |
uri: | Uri d'accès à la révision | "api/v1/documents/7120/revisions/3" |
version: | Version de la révision | null |
messages
qui contient une liste de messages :Chaque message contient la structure suivante :
Clef | Description | Exemple |
---|---|---|
code | Code du message | "MODIFY" |
comment: | Message textuel | "modification Pays, Propriétaire actuel" |
date: | Date d'enregistrement du message | "2014-10-16 13:58:56" |
level: | Niveau du message | 4 |
uid: | Identifiant de l'utilisateur ayant enregistré le message | "2014-10-16 13:58:56" |
uname: | Nom de l'utilisateur ayant enregistré le message | "Jean Martin" |
Les niveaux (level
) correspondent aux criticités suivantes :
Criticité | Description |
---|---|
"notice" | Message d'information mineur |
"info" | Message d'information (par défaut) |
"message" | Message important |
"warning" | Avertissement |
"error" | Erreur |
Exemple :
GET api/v1/document/7120/history/
{ "success": true, "messages": [], "data": { "uri": "http://www.example.net/api/v1/documents/7120/history/", "requestParameters": { "slice": -1, "offset": 0, "revision": -1 }, "history": [ { "uri": "http://www.example.net/api/v1/documents/7120/revisions/2.json", "properties": { "id": 7120, "title": "Test d'un alligator", "status": "alive", "revision": 2, "owner": { "id": "1", "title": "O'reilly Master" }, "state": { "reference": "zoo_transmited", "stateLabel": "Transmis", "activity": "Vérification d'aptitude", "color": "#A8E5FF" }, "version": "Deuxième", "revisionDate": "2014-12-01 17:00:37" }, "messages": [ { "uid": 1, "uname": "O'reilly Master", "date": "2014-12-01 17:00:37", "level": "info", "code": null, "comment": "no mail template" } ] }, { "uri": "http://www.example.net/api/v1/documents/7120/revisions/1.json", "properties": { "id": 7120, "title": "Test primaire", "status": "fixed", "revision": 1, "owner": { "id": "1", "title": "O'reilly Master" }, "state": { "reference": "zoo_accepted", "stateLabel": "Accepté", "activity": "Préparation de l'accueil", "color": "#66FF7A" }, "version": null, "revisionDate": "2014-10-16 13:57:16" }, "messages": [ { "uid": 1, "uname": "O'reilly Master", "date": "2014-10-16 13:57:16", "level": "message", "code": "REVISION", "comment": "changement d'état de Transmis vers Accepté" }, { "uid": 1, "uname": "O'reilly Master", "date": "2014-10-16 13:57:04", "level": "info", "code": null, "comment": "no mail template" } ] }, { "uri": "http://www.example.net/api/v1/documents/7120/revisions/0.json", "properties": { "id": 7120, "title": "Test primaire", "status": "fixed", "revision": 0, "owner": { "id": "1", "title": "O'reilly Master" }, "state": { "reference": "zoo_transmited", "stateLabel": "Transmis", "activity": "Vérification de l'adoption", "color": "#A8E5FF" }, "version": null, "revisionDate": "2014-10-16 13:57:04" }, "messages": [ { "uid": 1, "uname": "O'reilly Master", "date": "2014-10-16 13:57:04", "level": "message", "code": "REVISION", "comment": "changement d'état de Initialisé vers Transmis" },... ] } ] } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Famille non trouvée | 404 | API0220 |
Document non trouvé | 404 | API0200 |
Exemple :
Cas d'erreur en cas de document non trouvé
{ "success": false, "messages": [ { "type": "error", "contentText": "Document \"3802\" not found", "contentHtml": "", "code": "API0200", "uri": "", "data": null }, { "type": "message", "contentText": "You can consult http://dynacase.dev:8081/index.php?app=HTTPAPI_V1 to have info on the API", "contentHtml": "You can consult <a href=\"http://dynacase.dev:8081/index.php?app=HTTPAPI_V1\">the REST page</a> to have info on the API", "code": "", "uri": "", "data": null } ], "data": null, "exceptionMessage": "Document \"3802\" not found" }
Cette option indique le nombre de révision maximum à retourner.
Les révisions sont ordonnées par numéro décroissant, de la plus récente à la plus ancienne.
Exemple : les 10 dernières révisions
GET api/v1/document/1234/history/?slice=10
Index à partir duquel, les révisions sont retournées.
Exemple: Les révisions de 7 à 10.
GET api/v1/document/1234/history/?slice=2&offset=7
Cette option permet de ne retourner l'historique que d'une révision précise.
Exemple : Retourner la révision 3
GET api/v1/document/1234/history/?revision=3
La première révision porte le n°0.
Vous pouvez aussi accéder à cette ressources via :
GET /api/v1/families/<famName>/documents/<documentId>/history/
Récupération de l'historique de la dernière révision du document de la famille
<famName>
ayant l'identifiant <documentId>
.
La différence entre les collection
families
et documents
est que pour la collection
/api/v1/families/<famName>/documents/<documentId>/history/
l'identifiant doit
être dans la famille indiquée pour être retourné sinon une erreur 404 (ressource
non trouvée) est retournée.
L'historique d'un document "supprimé" peut être récupéré via l'url
GET /api/v1/trash/<documentId>/history/
Cette collection décrit les états et transitions du cycle de vie associé à un document.
L'url d'accès est : api/v1/documents/<docid>/workflows/
La collection documents implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<docid>/workflows/states/ |
Retourne la liste des états pour le document docid
|
POST |
N/A | |
PUT |
N/A | |
DELETE |
N/A | |
GET |
api/v1/documents/<docid>/workflows/transitions/ |
Retourne la liste des transitions pour le document docid
|
POST |
N/A | |
PUT |
N/A | |
DELETE |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<id>/workflows/states/<stateId> |
Retourne les caractéristiques de l'état stateId |
POST |
Change l'état du document docid |
|
PUT |
N/A | |
DELETE |
N/A | |
GET |
api/v1/documents/<id>/workflows/transitions/<transitionId> |
Retourne les caractéristiques de la transition transitionId |
POST |
Change la transition du document docid |
|
PUT |
N/A | |
DELETE |
N/A |
GET /api/v1/documents/<documentId>/workflows/states/<stateId>
Récupération de l'état stateId
du document documentId
.
Exemple :
GET /api/v1/documents/my_document/workflows/states/my_published
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
uri
: URI préférentielle d'accès à la ressource;state
: Caractéristique de l'étape
id
: identifiant de l'état,isCurrentState
: indique si cet état est l'étape courante,label
: intitulé de l'état (localisé en fonction de la langue de l'utilisateur) activity
: intitulé de l'activité (localisé en fonction de la langue de l'utilisateur) displayValue
: intitulé calculé en fonction des valeurs de "activity" et "label"color
: code couleur (#RRGGBB) associé à l'étattransition
: transition qui emmène à cet étape ("null" si pas de transition possible)
uri
: uri de la transitionlabel
: libellé de la transitionExemple :
{ "success": true, "messages": [], "data": { "uri": "./api/v1/documents/61120/workflows/states/my_transmited", "state": { "id": "my_transmited", "isCurrentState": false, "label": "Transmis", "activity": "Vérification de l'adoption", "displayValue": "Vérification de l'adoption", "color": "#A8E5FF", "transition": { "uri": "./api/v1/documents/61120/workflows/transitions/my_Ttransmited", "label": "Transmettre le dossier" } } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
État inconnu | 404 State not found | CRUD0228 |
Pas de cycle de vie associé | 404 No workflow detected | CRUD0227 |
Exemple :
{ "success": false, "messages": [ { "type": "error", "contentText": "State \"foo\" is not available for workflow \"My workflow\" (1090)", "code": "CRUD0228" } ], "data": null, "exceptionMessage": "State \"foo\" is not available for workflow \"My workflow\" (1090)" }
POST /api/v1/documents/<documentId>/workflows/states/<stateid>
Le document documentId
passe dans le nouvel état donné stateId
. La
transition liée à ce changement d'état est exécutée.
Note : Seul l'utilisateur "admin", peut changer l'état d'un document lorsqu'aucune transition n'est valide.
Exemple :
POST /api/v1/documents/<documentId>/workflows/states/<stateid>
Le contenu est une structure JSON qui comprend les informations suivantes :
comment
: Texte à insérer dans l'historiqueparameters
: Liste des valeurs des paramètres indexés par leur identifiantExemple :
{ "comment" : "Mon commentaire de transition" "parameters": { "my_referencedate": "2015-06-23", "my_validation": "yes" } }
Le retour est une donnée JSON.
La partie data
contient :
uri
: URI préférentielle d'accès à la ressource;state
: Nouvel état du document
id
: identifiant de l'état,isCurrentState
: indique si cet état est l'étape courante,label
: intitulé de l'état (localisé en fonction de la langue de l'utilisateur) activity
: intitulé de l'activité (localisé en fonction de la langue de l'utilisateur) displayValue
: intitulé calculé en fonction des valeurs de "activity" et "label"color
: code couleur (#RRGGBB) associé à l'étatExemple :
{ "success": true, "messages": [ { "type": "warning", "contentText": "Avertissement : Pas de modèle de courriel", "code": "WORKFLOW_TRANSITION" }, { "type": "notice", "contentText": "12:00 - Bulle changement d'état vers Transmis" } ], "data": { "state": { "id": "my_transmited", "isCurrentState": true, "label": "Transmis", "activity": "Vérification de l'adoption", "displayValue": "Vérification de l'adoption", "color": "#A8E5FF" } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Échec de la transition (droit, m0, m1) | 403 Forbidden | CRUD0230 |
Pas de cycle de vie associé | 404 No workflow detected | CRUD0227 |
Exemple :
{ "success": false, "messages": [ { "type": "error", "contentText": "Erreur : Pas d'adresse pour le contrôleur", "code": "CRUD0230" } ], "data": null, "exceptionMessage": "Cannot use transition \"Erreur : Pas d'adresse pour le contrôleur\" " }
GET /api/v1/documents/<documentId>/workflows/states/
Récupération des étapes suivantes possibles du document documentId
.
Les étapes possibles sont les étapes qui ont une transition pour rejoindre l'étape suivante et dont l'utilisateur a les privilège pour passer la transition.
Si la méthode m0 d'une transition, retourne un message, l'étape suivante sera retournée en indiquant l'erreur.
Le paramètre optionnel allStates=1
permet de retourner toutes les étapes même
celles qui n'ont pas de transition.
Exemple :
GET /api/v1/documents/my_document/workflows/states/
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
uri
: URI préférentielle d'accès à la ressource;states
: Liste des états
id
: identifiant de l'état,label
: intitulé de l'état (localisé en fonction de la langue de l'utilisateur)activity
: intitulé de l'activité (localisé en fonction de la langue de l'utilisateur)displayValue
: intitulé calculé en fonction des valeurs de "activity" et "label"color
: code couleur (#RRGGBB) associé à l'étaturi
: URI d'accès à l'étattransition
: transition qui emmène à cet étape ("null" si pas de transition possible)
id
: identifiant de la transition 1.0.1
uri
: uri de la transitionlabel
: libellé de la transitionerror
: message de la méthode m0
authorized
: indique si l'utilisateur possède le droit d'effectuer la transition 1.0.1
Exemple :
{ "success": true, "messages": [], "data": { "uri": "./api/v1/documents/61120/workflows/states/", "states": [ { "id": "my_transmited", "label": "Transmis", "activity": "Vérification de l'adoption", "displayValue": "Vérification de l'adoption", "color": "#A8E5FF", "uri": "./api/v1/documents/61120/workflows/states/my_transmited", "transition": { "id" : "my_Ttransmited", "uri": "./api/v1/documents/61120/workflows/transitions/my_Ttransmited", "label": "Transmettre le dossier", "error": "", "authorized" : true } } ] } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Pas de cycle de vie associé | 404 No workflow detected | CRUD0227 |
Exemple :
{ "success": false, "messages": [ { "type": "error", "contentText": "No associated workflow for document \"9567\"", "code": "CRUD0227" } ], "data": null, "exceptionMessage": "No associated workflow for document \"9567\"" }
GET /api/v1/documents/<documentId>/workflows/transitions/<transitionId>
Récupération de la transition transitionId
du document documentId
.
Exemple :
GET /api/v1/documents/my_document/workflows/transitions/my_publication
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
uri
: URI préférentielle d'accès à la ressource;transition
: Caractéristique de la transition
id
: identifiant de la transitionbeginState
: étape de départ de la transition
id
: identifiant de l'état de départisCurrentState
: indique si c'est l'état courant du documentlabel
: libellé de l'état (localisé en fonction de la langue de l'utilisateur)activity
: libellé de l'activité (localisé en fonction de la langue de l'utilisateur)displayValue
: intitulé calculé en fonction des valeurs de "activity" et "label"color
: code couleur (#RRGGBB) associé à l'étatendState
: étape d'arrivée de la transition
id
: identifiant de l'état d'arrivéeisCurrentState
: indique si c'est l'état courant du documentlabel
: libellé de l'état (localisé en fonction de la langue de l'utilisateur)activity
: libellé de l'activité (localisé en fonction de la langue de l'utilisateur)displayValue
: intitulé calculé en fonction des valeurs de "activity" et "label"color
: code couleur (#RRGGBB) associé à l'étatlabel
: libellé de la transition (localisé en fonction de la langue de l'utilisateur)askComment
: (bool) indique si un commentaire peut être associé à la transitionaskAttributes
: liste des paramètres de transition
id
: identifiant du paramètre (provenant de la famille du cycle de vie)visibility
: visibilité du paramètrelabel
: libellé du paramètretype
: type du paramètrelogicalOrder
: ordre (non affecté)multiple
: indique si le type est multivaluéoptions
: options de l'attributneeded
: indique si la valeur est obligatoireExemple :
{ "success": true, "messages": [], "data": { "uri": "./api/v1/documents/61120/workflows/transitions/my_Ttransmited", "transition": { "id": "my_Ttransmited", "beginState": { "id": "my_initialised", "isCurrentState": true, "label": "Initialisé", "activity": "Rédaction de la demande", "displayValue": "Rédaction de la demande", "color": "#FFE991" }, "endState": { "id": "my_transmited", "isCurrentState": false, "label": "Transmis", "activity": "Vérification de l'adoption", "displayValue": "Vérification de l'adoption", "color": "#A8E5FF" }, "label": "Transmettre le dossier", "askComment": false, "askAttributes": [ { "id": "wan_date", "visibility": "W", "label": "date de début", "type": "date", "logicalOrder": 0, "multiple": false, "options": [], "needed": false }, { "id": "wad_mailsecure", "visibility": "W", "label": "Espèce protégée", "type": "docid", "logicalOrder": 0, "multiple": false, "options": [], "needed": false }, { "id": "wad_file", "visibility": "W", "label": "Fichier", "type": "file", "logicalOrder": 0, "multiple": false, "options": [], "needed": false } ] } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Transition inconnue | 404 Transition not found | CRUD0229 |
Pas de cycle de vie associé | 404 No workflow detected | CRUD0227 |
Exemple :
{ "success": false, "messages": [ { "type": "error", "contentText": "transition \"foo\" is not available for workflow \"My workflow\" (1090)", "code": "CRUD0229" } ], "data": null, "exceptionMessage": "transition \"foo\" is not available for workflow \"My workflow\" (1090)" }
POST /api/v1/documents/<documentId>/workflows/transitions/<transitionId>
Le document documentId
passe la transition donné transitionId
. La
transition demandée doit exister à partir de l'état courant.
Exemple :
POST /api/v1/documents/<documentId>/workflows/transitions/my_transmission
Le contenu est une structure JSON qui comprend les informations suivantes :
comment
: Texte à insérer dans l'historiqueparameters
: Liste des valeurs des paramètres indexés par leur identifiantExemple :
{ "comment" : "Mon commentaire de transition" "parameters": { "my_referencedate": "2015-06-23", "my_validation": "yes" } }
Le retour est une donnée JSON.
La partie data
contient :
uri
: URI préférentielle d'accès à la ressource;state
: Nouvel état du document
id
: identifiant de l'état,isCurrentState
: indique si cet état est l'étape courante,label
: intitulé de l'état (localisé en fonction de la langue de l'utilisateur) activity
: intitulé de l'activité (localisé en fonction de la langue de l'utilisateur) displayValue
: intitulé calculé en fonction des valeurs de "activity" et "label"color
: code couleur (#RRGGBB) associé à l'étatExemple :
{ "success": true, "messages": [ { "type": "warning", "contentText": "Avertissement : no mail template", "code": "WORKFLOW_TRANSITION" }, { "type": "notice", "contentText": "13:48 - Bulle changement d'état vers Transmis" } ], "data": { "state": { "id": "my_transmited", "isCurrentState": true, "label": "Transmis", "activity": "Vérification de l'adoption", "displayValue": "Vérification de l'adoption", "color": "#A8E5FF" } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Échec de la transition (droit, m0, m1) | 403 Forbidden | CRUD0230 |
Pas de cycle de vie associé | 404 No workflow detected | CRUD0227 |
Transition invalide (non applicable depuis l'étape courante) | 404 Invalid transition | CRUD0235 |
Exemple :
{ "success": false, "messages": [ { "type": "error", "contentText": "Destination state is not defined for workflow \"Défaut demande adoption\" (1090)", "code": "CRUD0235" }, { "type": "message", "contentText": "You can consult ?app=HTTPAPI_V1 to have info on the API", "contentHtml": "You can consult <a href=\"?app=HTTPAPI_V1\">the REST page</a> to have info on the API" } ], "data": null, "exceptionMessage": "Destination state is not defined for workflow \"Défaut demande adoption\" (1090)" }
GET /api/v1/documents/<documentId>/workflows/transitions/
Récupération de toutes les transitions du document documentId
.
Exemple :
GET /api/v1/documents/61120/workflows/transitions/
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
uri
: URI préférentielle d'accès à la ressource;transitions
: Liste de transition
uri
: identifiant de l'état de départlabel
: libellé de la transition (localisé en fonction de la langue de l'utilisateur)valid
: indique si la transition existe depuis l'étape couranteExemple :
{ "success": true, "messages": [], "data": { "uri": "./api/v1/documents/61120/workflows/transitions/", "transitions": [ { "uri": "./api/v1/documents/61120/workflows/transitions/my_Ttransmited", "label": "Transmettre le dossier", "valid": true }, { "uri": "./api/v1/documents/61120/workflows/transitions/my_Taccepted", "label": "Accepter le dossier", "valid": false }, { "uri": "./api/v1/documents/61120/workflows/transitions/my_Trefused", "label": "Refuser le dossier", "valid": false }, { "uri": "./api/v1/documents/61120/workflows/transitions/my_Trealised", "label": "Fin de traitement", "valid": false }, { "uri": "./api/v1/documents/61120/workflows/transitions/my_Tretry", "label": "À corriger", "valid": false } ] } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Pas de cycle de vie associé | 404 No workflow detected | CRUD0227 |
Exemple :
{ "success": false, "messages": [ { "type": "error", "contentText": "No associated workflow for document \"9567\"", "code": "CRUD0227" } ], "data": null, "exceptionMessage": "No associated workflow for document \"9567\"" }
Cette collection décrit les documents de Dynacase supprimés.
L'url d'accès est : /api/v1/trash
La collection trash implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/trash/ |
Liste des documents supprimés |
POST |
/api/v1/trash/ |
N/A |
PUT |
/api/v1/trash/ |
N/A |
DELETE |
/api/v1/trash/ |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/trash/<id> |
Retourne le document id |
POST |
/api/v1/trash/<id> |
N/A |
PUT |
/api/v1/trash/<id> |
Restauration du document id |
DELETE |
/api/v1/trash/<id> |
N/A |
GET /api/v1/trash/
Récupération de la liste des documents supprimés de la plateforme.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination et orderBy),uri
: URI d'accès de la collection,properties
: Le titre de la recherche "The trash" (traduit)documents
: un tableau de document (sous la même forme que les documents unitaires)Chaque document est un objet contenant les entrées suivantes :
properties
: liste des propriétés du document,attributes
: liste des attributs du document (facultatif),uri
: URI d'accès du document.Exemple :
{ "success": true, "messages": [], "data": { "requestParameters": { "slice": 10, "offset": 0, "length": 10, "orderBy": "title asc, id desc" }, "uri": "/api/v1/trash/", "properties": { "title": "The trash" }, "documents": [ { "properties": { "id": 1003, "title": "accord", "icon": "api/v1/images/assets/sizes/24x24c/wask.png", "initid": 1003, "name": "WASK", "revision": 0 }, "uri": "/api/v1/trash/1003.json" }, [...] ] } }
Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Sens de l'orderBy inconnu | 400 | CRUD0501 |
Attribut ou propriété d'orderBy invalide | 400 | CRUD0502 |
La liste des documents peut être paginée et ordonnée.
Les mots clefs GET sont les suivants :
<attribut|propriété>:<asc:desc>
title:asc
,all
,COLLECTION_DEFAULT_SLICE
de l'application HTTPAPI_V1
(10), Les paramètres appliqués sont résumés dans le retour de la collection
requestParameter
.
Exemple :
/trash/?orderBy=title:asc,id:desc&slice=100&offset=20
Les documents peuvent être retournés avec plus ou moins d'information.
Par défaut : fields=document.properties
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère l'ensemble des propriétés par défaut | "id", "title", "icon", "initid", "name" |
document.properties.all |
Récupère toutes les propriétés | |
document.properties.<prop> |
Récupère la propriété indiquée | |
document.attributes.my_attribute |
Ajoute l'attribut my_attribute | si l'attribut n'existe pas dans un des documents il est retourné vide |
La liste des propriétés est documentée dans la documentation de format collection.
La collection n'a pas de cache.
Récupération d'un document du trash.
GET /api/v1/trash/<documentId>
Récupération de la dernière révision du document supprimé ayant pour id <documentId>
.
L'extension ".json" peut être ajoutée pour expliciter le format de sortie.
Exemple :
GET /api/v1/trash/1234.json
L'identifiant du document peut être son nom logique, son identifiant numérique.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient 3 champs :
document.uri
: uri d'accès à la ressource modifiéedocument.properties
: liste des valeurs des propriétésdocument.attributes
: liste des valeurs des attributsLes attributs en visibilité "I" ne sont pas retournés.
Exemple :
{"success" : true, "messages" : [], "data" : { "document" : { "uri" : "api\/v1\/documents\/1057.json", "properties" : { "title" : "Aristote le Stagirite", "name" : null, "icon" : "api/v1/images/assets/sizes/24x24c/doc.png" [...] }, "attributes" : { "my_title" : {"value" : "[123", "displayValue" : "[123"}, "my_level" : {"value" : 34, "displayValue" : "34"} [...] } } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Document non trouvé | 404 | API0200 |
Privilège insuffisant pour accéder au document | 403 | API0201 |
Document supprimé | 404 | API0219 |
Propriété demandée inexistante | 400 | API0202 |
Attribut demandé inexistant | 400 | API0218 |
Exemple :
Cas d'erreur de document non trouvé
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1200\" not found", "contentHtml" : "", "code" : "API0200", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1200\" not found" }
Le document peut être retourné avec plus ou moins d'information.
Par défaut : fields=document.properties,document.attributes
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère les propriétés données par défaut | "id", "title", "icon", "initid", "name", "revision" |
document.properties.<prop> |
Récupère la propriété indiquée | |
document.attributes |
Récupère les valeurs et les valeurs affichable des attributs | |
document.attributes.<id> |
Récupère la valeur d'un attribut particulier | |
document.family.structure |
Récupère la structure de la famille |
La liste des propriétés est documentée dans la documentation de format collection.
PUT /api/v1/trash/<id>
Restauration du document <documentId>
.
L'extension ".json" peut être ajoutée pour expliciter le format de sortie.
Exemple :
PUT /api/v1/trash/1234.json
Attention : L'identifiant du document peut être son nom logique, son identifiant numérique. L'identifiant numérique peut référencer n'importe quelle révision du document. Dans tous les cas, la modification porte sur la dernière révision du document.
La demande de restauration doit être formulée de la manière suivante.
Le type de la requête est application/json
.
{ "document": { "properties": { "status": "alive" } } }
Note : Toute donnée additionnelle sera ignorée.
Le retour est une donnée JSON.
La partie data
contient 3 champs :
document.uri
: uri d'accès à la ressource modifiéedocument.properties
: liste des valeurs des propriétésdocument.attributes
: liste des valeurs des attributsExemple :
{"success" : true, "messages" : [], "data" : { "document" : { "uri" : "api\/v1\/documents\/1057.json", "properties" : { "title" : "Hello World", [...] }, "attributes" : { "my_title" : {"value" : "Hello World", "displayValue" : "Hello World"}, [...] } } }, "exceptionMessage" : "" }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Impossible de lire la demande de restauration | 500 | CRUD0208 |
Demande de restauration mal formulée | 500 | CRUD0236 |
Document non trouvé | 404 | CRUD0200 |
Document trouvé mais pas dans la poubelle | 404 | CRUD0236 |
Impossible de restaurer le document | 500 | CRUD0505 |
Exemple :
Cas de demande de restauration mal formulée
{ "success": false, "messages": [ { "type": "error", "contentText": "The restoration must be initialized with {\"document\" : { \"properties\" : { \"status\" : \"alive\" } } }", "code": "CRUD0236" } ], "data": null, "exceptionMessage": "The restoration must be initialized with {\"document\" : { \"properties\" : { \"status\" : \"alive\" } } }" }
Cette ressource décrit les tags utilisateur des documents. Un tag est un mot- clef auquel une valeur est éventuellement associée. Ce tag est associé à un document pour un utilisateur particulier.
L'url d'accès est : api/v1/documents/<documentId>/usertags/
La sous-collection usertags implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<documentId>/usertags/ |
Liste des tags utilisateurs |
POST |
api/v1/documents/<documentId>/usertags/ |
N/A |
PUT |
api/v1/documents/<documentId>/usertags/ |
N/A |
DELETE |
api/v1/documents/<documentId>/usertags/ |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<documentId>/usertags/<tagid> |
Retourne la définition du tag donnée |
POST |
api/v1/documents/<documentId>/usertags/<tagid> |
Ajoute un tag |
PUT |
api/v1/documents/<documentId>/usertags/<tagid> |
Modifie un tag existant |
DELETE |
api/v1/documents/<documentId>/usertags/<tagid> |
Supprime un tag |
GET /api/v1/documents/<documentId>/usertags/
Récupération des tags de l'utilisateur connecté pour le document documentId
.
Exemple :
GET /api/v1/documents/my_document/usertags/
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination),uri
: URI d'accès de la collection,userTags
: un tableau de tags utilisateur Chaque tag utilisateur est un objet contenant les entrées suivantes :
id
: identifiant du tag (les identifiants sont sensibles à la casse),date
: date de pose du tag,value
: valeur du tag,uri
: URI d'accès au tag.Exemple :
{ "success": true, "messages": [], "data": { "uri": "http://www.example.net/api/v1/documents/34757/usertags/", "requestParameters": { "slice": -1, "offset": 0 }, "userTags": [ { "id": "lasttab", "date": "2015-01-07 17:40:43", "uri": "http://www.example.net/api/v1/documents/34757/usertags/lasttab", "value": "tst_t_tab_relations" }, { "id": "VIEWED", "date": "2015-01-07 16:09:13", "uri": "http://www.example.net/api/v1/documents/34757/usertags/VIEWED", "value": "" }, { "id": "my_special", "date": "2014-12-24 09:21:41", "uri": "http://www.example.net/api/v1/documents/34757/usertags/solo", "value": { "a": 1 } } ] } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour accéder au document | 403 | CRUD0201 |
Document supprimé | 404 | CRUD0108 |
Document non existant | 404 | CRUD0200 |
Exemple :
Cas d'erreur de privilège
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]", "contentHtml" : "", "code" : "API0201", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]" }
La liste des tags utilisateur est paginée et ordonnée.
Les mots clefs GET sont les suivants :
Les paramètres appliqués sont résumés
dans le retour de la collection
requestParameter
.
Le tri des tags utilisé est basé sur la date de modification. Il est donné dans l'ordre descendant (du plus récent au plus ancien).
Exemple :
/api/v1/documents/my_document/usertags/?slice=10&offset=20
GET /api/v1/documents/<documentId>/usertags/<tagid>
Récupération du tag tagid
du document documentId
de l'utilisateur connecté.
Exemple :
GET /api/v1/documents/my_document/usertags/my_custom
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient 2 champs :
uri
: URI préférentielle d'accès à la ressource;userTag
: Propriétés du tag
id
: identifiant du tag (les identifiants sont sensible à la casse),date
: date de pose du tag,value
: valeur du tag. La valeur peut avoir 3 formes :
Hello world
)123.34
){"one": 12, "two":"Hello"}
)Exemple :
{ "success": true, "messages": [], "data": { "uri": "http://www.example.net/api/v1/documents/34757/usertags/my_custom", "userTag": { "id": "my_custom", "date": "2014-12-24 09:17:24", "value": { "my_first": 1123, "my_second": "Hello world" } } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour accéder au document | 403 | CRUD0201 |
Document supprimé | 404 | CRUD0108 |
Document non existant | 404 | CRUD0200 |
Tag demandé inexistant | 404 | CRUD0223 |
Exemple :
Cas d'erreur de privilège
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]", "contentHtml" : "", "code" : "API0201", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]" }
POST /api/v1/documents/<documentId>/usertags/<tagid>
Création du tag tagid
pour document documentId
.
Le tag est associé à l'utilisateur connecté.
Exemple :
POST /api/v1/documents/my_document/usertags/my_custom
Le droit de modifier le document n'est pas requis pour ajouter un tag. Seul le droit de consulter le document est requis.
Le contenu contient la valeur du tag. Si elle est vide la valeur sera égale à la chaîne vide.
Si le contenu est une structure json, la valeur retournée sera une structure.
Le retour est une donnée JSON.
La partie data
contient 2 champs :
uri
: URI préférentielle d'accès à la ressource;userTag
: liste des valeurs des propriétés;Exemple :
{ "success": true, "messages": [], "data": { "uri": "http://www.example.net/api/v1/documents/34757/usertags/test", "userTag": { "id": "test", "date": "2015-01-08 14:58:27", "value": "Hello" } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour accéder au document | 403 | CRUD0201 |
Document supprimé | 404 | CRUD0108 |
Tag demandé existant | 400 | CRUD0225 |
Exemple :
Cas d'erreur de privilège
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]", "contentHtml" : "", "code" : "API0201", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]" }
PUT /api/v1/documents/<documentId>/usertags/<tagid>
Modification du tag tagid
du document documentId
pour l'utilisateur
connecté.
Exemple :
PUT /api/v1/documents/my_document/usertags/my_custom
Si le tag n'existe déjà, il est créé.
Le contenu contient la valeur du tag.
Si il est vide la valeur est égale à la chaîne vide.
Si le contenu est une structure JSON, la valeur retournée est une structure.
Le retour est une donnée JSON.
La partie data
contient 2 champs :
uri
: URI préférentielle d'accès à la ressource;userTag
: liste des valeurs du tag;Exemple :
{ "success": true, "messages": [], "data": { "uri": "http://www.example.net/api/v1/documents/34757/usertags/test", "userTag": { "id": "test", "date": "2015-01-08 14:58:27", "value": { "first":"Interesting", "second" : 123.56 } } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour accéder au document | 403 | CRUD0201 |
Document supprimé | 404 | CRUD0108 |
Exemple :
Cas d'erreur de privilège
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]", "contentHtml" : "", "code" : "API0201", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]" }
DELETE /api/v1/documents/<documentId>/usertags/<tagid>
Suppression du tag tagid
du document documentId
Exemple :
DELETE /api/v1/documents/my_document/usertags/my_custom
Le droit de modifier le document n'est pas requis pour supprimer un tag. Seul le droit de consulter le document est requis.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
est vide.
Exemple :
{ "success": true, "messages": [], "data": null }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour accéder au document | 403 | CRUD0201 |
Document supprimé | 404 | CRUD0108 |
Tag demandé inexistant | 400 | CRUD0223 |
Exemple :
Cas d'erreur de privilège
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]", "contentHtml" : "", "code" : "API0201", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]" }
Cette collection décrit les recherches de Dynacase.
L'url d'accès est : api/v1/searches
La collection searches implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/searches/ |
Liste des recherches |
POST |
api/v1/searches/ |
N/A |
PUT |
api/v1/searches/ |
N/A |
DELETE |
api/v1/searches/ |
N/A |
Une recherche étant un document Dynacase, la création d'une nouvelle
recherche passe par l'utilisation de l'entrée families/SEARCH/documents/
. De plus, il existe différents type de recherches.
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/searches/<id>/documents/ |
Contenu de la recherche id |
POST |
api/v1/searches/<id>/documents/ |
N/A |
PUT |
api/v1/searches/<id>/documents/ |
N/A |
DELETE |
api/v1/searches/<id>/documents/ |
N/A |
GET /api/v1/searches/
Récupération de la liste des recherches accessibles.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination et orderBy),uri
: URI d'accès de la collection,documents
: un tableau de recherche (sous la même forme que les documents unitaires)Chaque document est un objet contenant les entrées suivantes :
properties
: liste des propriétés de la recherche,uri
: URI de contenu de la recherche.Exemple :
{ "success": true, "messages": [], "data": { "requestParameters": { "slice": 10, "offset": 0, "length": 9, "orderBy": "title asc, id desc" }, "uri": "/api/v1/searches/", "documents": [ { "properties": { "id": 1894, "title": "Les articles intéressants", "icon": "api/v1/images/assets/sizes/24x24c/search.gif", "initid": 1894, "name": null, "revision": 0 }, "uri": "/api/v1/searches/1894/documents/" }[...] ] } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Sens de l'orderBy inconnu | 400 | CRUD0501 |
Attribut ou propriété d'orderBy invalide | 400 | CRUD0502 |
La liste des documents peut être paginée et ordonnée.
Les mots clefs GET sont les suivants :
<attribut|propriété>:<asc:desc>
title:asc
,COLLECTION_DEFAULT_SLICE
de l'application HTTPAPI_V1
(10),
Les paramètres appliqués sont résumés dans le retour de la collection
requestParameter
.
Les documents peuvent être retournés avec plus ou moins d'information.
Par défaut : fields=document.properties
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère l'ensemble des propriétés par défaut | "id", "title", "icon", "initid", "name", "revision" |
document.properties.all |
Récupère toutes les propriétés | |
document.properties.<prop> |
Récupère la propriété indiquée |
La liste des propriétés est documentée dans la documentation de format collection.
La collection n'a pas de cache.
GET /api/v1/searches/<searchId>/documents/
Récupération de la liste des documents trouvés par la recherche <searchId>
.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination et orderBy),uri
: URI d'accès de la collection,properties
: contient le titre de la recherche, et l'uri d'accès au document "recherche"documents
: un tableau de document (sous la même forme que les documents unitaires)Chaque document est un objet contenant les entrées suivantes :
properties
: liste des propriétés du document,attributes
: liste des attributs du document (facultatif),uri
: URI d'accès du document.Exemple :
{ "success": true, "messages": [], "data": { "requestParameters": { "slice": 10, "offset": 0, "length": 1, "orderBy": "title asc, id desc" }, "uri": "http://www.example.net/api/v1/searches/5236/documents/", "properties": { "title": "Articles intéressants", "uri": "http://localhost/tmp32/api/v1/document/5236.json" }, "documents": [ { "properties": { "id": 26653, "title": "La culture des perles", "icon": "api/v1/images/assets/sizes/24x24c/article.png", "initid": 1425, "name": null, "revision": 1 }, "uri": "http://www.example.net/api/v1/documents/1425.json" } ] } }
Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Sens de l'orderBy inconnu | 400 | CRUD0501 |
Attribut ou propriété d'orderBy invalide | 400 | CRUD0502 |
L'identifiant de la recherche ne correspond pas à une recherche | 400 | CRUD0503 |
La liste des documents peut être paginée et ordonnée.
Les mots clefs GET sont les suivants :
<attribut|propriété>:<asc:desc>
title:asc
,all
,COLLECTION_DEFAULT_SLICE
de l'application HTTPAPI_V1
(10), Les paramètres appliqués sont résumés dans le retour de la collection
requestParameter
.
Exemple :
/searches/<my_search>/?orderBy=title:asc,id:desc&slice=100&offset=20
Les documents peuvent être retournés avec plus ou moins d'information.
/searches/<my_search>/documents/?fields=document.properties
/searches/<my_search>/documents/?fields=document.properties.id,document.properties.title
/searches/<my_search>/documents/?fields=document.properties.id,document.properties.title
/searches/<my_search>/documents/?fields=document.attributes
/searches/<my_search>/documents/?fields=document.attributes.my_attribute
Par défaut : fields=document.properties
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère l'ensemble des propriétés par défaut | "id", "title", "icon", "initid", "name", "revision" |
document.properties.all |
Récupère toutes les propriétés | |
document.properties.<prop> |
Récupère la propriété indiquée | |
document.attributes |
Ajoute tous les attributs de la famille référencée par la recherche | s'il n'y a pas de famille de référence alors aucun attribut n'est retourné |
document.attributes.my_attribute |
Ajoute l'attribut my_attribute | si l'attribut n'existe pas dans un des documents il est retourné vide |
La liste des propriétés est documentée dans la documentation de format collection.
La collection n'a pas de cache.
Cette collection décrit les dossiers de Dynacase.
Un dossier est un document permettant de stocker un ensemble de documents.
L'url d'accès est : /api/v1/folders
La collection searches implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/folders/ |
Liste des dossiers |
POST |
/api/v1/folders/ |
N/A |
PUT |
/api/v1/folders/ |
N/A |
DELETE |
/api/v1/folders/ |
N/A |
Une recherche étant un document Dynacase, la création d'une nouvelle
dossier passe par l'utilisation de l'entrée families/DIR/documents/
.
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/folders/<id>/documents/ |
Contenu du dossier id |
POST |
/api/v1/folders/<id>/documents/ |
N/A |
PUT |
/api/v1/folders/<id>/documents/ |
N/A |
DELETE |
/api/v1/folders/<id>/documents/ |
N/A |
GET /api/v1/folders/
Récupération de la liste des dossiers accessibles.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination et orderBy),uri
: URI d'accès de la collection,documents
: un tableau de document (sous la même forme que les documents unitaires)Chaque document est un objet contenant les entrées suivantes :
properties
: liste des propriétés du dossier,uri
: URI du contenu du dossierExemple :
{ "success": true, "messages": [], "data": { "requestParameters": { "slice": 10, "offset": 0, "length": 10, "orderBy": "title asc, id desc" }, "uri": "/api/v1/folders/", "properties": { "title": "The folders" }, "documents": [ { "properties": { "id": 1011, "title": "Administrateurs", "icon": "api/v1/images/assets/sizes/24x24c/igroup.png", "initid": 1011, "name": "GADMIN", "revision": 0 }, "uri": "/api/v1/folders/1011/documents/" } ], ... } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Sens de l'orderBy inconnu | 400 | CRUD0501 |
Attribut ou propriété d'orderBy invalide | 400 | CRUD0502 |
La liste des documents peut être paginée et ordonnée.
Les mots clefs GET sont les suivants :
<attribut|propriété>:<asc:desc>
title:asc
,COLLECTION_DEFAULT_SLICE
de l'application HTTPAPI_V1
(10), Les paramètres appliqués sont résumés dans le retour de la collection
requestParameter
.
Les documents peuvent être retournés avec plus ou moins d'information.
Par défaut : fields=document.properties
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère l'ensemble des propriétés par défaut | "id", "title", "icon", "initid", "name" |
document.properties.all |
Récupère toutes les propriétés | |
document.properties.<prop> |
Récupère la propriété indiquée |
La liste des propriétés est documentée dans la documentation de format collection.
La collection n'a pas de cache.
GET /api/v1/folders/<folderId>/documents/
Récupération de la liste des documents contenu par le dossier <folderId>
.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination et orderBy),uri
: URI d'accès de la collection,documents
: un tableau de documents (sous la même forme que les documents unitaires)Chaque document est un objet contenant les entrées suivantes :
properties
: liste des propriétés du document,attributes
: liste des attributs du document (facultatif),uri
: URI d'accès au documentExemple :
{ "success": true, "messages": [], "data": { "requestParameters": { "slice": 10, "offset": 0, "length": 10, "orderBy": "title asc, id desc" }, "uri": "/api/v1/folders/9987/documents/", "properties": { "title": "Documents importants", "uri": "http://www.example.net/api/v1/documents/9987.json" }, "documents": [ { "properties": { "id": 1003, "title": "Réchauffement climatique", "icon": "api/v1/images/assets/sizes/24x24c/article.png", "initid": 1003, "name": null, "revision": 0 }, "uri": "http://www.example.net/api/v1/documents/1003.json" }, [...] ] } }
Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Sens de l'orderBy inconnu | 400 | CRUD0501 |
Attribut ou propriété d'orderBy invalide | 400 | CRUD0502 |
L'identifiant du dossier ne correspond pas à un dossier | 400 | CRUD0504 |
La liste des documents peut être paginée et ordonnée.
Les mots clefs GET sont les suivants :
<attribut|propriété>:<asc:desc>
title:asc
,all
,COLLECTION_DEFAULT_SLICE
de l'application HTTPAPI_V1
(10), Les paramètres appliqués sont résumés dans le retour de la collection
requestParameter
.
Exemple :
/folders/<folderId>/?orderBy=title:asc,id:desc&slice=100&offset=20
Les documents peuvent être retournés avec plus ou moins d'information.
/folders/<folderId>/documents/?fields=document.properties
/folders/<folderId>/documents/?fields=document.properties.id,document.properties.title
/folders/<folderId>/documents/?fields=document.properties.id,document.properties.title
/folders/<folderId>/documents/?fields=document.attributes
/folders/<folderId>/documents/?fields=document.attributes.my_attribute
Par défaut : fields=document.properties
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère l'ensemble des propriétés par défaut | "id", "title", "icon", "initid", "name", "revision" |
document.properties.all |
Récupère toutes les propriétés | |
document.properties.<prop> |
Récupère la propriété indiquée | |
document.attributes |
Ajoute tous les attributs de la famille référencée par le dossier | s'il n'y a pas de famille de référence alors aucun attribut n'est retourné |
document.attributes.my_attribute |
Ajoute l'attribut my_attribute | si l'attribut n'existe pas dans un des documents il est retourné vide |
La liste des propriétés est documentée dans la documentation de format collection.
La collection n'a pas de cache.
Cette collection décrit les familles de Dynacase.
L'url d'accès est : /api/v1/families
La collection familles implémente les méthodes suivantes :
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/families/ |
N/A |
POST |
/api/v1/families/ |
N/A |
PUT |
/api/v1/families/ |
N/A |
DELETE |
/api/v1/families/ |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/families/<famid> |
Retourne les propriétés de la famille famid |
POST |
/api/v1/families/<famid> |
N/A |
PUT |
/api/v1/families/<famid> |
N/A |
DELETE |
/api/v1/families/<famid> |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/families/<famid>/documents/ |
Liste des documents de la famille famid |
POST |
/api/v1/families/<famid>/documents/ |
Créé un document de la famille famid |
PUT |
/api/v1/families/<famid>/documents/ |
N/A |
DELETE |
/api/v1/families/<famid>/documents/ |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/families/<famid>/documents/<id> |
Retourne le document id |
POST |
/api/v1/families/<famid>/documents/<id> |
N/A |
PUT |
/api/v1/families/<famid>/documents/<id> |
Met à jour le document id |
DELETE |
/api/v1/families/<famid>/documents/<id> |
Supprime le document id |
GET /api/v1/families/<famName>
Récupération de la ressource décrivant la famille <famName>
.
Exemple :
GET /api/v1/families/my_cookbook
Le nom de la famille est insensible à la casse.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient 2 champs :
uri
: URI préférentielle d'accès à la ressource;document.properties
: liste des valeurs des propriétés;Exemple :
{ "success": true, "messages": [], "data": { "document": { "properties": { "id": 1065, "title": "Articles", "icon": "api/v1/images/assets/sizes/24x24c/article.png", "initid": 1065, "name": "MY_ARTICLE", "revision": 0 }, "uri": "http://localhost/tmp32/api/v1/families/MY_ARTICLE.json" } } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour accéder au document | 403 | CRUD0201 |
Document supprimé | 404 | CRUD0108 |
Propriété demandé inexistante | 400 | |
Attribut demandé inexistant | 400 |
Exemple :
Cas d'erreur de privilège
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]", "contentHtml" : "", "code" : "API0201", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Document \"1051\" access deny : Pas de privil\u00e8ge view pour le document famille [1051]" }
La ressource peut être retournée avec plus ou moins d'information.
Par défaut : fields=document.properties
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère les propriétés données par défaut | "id", "title", "icon", "initid", "name", "revision" |
document.properties.<prop> |
Récupère la propriété indiquée | |
family.structure |
Récupère la structure de la famille |
La liste des propriétés est documentée dans la documentation de format collection.
GET /api/v1/families/<famName>/documents/
Récupération de la liste des documents de la famille families
présents sur la plateforme.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient :
requestParameters
: contient un résumé des paramètres de la requête en cours (pagination et orderBy),uri
: URI d'accès de la collection,properties
: titre de la recherche (composée à partie du titre de la famille)documents
: un tableau de document (sous la même forme que les documents unitaires)Chaque document est un objet contenant les entrées suivantes :
properties
: liste des propriétés du document,attributes
: liste des attributs du document (facultatif),uri
: URI d'accès du document.Exemple :
{ "success": true, "messages": [], "data": { "requestParameters": { "slice": 10, "offset": 0, "length": 2, "orderBy": "title asc, id desc" }, "uri": "/api/v1/families/TEXT/documents/", "properties": { "title": "Texte Documents" }, "documents": [ { "properties": { "id": 1054, "title": "La vie des fourmis", "icon": "api/v1/images/assets/sizes/24x24c/text.gif", "initid": 1054, "name": null, "revision": 0 }, "uri": "/api/v1/documents/1054.json" }, { "properties": { "id": 1053, "title": "Les grands philosophes", "icon": "api/v1/images/assets/sizes/24x24c/text.gif", "initid": 1053, "name": null, "revision": 0 }, "uri": "/api/v1/documents/1053.json" } ] } }
Les valeurs retournées correspondent aux valeurs de la vue de consultation par défaut.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Sens de l'orderBy inconnu | 400 | CRUD0501 |
Attribut ou propriété d'orderBy invalide | 400 | CRUD0502 |
La liste des documents peut être paginée et ordonnée.
Les mots clefs GET sont les suivants :
<attribut|propriété>:<asc:desc>
title:asc
,all
,COLLECTION_DEFAULT_SLICE
de l'application HTTPAPI_V1
(10), Les paramètres appliqués sont résumés dans le retour de la collection
requestParameter
.
Exemple :
families/<famName>/documents/?orderBy=title:asc,id:desc&slice=100&offset=20
Les documents peuvent être retournés avec plus ou moins d'information.
families/<famName>/documents/?fields=document.properties
families/<famName>/documents/?fields=document.properties.id,document.properties.title
Par défaut : fields=document.properties
fields | Signification | Remarques |
---|---|---|
document.properties |
Récupère les propriétés données par défaut | "id", "title", "icon", "initid", "name", "revision" |
document.properties.all |
Récupère toutes les propriétés | |
document.properties.<prop> |
Récupère la propriété indiquée | |
document.attributes.my_attribute |
Ajoute l'attribut my_attribute | si l'attribut n'existe pas dans un des documents il est retourné vide |
document.attributes |
Ajoute tous les attributs |
La liste des propriétés est documentée dans la documentation de format collection.
La collection n'a pas de cache.
POST /api/v1/families/<famName>/documents/
Création d'un document de la famille <famName>
Exemple :
POST /api/v1/families/my_cookbook/documents/
Le nom de la famille est insensible à la casse.
Le contenu de la requête doit contenir une donnée JSON avec la liste des attributs à valuer.
{ "document": { "attributes" : { "<attrName>" : { "value" : <newValue> } } } }
Le type de la requête est application/json
.
Exemple :
{ "document": { "attributes" : { "ba_ttle" : {"value" : "Hello world"}, "ba_desc" : {"value" : "Nice Day"} } }
Note : Toute donnée additionnelle sera ignorée.
Cette forme ne permet pas d'enregistrer directement des fichiers dans le document.
Pour enregistrer le fichier, il sera nécessaire de passer par la ressource
file
qui retournera un identifiant valide qui pourra être utilisé
comme valeur d'attribut de type fichier.
Le contenu de la requête contient la liste des valeurs d'attributs à enregistrer. Chaque variable (POST) est le nom de l'attribut (casse insensible).
Le type de la requête est application/x-www-form-urlencoded
.
Ce format peut être utilisé directement depuis un formulaire HTML.
Cette forme permet aussi d'enregistrer des fichiers dans le document.
Le retour est une donnée JSON.
La partie data
contient un champ document
qui inclut 3 champs :
document.uri
: uri d'accès à la nouvelle ressourcedocument.properties
: liste des valeurs des propriétésdocument.attributes
: liste des valeurs des attributsExemple :
{ success :true, messages : [], data : { "document" : { "uri" : "api/v1/documents/1256", "properties" : { "id" : 1256, "title" : "Hello world", .... } "attributes" : { "ba_title" : { "value" : "Hello world", "displayValue" : "Hello world" }, "ba_cost" : { "value" : 234, "displayValue" : "234.00 €" } } } } }
La liste des propriétés est documentée dans la documentation de format collection.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Privilège insuffisant pour créer le document de cette famille | 403 | API0204 |
Tentative de modification d'un attribut inconnu | 403 | API0205 |
Tentative de modification d'un attribut en visibilité I | 403 | API0205 |
Erreur lors de la création | 403 | API0205 |
Famille inconnue | 404 | API0206 |
Cette collection décrit les énumérés de Dynacase.
L'url d'accès est : api/v1/families/<famName>/enumerates/
La sous-collection enumerates implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/families/<famName>/enumerates/ |
Liste des attributs énumérés |
POST |
api/v1/families/<famName>/enumerates/ |
N/A |
PUT |
api/v1/families/<famName>/enumerates/ |
N/A |
DELETE |
api/v1/families/<famName>/enumerates/ |
N/A |
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/families/<famName>/enumerates/<attrid> |
Retourne la définition de l'énuméré attrid |
POST |
api/v1/families/<famName>/enumerates/<attrid> |
N/A |
PUT |
api/v1/families/<famName>/enumerates/<attrid> |
N/A |
DELETE |
api/v1/families/<famName>/enumerates/<attrid> |
N/A |
GET /api/v1/families/<famName>/enumerates/
Récupére la liste des énumérés de la famille <famname>
.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
{ "success": true, "messages": [], "data": { "uri": "http://www.example.net/api/v1/families/DIR/enumerates/", "enumerates": [ { "attributeId": "gui_isrss", "label": "Utilisable comme flux RSS", "uri": "http://www.example.net/api/v1/families/DIR/enumerates/gui_isrss.json" }, { "attributeId": "gui_sysrss", "label": "Flux RSS système", "uri": "http://www.example.net/api/v1/families/DIR/enumerates/gui_sysrss.json" }, { "attributeId": "fld_allbut", "label": "tout ou rien", "uri": "http://www.example.net/api/v1/families/DIR/enumerates/fld_allbut.json" }, { "attributeId": "fld_subfam", "label": "restriction sous famille", "uri": "http://www.example.net/api/v1/families/DIR/enumerates/fld_subfam.json" } ] } }
L'api retourne une liste d'énumérés (enumerates
) chacun des éléments contient :
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Famille non trouvée | 404 | API0220 |
Exemple :
{ "success": false, "messages": [ { "type": "error", "contentText": "Document \"NOT_A_FAMILY\" not found", "code": "API0200" }, { "type": "message", "contentText": "You can consult http://www.example.net/index.php?app=HTTPAPI_V1 to have info on the API", "contentHtml": "You can consult <a href=\"http://www.example.net/index.php?app=HTTPAPI_V1\">the REST page</a> to have info on the API" } ], "data": null, "exceptionMessage": "Document \"NOT_A_FAMILY\" not found" }
Cette option indique le nombre de valeur maximum à retourner.
Exemple :
GET api/v1/families/<famName>/enumerates/?slice=10
Index à partir duquel, les énumérés sont retournées.
Exemple:
GET api/v1/families/<famName>/enumerates/?slice=2&offset=7
GET /api/v1/families/<famName>/enumerates/<attrid>
Récupération des valeurs de l'énuméré de l'attribut attrid
et de la famille famName
.
Le contenu de la requête est vide.
Le retour est une donnée JSON.
La partie data
contient 3 champs :
document.data.uri
: URI d'accès à la ressource;document.data.label
: label de l'attribut traduit dans la langue de l'utilisateur;document.data.requestParameters
: filtre appliqués à la recherche;document.data.enumItems
: tableau d'objets :
key
: valeur de l'élémentlabel
: libellé (traduit dans la langue de l'utilisateur)Exemple :
{ "success": true, "messages": [], "data": { "uri": "http://www.example.net/api/v1/families/my_article/enumerates/my_continent.json", "label": "Continents", "requestParameters": { "operator": "contains", "keyword": "" }, "enumItems": [ { "key": "Asia", "label": "Asie" }, { "key": "Europa", "label": "Europe" }, { "key": "Africa", "label": "Afrique" }, { "key": "SouthAmerica", "label": "Amérique du sud" }, { "key": "NorthAmerica", "label": "Amérique du nord" }, { "key": "Oceania", "label": "Océanie" }, { "key": "Antartica", "label": "Antartique" } ] } }
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Famille non trouvée | 404 | API0200 |
Attribut non trouvé | 404 | API0400 |
Attribut de type non énuméré | 403 | API0401 |
Exemple :
Cas d'erreur de en cas d'attribut non énuméré
{"success" : false, "messages" : [ { "type" : "error", "contentText" : "Attribute \"an_tatouage\" is not an enum (type \"int\") in family \"ZOO_ANIMAL\"", "contentHtml" : "", "code" : "API0401", "uri" : "", "data" : null } ], "data" : null, "exceptionMessage" : "Attribute \"an_tatouage\" is not an enum (type \"int\") in family \"ZOO_ANIMAL\"" }
?keyword
et ?operator
)Il est possible de filtrer les résultats pour n'en retourner qu'un sous ensemble.
/api/v1/families/IUSER/enumerates/us_rolesorigin.json?keyword=<keyword>
/api/v1/families/IUSER/enumerates/us_rolesorigin.json?operator=startswith&keyword=<keyword>
Les paramètres sont :
keyword
: celui-ci correspond au terme recherché,operator
: celui-ci correspond à l'opérateur appliqué, deux choix sont possibles :
startswith
: le label commence par le keyword
,contains
: le label contient le keyword
.?orderBy
)Il est possible de spécifier l'ordre dans lequel les résultats doivent être retournés.
/api/v1/families/IUSER/enumerates/us_rolesorigin.json?sortBy=none
Les valeurs possibles pour orderBy
sont :
none
(tri par défaut)key
trie les énumérés par ordre alphabétique de leur clé
ce tri ne tient pas compte de la locale de l'utilisateur. C'est un tri alphabétique non naturel.
label
trie les énumérés par ordre alphabétique de leur label.
ce tri tient compte de la locale de l'utilisateur.
Cette collection décrit les fichiers temporaires de Dynacase.
L'url d'accès est : /api/v1/temporaryFiles/
La collection files implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
/api/v1/temporaryFiles/ |
N/A |
POST |
/api/v1/temporaryFiles/ |
Créer un nouveau fichier temporaire |
PUT |
/api/v1/temporaryFiles/ |
N/A |
DELETE |
/api/v1/temporaryFiles/ |
N/A |
POST /api/v1/temporaryFiles/
Ce fichier est temporairement stocké dans le vault. S'il n'est pas associé à un
document, le fichier temporaire est supprimé au bout d'une période définie par
le paramètre applicatif CORE_TMPDIR_MAXAGE
.
Le contenu de la requête contient une variable (type file) contenant le contenu du fichier
-----------------------------70122309720638098951066485136 Content-Disposition: form-data; name="fi_file"; filename="my_file.jpeg" Content-Type: image/jpeg ...
Le type de la requête est application/x-www-form-urlencoded
.
Ce format peut être utilisé directement depuis un formulaire HTML.
L'envoi du fichier peut aussi être fait en javascript via l'objet
FormData
.
var fd = new FormData(); fd.append('myFile', myFile); // myFile objet de type File $.ajax({ type: 'POST', url: "api/v1/temporaryFiles/", processData: false, contentType: false, cache: false, data: fd});
Tous les navigateurs ne supportent
pas l'objet FormData
.
Le retour est une donnée JSON.
La partie data
contient un objet file
:
file.uri
: uri d'accès à la nouvelle ressourcefile.reference
: référence pouvant être utilisant comme valeur
dans un attribut de type file ou image. file.size
: Taille du fichier en octetsfile.fileName
: Nom du fichier (basename)file.mime
: Type mime (système)file.cdate
: Date de créationfile.mdate
: Date de modificationfile.downloadUrl
: Url de téléchargement du fichier{"success" : true, "messages" : [], "data" : { "file" : { cdate: "2016-08-30 11:41:45" downloadUrl: "api/v1/images/recorded/original/8878229557124583290.png" fileName: "une-fourmis-panda-ark.jpg" iconUrl: "api/v1/images/assets/sizes/20/mime-image.png" id: "8878229557124583290" mime: "image/jpeg" reference: "image/jpeg|8878229557124583290|une-fourmis-panda-ark.jpg" size: "102997" thumbnailUrl: "api/v1/images/recorded/sizes/48/8878229557124583290.png" } }, "exceptionMessage" : "", "headers" : [] }
Une fois le fichier ajouté, il peut être associé à un document en indiquant sa
référence dans la valeur d'un attribut de type file
comme tout autre attribut
en utilisant :
C'est la propriété reference
qui doit être affectée à la valeur de l'attribut
fichier.
Cette collection décrit l'accès aux fichiers contenu dans les documents.
L'url d'accès est : api/v1/documents/<documentId>/files/<attrid>/<index>
La collection files implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/documents/<documentId>/files/<attrid> |
Télécharge un fichier d'un attribut de type file ou image |
POST |
api/v1/temporaryFiles/ |
N/A |
PUT |
api/v1/temporaryFiles/ |
N/A |
DELETE |
api/v1/temporaryFiles/ |
N/A |
Téléchargement d'un fichier contenu dans un attribut de type file
ou image
. :
GET api/v1/documents/<documentId>/files/<attrid>
Pour des attributs inclus dans un tableau, l'index indique le rang dans le tableau
GET api/v1/documents/<documentId>/files/<attrid>/<index>
Téléchargement du fichier associé à l'attribut <attrid>
du document <documentId>
.
L'index <index>
facultatif vaut -1
pour les attributs fichiers non contenu
dans un tableau.
Dans le cas, d'un attribut inclus dans un tableau, l'index contient le rang dans le tableau de fichier. 0 indique la première rangée.
Si l'index n'est pas indiqué pour un attribut inclus dans un tableau, alors l'ensemble des fichiers sera téléchargé dans une archive "zip". Les fichiers sont alors numérotés suivant l'ordre du tableau.
Ce fichier est extrait du vault.
De manière optionnelle, le nom du fichier peut être indiqué après l'index pour préciser le fichier mais ce nom n'est pas utilisé pour récupérer le fichier.
Pour accéder au fichier, le droit view
sur le document est vérifié. De plus,
si l'attribut est en visibilité "I" alors le téléchargement du fichier ne sera
pas autorisé.
Le retour est le contenu du fichier.
En cas d'échec, une structure JSON est
retournée avec l'erreur si aucune extension n'est indiquée dans l'url. Si une
extension (différente de json
) est indiquée alors l'erreur affiché sera un
texte brut.
Les raisons d'échecs spécifiques à cette requête sont
Raison | Status HTTP | Error Code |
---|---|---|
Document non trouvé | 404 | CRUD0200 |
Privilège insuffisant pour accéder au document | 403 | CRUD0201 |
Document supprimé | 404 | CRUD0219 |
Propriété demandée inexistante | 400 | CRUD0202 |
Attribut demandé inexistant | 400 | CRUD0605 |
Visibilité "I" sur l'attribut | 403 | CRUD0606 |
Attribut n'est pas de type file ou image | 400 | CRUD0614 |
Erreur dans l'index | 400 | CRUD0610 |
Erreur dans l'index | 400 | CRUD0611 |
Erreur dans l'index | 400 | CRUD0612 |
Pas de fichier enregistré | 404 | CRUD0607 |
Erreur sur la valeur de l'attribut | 400 | CRUD0608 |
Fichier non référencé dans le coffre | 400 | CRUD0609 |
Le paramètre inline
permet de modifier l'entête HTTP pour demander au
navigateur un téléchargement de fichier ou un affichage dans le navigateur dans
le cas où celui-ci permet son affichage.
Par défaut, le téléchargement est demandé. L'entête contient
Content-Disposition: attachment
Si inline
vaut "true", "1" ou "yes", la disposition vaut :
Content-Disposition: inline
Récupération des informations sur l'attribut my_file
du document 41429
.
GET /tmp/api/v1/documents/41429?fields=document.attributes.my_file
Réponse :
{ "success": true, "messages": [], "data": { "document": { "attributes": { "my_file": { "size": "459285", "creationDate": "2016-05-09 09:11:58", "fileName": "web api.pdf", "url": "api/v1/documents/41429/files/my_file/-1/web%20api.pdf", "mime": "application/pdf", "icon": "api/v1/images/assets/sizes/20x20c/mime-pdf.png", "value": "application/pdf|4090445749180739423|web api.pdf", "displayValue": "web api.pdf" } }, "uri": "/tmp/api/v1/documents/41429.json" } } }
La réponse de la consultation d'un document contient l'url de téléchargement
(dans la propriété url
) de l'attribut.
Téléchargement :
GET http://localhost/tmp/api/v1/documents/41429/files/my_file
ou avec le nom du fichier en option et pour un affichage web:
GET http://localhost/tmp/api/v1/documents/41429/files/my_file/-1/web%20api.pdf?inline=1
Cette collection décrit l'accès aux images publiques notamment les icônes.
Pour les images enregistrées sur le serveur, l'url d'accès est :
api/v1/images/assets/original/<fileName>
Pour les images enregistrées dans le coffre
api/v1/images/recorded/original/<vaultIddentifier>
La collection images implémente les éléments suivants :
Action | URL | Action effectuée |
---|---|---|
GET |
api/v1/images/assets/original/<fileName> |
Télécharge l'image |
GET |
api/v1/images/recorded/original/<vaultId> |
[Télécharge l'image libre identifié par |
GET |
api/v1/images/assets/sizes/<size>/<fileName> |
Télécharge l'image redimensionnée |
GET |
api/v1/images/recorded/sizes/<size>/<vaultId> |
Télécharge l'image libre redimensionnée identifié par |
POST |
api/v1/images/* |
N/A |
PUT |
api/v1/images/* |
N/A |
DELETE |
api/v1/images/* |
N/A |
Téléchargement d'un fichier image contenu dans le répertoire Images
ou dans le
coffre en accès public.
Pour les images enregistrées sur le serveur, l'url d'accès est :
api/v1/images/assets/original/<fileName>
Cette ressource télécharge le fichier image contenu dans le répertoire Images
du serveur. Le nom du fichier <fileName>
est le chemin relatif du fichier à
télécharger. Le chemin est relatif au répertoire Ìmages
du serveur. Le chemin
ne peut pas contenir ..
.
Les extensions de fichiers autorisées sont png
, jpg
, jpeg
et gif
.
Exemple :
Pour les images enregistrées dans le coffre
api/v1/images/recorded/original/<vaultIdentifier>
api/v1/images/recorded/original/<vaultIdentifier>.<extension>
Depuis l'interface de consultation d'un document famille, d'un dossier ou d'une recherche, il est possible de modifier l'icône de celle-ci. Dans ce cas, l'image est enregistrée dans le coffre en accès public c'est à dire sans nécessité de vérifier un contrôle sur le document. L'identifiant utilisée doit correspondre à un identifiant d'une image. Si l'identifiant indique un autre type de fichier, le téléchargement ne sera pas autorisé.
L'extension du fichier est facultative. Si elle est présente elle doit correspondre à l'extension du fichier enregistré dans le coffre.
L'identifiant du coffre peut être obtenu par la récupération des informations sur la propriété "icon" du document (ici n°66518).
GET http://localhost/tmp/api/v1/documents/66518?fields=document.properties
Réponse :
{ "success": true, "messages": [], "data": { "document": { "properties": { "id": 66518, "title": "Les ondes gravitationnelles", "icon": "api/v1/images/recorded/sizes/24x24c/3865333998465762597.png", "initid": 66518, "name": null, "revision": 0 }, "uri": "/tmp32/api/v1/documents/66518.json" } } }
L'url indiquée dans la caractéristique "icon" est l'image redimensionnée. L'url de l'image original est :
api/v1/images/recorded/original/3865333998465762597.png
Le retour est le contenu du fichier. En cas d'échec, une structure JSON est
retournée avec l'erreur si aucune extension n'est indiquée dans l'url. Si une
extension (différente de json
) est indiquée alors l'erreur affiché sera un
texte brut.
Le paramètre inline
permet de modifier l'entête HTTP pour demander au
navigateur un téléchargement de fichier ou un affichage dans le navigateur dans
le cas où celui-ci permet son affichage.
Par défaut, le téléchargement est demandé. L'entête contient
Content-Disposition: attachment
Si inline
vaut "true", "1" ou "yes", la disposition vaut :
Content-Disposition: inline
Récupération des informations sur la propriété "icon" du document 66518
.
GET http://localhost/tmp/api/v1/documents/66518?fields=document.properties
Réponse :
{ "success": true, "messages": [], "data": { "document": { "properties": { "id": 66518, "title": "Panda", "icon": "api/v1/images/recorded/sizes/24x24c/3865333998465762597.png", "initid": 66518, "name": null, "revision": 0 }, "uri": "/tmp32/api/v1/documents/66518.json" } } }
La réponse de la consultation d'un document contient l'url de téléchargement
(dans la propriété url
) de l'attribut.
Téléchargement de l'icône "mime-pdf.png" associée au type mime "application/pdf":
GET http://localhost/tmp/api/v1/images/assets/original/mime-pdf.png
Téléchargement de l'original d'une icône enregistrée dans le coffre
GET http://localhost/tmp/api/v1/images/recorded/original/3865333998465762597.jpg
Téléchargement d'une image redimensionnée.
Le redimensionnement ne peux excéder la taille de l'image originale.
Pour les images enregistrées sur le serveur, l'url d'accès est :
api/v1/images/assets/sizes/<sizes>/<fileName>
Cette ressource télécharge l'image redimensionnée du fichier image original
contenu dans le répertoire Images
du serveur. Le nom du fichier <fileName>
est le chemin relatif du fichier à télécharger. Le chemin est relatif au
répertoire Ìmages
du serveur. Le chemin ne peut pas contenir ..
.
Les extensions de fichiers autorisées sont png
, jpg
, jpeg
et gif
.
Le type du fichier retourné est le même que celui de l'original.
Exemple :
Pour les images publiques enregistrées dans le coffre
api/v1/images/recorded/sizes/<sizes>/<vaultIdentifier>.<extension>
L'extension du fichier est obligatoire. Les valeurs autorisées sont png
, jpg
et gif
.
Le fichier retourné correspond à l'image originale redimensionnée et convertie en fonction de l'extension.
Redimensionnement d'une image incluse dans un attribut "image" d'un document.
api/v1/documents/<documentId>/images/<attributeId>/<index>/sizes/<size>.<extension>
Paramètres :
<documentId>
: Identifiant du document<attributeId>
: Identifiant de l'attribut image<index>
: Vaut -1
si l'attribut n'est pas dans un tableau,
indique la rangée du tableau dans le cas contraire (0 indique la première rangée).<size>
: La taille demandée<extension>
: Extension du fichier produitL'extension du fichier est obligatoire. Les valeurs autorisées sont png
, jpg
et gif
.
Le fichier retourné correspond à l'image originale redimensionnée et convertie en fonction de l'extension.
Cette url est notamment utilisée pour afficher les miniatures (thumbnail) des attributs images.
Exemple : informations sur l'attribut image "es_photo" du document n°66518.
GET api/v1/documents/66518?fields=document.attributes.es_photo
{ "success": true, "messages": [], "data": { "document": { "attributes": { "es_photo": { "thumbnail": "api/v1/documents/66518/images/es_photo/-1/sizes/48.png", "size": "317762", "creationDate": "2016-08-29 08:24:05", "fileName": "panda-bambou-alimentation.jpg", "url": "api/v1/documents/66518/files/es_photo/-1/panda-bambou-alimentation.jpg", "mime": "image/jpeg", "icon": "api/v1/images/assets/sizes/24x24c/mime-image.png", "value": "image/jpeg|7168768396445052131|panda-bambou-alimentation.jpg", "displayValue": "panda-bambou-alimentation.jpg" } }, "uri": "/tmp/api/v1/documents/66518.json" } } }
Cas particulier, l’icône du document peut être adressée avec cette url en utilisant
comme nom d'attribut icon
.
GET api/v1/documents/66518/images/icon/-1/sizes/48x48c.png
Cela permet notamment d'accéder à des icônes qui ne serait pas publiques. Cela est le cas pour les documents qui ont des icônes spécifiques en fonction des attributs images.
Le paramètre <size>
permet d'indiquer la nouvelle taille avec la syntaxe suivante :
Soit l'image originale :
GET api/v1/images/assets/original/sky.jpg
Figure 1. Image de référence (600x338px)
<width>
indique la largeur (en pixel)La hauteur est calculée pour garder la proportion de l'image.
GET api/v1/images/assets/sizes/200/sky.jpg
Figure 2. Image 200x113px
x<height>
indique la hauteur (en pixel)La largeur est calculée pour garder la proportion de l'image.
GET api/v1/images/assets/sizes/x200/sky.jpg
Figure 3. Image 355x200px
<width>x<height>
L'image est redimensionnée pour contenir dans la dimension indiquée tout en gardant sa proportion.
GET api/v1/images/assets/sizes/200x200/sky.jpg
Figure 4. Image 200x113px
GET api/v1/images/assets/sizes/200x100/sky.jpg
Figure 5. Image 178x100px
<width>x<height>c
Pour que l'image contienne dans les exactes dimensions fournies, cette option permet de rogner (crop) l'image. Ce rognage est centré, les bords (haut / bas) ou (droite /gauche) sont supprimés avec la même proportion.
GET api/v1/images/assets/sizes/50x200c/sky.jpg
Figure 6. Image 50x200px
GET api/v1/images/assets/sizes/200x50c/sky.jpg
Figure 7. Image 200x50px
<width>x<height>s
L'image est déformée (strech) pour contenir dans la dimension indiquée.
GET api/v1/images/assets/sizes/50x200s/sky.jpg
Figure 8. Image 50x200px
GET api/v1/images/assets/sizes/200x50s/sky.jpg
Figure 9. Image 200x50px
Le retour est le contenu du fichier. En cas d'échec, une structure JSON est
retournée avec l'erreur si aucune extension n'est indiquée dans l'url. Si une
extension (différente de json
) est indiquée alors l'erreur affiché sera un
texte brut.
Le paramètre inline
permet de modifier l'entête HTTP pour demander au
navigateur un téléchargement de fichier ou un affichage dans le navigateur dans
le cas où celui-ci permet son affichage.
Par défaut, le téléchargement est demandé. L'entête contient
Content-Disposition: attachment
Si inline
vaut "true", "1" ou "yes", la disposition vaut :
Content-Disposition: inline
Ce chapitre contient les éléments de paramétrage avancé permettant de mieux comprendre le fonctionnement de l'API REST et de le customiser.
Il est possible à un module d'étendre l'API REST pour ajouter de nouvelles ressources ou surcharger les ressources existantes.
L'extension de l'API REST passe par deux éléments :
Les classes de CRUD étendent la classe abstraite \Dcp\HttpApi\V1\Crud\Crud
et
doivent implémenter les méthodes suivantes :
create
: création d'une ressource,read
: récupération d'une ressource,update
: mise à jour d'une ressource,delete
: suppression d'une ressource.Chacune de ces méthodes doit retourner la réponse. Si le type retourné est json
le retour doit être un tableau ou un objet implémentant l'interface JsonSerializable.
Dans le cas d'une réponse HTML le résultat doit être une chaîne de caractères contenant le code html de la page.
L'attribut urlParameters
contient le résultat de l'interprétation de l'expression
régulière définie dans la route.
Exemple : pour la route
"regExp" : "%^/documents/(?P<identifier>[^/]+)/locks/(?P<lockType>(temporary|permanent))$%",
L'url api/v1/documents/35699/locks/temporary
retourne le résultat
$this->urlParameter : Array ( [0] => /documents/35699/locks/temporary [identifier] => 35699 [1] => 35699 [lockType] => temporary [2] => temporary [3] => temporary )
L'attribut contentParameters
contient les données soumises par la requête
sous la forme d'un tableau indexé.
L'extraction des contentParameters
varie suivant le type de requête :
GET
: le contentParameters
est le contenu du $_GET
,POST
: le contentParameters
est :
header
content-type
est application/json
: le contenu est le php://input
,header
content-type
est x-www-form-urlencoded
ou form-data
: le contenu est le $_POST
,PUT
: le contentParameters
est :
header
content-type
est application/json
: le contenu est le php://input
,header
content-type
est x-www-form-urlencoded
ou form-data
: le contenu est le php://input
form décodé,DELETE
: le contentParameters
est un array vide.La méthode ::addMessage(RecordReturnMessage $message)
permet d'ajouter un message.
Cette méthode permet d'ajouter un message dans la donnée renvoyée si le type retourné est du json. Si le type est html, seuls les messages d'erreur sont pris en compte. Dans ce cas le retour se fait par une page html contenant le message d'erreur.
La classe Dcp\HttpApi\V1\Api\RecordReturnMessage
est une classe de description
de message, elle contient les attributs publics suivants :
string $type = self::MESSAGE; // Type de message ::ERROR, ::WARNING, ::INFO, ::NOTICE, ::DEBUG string $contentText = ''; // Texte brut string $contentHtml = ''; // Texte formaté (doit être échappé) string $code = ''; // Code - Utilisé pour les codes erreurs string $uri = ''; // Url - pour indiquer une page par exemple mixed $data = null; // autres données -
Exemple :
use Dcp\HttpApi\V1\Api\RecordReturnMessage; // Message text simple $message1=new RecordReturnMessage(); $message1->contentText=sprintf("Hello"); // Avertissement texte formaté $message2=new RecordReturnMessage(); $message2->contentHtml=sprintf("<b>Attention</b>"); $message2->type=RecordReturnMessage::WARNING;
{ "success":true, "messages":[ {"type":"message","contentText":"Hello world"}, {"type":"notice","contentText":"This is a lock request"}], "data":{ "uri":"\/api\/v1\/documents\/35699\/locks\/permanent", "lock":null} }
La classe fournit aussi quelques autres méthodes surchargeables :
setUrlParameters
: cette méthode reçoit les paramètres extraits par le
routeur de l'url d'appel (voir enregistrement CRUD), ces paramètres
sont ensuite mis à disposition dans l'attribut urlParameters
de type tableau de la classe,
setContentParameters
: cette méthode reçoit les paramètres extraits par le
routeur du contenu de la requête, ces paramètres sont ensuite mis à disposition
dans l'attribut contentParameters
de type tableau de la classe,
execute
: cette méthode est celle qui est exécutée par le routeur une fois
la classe CRUD identifiée,
getEtagInfo
: cette méthode est utilisée pour calculer un etag dans le cadre
de la gestion du cache.
La nouvelle route de CRUD doit ensuite être enregistrée auprès de l'application
HTTPAPI_V1
, ceci se fait via l'ajout d'un fichier json
dans le répertoire
HTTPAPI_V1/rules.d/
.
Ce paramètre doit contenir un tableau encodé en JSON semblable à :
[ { "order" : 300, "class" : "\\Dcp\\HttpApi\\V1\\Crud\\Document", "regExp" : "%^/documents/?(?P<identifier>[^/]+)$%", "description" : "Documents <documentId>", "canonicalURL" : "documents/<documentId>" }, { "order" : 100, "class" : "\\Dcp\\HttpApi\\V1\\Crud\\DocumentCollection", "regExp" : "%^/documents/$%", "description" : "List of all the documents", "canonicalURL" : "documents/" }, { "order" : 100, "class" : "\\Dcp\\HttpApi\\V1\\Crud\\Family", "regExp" : "%^/families/(?P<identifier>[^/]+)$%", "description" : "Family <familyId>", "canonicalURL" : "families/<familyId>" }, { "order" : 100, "class" : "\\Dcp\\HttpApi\\V1\\Crud\\ImageAsset", "regExp" : "%^/images/assets/sizes/(?P<size>[0-9x]+[cfs]?)/(?P<identifier>.+)$%", "description" : "Download resized file image", "canonicalURL" : "images/assets/sizes/<width>x<height>/<fileImageName>", "standalone" : true, "acceptExtensions" : ["jpg","jpeg","png","gif"] } ]
Ce tableau contient des objets contenant chacun :
regExp
: une expression régulière, celle-ci est exécutée sur l'URL d'appel
(sans la partie api/v1/
) si l'expression régulière est validée la route est
considérée comme valide,
order
: un ordre d'exécution si plusieurs routes de même ordre sont valides,
c'est celle ayant l'ordre le plus élevé qui est sélectionnée,
class
: identifiant d'une classe de type CRUD
qui est exécutée si la route
est sélectionnée,
description
(optionnel) : chaîne de caractères non traduites décrivant la
ressource (cette clef est utilisée dans la page par défaut de l'API),
canonicalURL
(optionnel) : URL d'accès à la ressources (cette clef est
utilisée dans la page par défaut de l'API).
standalone
(optionnel) : (booléen) Si la valeur est vrai, l'authentification
n'est pas vérifiée et l'initialisation du contexte Dynacase n'est pas réalisée.
Par défaut, la valeur est faux. La méthode utilisée doit être autonome en terme
de contrôle d'accès et de traitement.
acceptExtensions
(optionnel) : Liste (tableau) indiquant les extensions autorisées.
Par défaut seul l'extension ".json" et ".html" sont autorisées. Il faut dans ce
cas que la méthode indique elle-même le Content-type
dans le header HTTP.
acl
(optionnel) : Indique le droit applicatif nécessaire pour accéder à la route.
Si l'objet {application, acl}
est fourni alors ce droit est vérifié pour
chacune des méthodes HTTP.
Pour indiquer des droits différents par méthode, il faut utiliser la notation
par méthode.
Si aucun droit n'est indiqué, alors seul le droit sur la méthode est
vérifié. Par contre, si un droit est indiqué, seul ce droit est vérifié.
{"GET": {"application":"MYAPP", "acl":"MYGETACL"}, "PUT": {"application":"MYAPP", "acl":"MYPUTACL"}, "POST": {"application":"MYAPP", "acl":"MYPOSTACL"}, "DELETE": {"application":"MYAPP", "acl":"MYDELETEACL"}, }
Si une route à égalité est ajoutée
avec une route system
(regexp positive et order égal), alors c'est la route
custom
qui est sélectionnée. Cela permet de surcharger les routes
systèmes.
Une fois le fichier ajouté sur le serveur, la compilation des règles doit être
réalisée en exécutant l'action INIT_RULES
de l'application HTTAPI_V1
.
?app=HTTPAPI_V1&action=INIT_RULES
,./wsh.php --app=HTTPAPI_V1 --action=INIT_RULES
.Les middlewares permettent de modifier le comportement d'une route enregistrée. Un middleware permet d'exécuter un code spécifique avant ou après l'éxécution du code de la route.
Les middlewares exécutés avant le code de la route ne peuvent pas modifier les données retournés par la route. Ils peuvent ajouter des messages ou modifier les entêtes HTTP de la réponse.
Les middlewares exécutés après le code de la route peuvent en plus modifier les données retournées.
Le principe d'enregistrement d'un middleware est identique à celui de l'enregistrement d'une route.
La différence est que le fichier json
de description doit être placé dans le répertoire
HTTPAPI_V1/rules.d/middleware.d
.
[ { "order" : 300, "process": "before" "class" : "\\My\\Message", "regExp" : "%^/documents/?(?P<identifier>[^/\\.]+)%", "description" : "Add message", "canonicalURL" : "documents/<documentId>" }, { "order" : 100, "process": "after" "class" : "\\My\\SayHello", "regExp" : "%^/documents/?(?P<identifier>[^/\\.]+)$%", "description" : "Say Hello World", "canonicalURL" : "documents/" }, { "order" : 1000, "process": "before" "class" : "\\My\\Always", "regExp" : "%%", "description" : "Always do process", "canonicalURL" : "*" } ]
La clef process
doit être indiquée. La valeur before
indique que le middleware
est exécuté avant la route. La valeur after
indique que le middleware
est exécuté après la route.
Tous les middlewares dont la rexExp
correspond à l'url sont exécutés.
L'ordre est donné par la clef order
. L'ordre d'exécution est du plus grand au
plus petit.
Les middlewares exécutés pour une requête sont indiqués dans les headers de la
réponse http avec le mot-clef "X-Dcp-Middleware
".
La description du middleware est utilisé comme valeur de cet header.
La clef class
indique la classe de middleware qui doit être exécutée.
Cette classe doit hériter de la classe Dcp\HttpApi\V1\Crud\MiddleWare
.
Suivant la méthode de la requête http, les méthodes suivantes sont exécutées :
HTTP Method | Middleware method |
---|---|
GET | void ::read($identifier) |
POST | void ::create() |
PUT | void ::update($identifier) |
DELETE | void ::delete($identifier) |
La variable $identifier
correspond à la valeur du paramètre "identifier
" présent dans l'expression régulière (regexp
) de la déclaration. Le retour de ces méthodes n'est pas utilisé.
La classe de Middleware dispose de 2 méthodes pour consulter les informations sur la requête et pour manipuler la réponse.
La méthode getHttpRequest()
retourne un objet Dcp\HttpApi\V1\Api\HttpRequest
.
Cet objet permet d'accéder aux éléments de la requête reçue.
La méthode getHttpResponse()
retourne un objet Dcp\HttpApi\V1\Api\HttpResponse
.
Cet objet permet d'accéder aux éléments de la réponse en cours et permet la modification de celle-ci.
Méthodes d'accès : (getter)
mixed getBody()
: retourne les données (partie data
)à envoyermixed getResponse()
: retourne les données personnalisées à envoyer (retourne la valeur donnée par setResponse()).string getStatusHeader()
: retourne le statut http à envoyerstring[] getHeaders()
: retourne la liste des headers http à envoyerRecordReturnMessage getMessages()
: retourne la liste des messages à envoyerMéthodes de modification : (setter)
addMessage(RecordReturnMessage $message)
: ajouter un messages
setStatusHeader($httpStatusHeader)
: modifier le status HTTPaddHeader($key, $value, $replace = true)
: ajouter un header httpsetBody($data)
: modifie les données (partie data
de la réponse) à renvoyersetResponse($response)
: modifie la réponse complète - Écrase la partie data
.sendResponse()
: donne l'ordre d'envoi de la réponse, les traitements suivants
(autres middlewares ou code principal) sont ignorés.L'objet retourné par la méthode ::getHttpResponse()
est le même pour tous les middlewares.
Le middleware suivant accède à la réponse du middleware précédent.
Attention : l'appel de la route principale écrase les éventuelles affectations
effectuées par les middlewares "before" au moyen des méthodes setBody
, setResponse
et setStatusHeader
.
Lorsque le contenu est de la donnée json
, les méthodes getBody
et setBody
manipulent la partie data
fournie par les méthodes CRUD.
Pour retourner des données personnalisées, il faut utiliser la méthode setResponse()
.
Lorsque cette méthode est utilisée, les messages et la partie data
ne sont pas transmises
dans le message. Pour les inclure, il faut explicitement les ajouter.
$httpResponse->setResponse([ "data"=>$httpResponse->getBody(), "messages"=>$httpResponse->getMessages(), "myCustom"=> $myCustomValues ]);
Lorsque le contenu est du HTML, ces méthodes manipulent directement la chaîne de caractères correspondant au code HTML.
Ajout d'un message dans un middleware "before".
namespace My; use Dcp\HttpApi\V1\Crud\MiddleWare; use Dcp\HttpApi\V1\DocManager\DocManager as DocManager; use Dcp\HttpApi\V1\Api\RecordReturnMessage; class Message extends MiddleWare { public function read($resourceId) { $document=DocManager::getDocument($resourceId); if ($document) { $message=new RecordReturnMessage(); $message->contentText=sprintf("Loading %s - %s", $document->getTitle(), date("Y-m-d")); $this->getHttpResponse()->addMessage($message); } } }
Ajout d'un champ "myCustom" dans la réponse d'un middleware "after".
namespace My; use Dcp\HttpApi\V1\Crud\MiddleWare; use Dcp\HttpApi\V1\DocManager\DocManager as DocManager; use Dcp\HttpApi\V1\Api\RecordReturnMessage; class SayHello extends MiddleWare { public function read($resourceId) { $document=DocManager::getDocument($resourceId); if ($document) { $httpResponse=$this->getHttpResponse(); $response=$httpResponse->getBody(); if (is_array($response)) { $response["myCustom"] = "Hello world"; $httpResponse->setBody($response); } } } }
Le retour sera de la forme :
{ "success":true, "messages":[ {"type":"message", "contentText":"Loading Testing - 2017-03-15"}], "data":{ "uri":"\/api\/v1\/documents\/35699\/locks\/permanent", "lock":null, "myCustom":"Hello world"} } }
Construction d'une réponse personnalisée "myCustom" dans la réponse d'un middleware "after".
namespace My; use Dcp\HttpApi\V1\Crud\MiddleWare; use Dcp\HttpApi\V1\DocManager\DocManager as DocManager; use Dcp\HttpApi\V1\Api\RecordReturnMessage; class SayCustomHello extends MiddleWare { public function read($resourceId) { $document=DocManager::getDocument($resourceId); if ($document) { $httpResponse=$this->getHttpResponse(); $body=$httpResponse->getBody(); if (is_array($body)) { $response["myCustom"] = "Hello world"; $response["myData"] = $body; $httpResponse->setResponse($response); } } } }
Le retour sera de la forme :
{ "myCustom":"Hello world", "myData":{ "uri":"\/api\/v1\/documents\/35699\/locks\/permanent", "lock":null} } }
L'API REST possède un système de logging permettant de logger les cas d'erreur (accès à des ressources inexistantes, erreur PHP, erreur documentaire, etc.)
Par défaut le système de log utilise la classe de log de Dynacase et les logs sont enregistrés à chaque erreur et envoyés dans syslog.
Il est possible d'ajouter un système de log tiers (mail, outil de supervision, etc.) Il y a deux étapes à suivre :
Il faut réer une classe qui hérite de classe abstraite de log de l'API \Dcp\HttpApi\V1\Logger\Logger
.
Ci-dessous un exemple avec une classe (fournie en standard par l'API mais non activée par défaut) qui log les erreurs dans error.log de Apache.
<?php
namespace Dcp\HttpApi\V1\Logger;
class ErrorLog extends Logger {
public function writeError($message, $context = null, $stack = null) { if ($context === null && \Doc::getUserId()) { $context = "User : " . $this->getUserInfo(); } $stack = preg_replace('!\s+!', ' ', $stack); $logMessage = sprintf("Error : ## Message : %s ## Context : %s ## Stack : %s", $message, $context, $stack); error_log($logMessage); }
public function writeMessage($message, $context) {
}
public function writeWarning($message, $context = null, $stack = null) { if ($context === null && \Doc::getUserId()) { $context = "User : " . $this->getUserInfo(); } $stack = preg_replace('!\s+!', ' ', $stack); $logMessage = sprintf("Warning : ## Message : %s ## Context : %s ## Stack : %s", $message, $context, $stack); error_log($logMessage); }
protected function getUserInfo() { return \Doc::getUserId() . " " . \Doc::getUserName(); } }
La classe ci-dessus log les erreurs de type Warning
et Erreur
et ignore les Message
.
La nouvelle classe de log doit ensuite être enregistrée auprès de l'application HTTPAPI_V1
, ceci se fait via le
paramètre applicatif CUSTOM_LOGGER
.
Celui doit contenir un array json listant les classes de log que vous souhaitez ajouter, celle-ci seront initialisées lors d'une requête auprès de l'API et les messages seront envoyés si besoin.
Par exemple, pour enregistrer la classe ci-dessus, il faut ajouter le JSON suivant :
["\\Dcp\\HttpApi\\V1\\Logger\\ErrorLog"]
L'API inclut un système de cache par etag.
Les etag sont une partie du standard HTTP 1.1 et permettent de ne pas recalculer les ressources systématiquement.
Le fonctionnement est le suivant :
etag
(via le header ETag
),etag
précédemment reçu (via le header If-None-Match
),etag
et le compare avec le header If-None-Match
reçu :
304 Not Modified
et la ressource n'est pas renvoyée,Le cache n'est bien évidemment actif que pour les ressources accédées via la méthode GET
.
Le cache fait partie du standard HTTP et est implémenté en standard (sans modification à apporter) sur les principaux navigateurs.
Vous pouvez désactiver le cache :
ACTIVATE_CACHE
à false,Cache-Control: no-cache
.L'API est mise à disposition avec un module facultatif permettant de tester des requêtes REST.
Ce paquet se nomme Dynacase HTTP Api v1 : sandbox
, il ajoute l'application HTTPAPI_V1_DEV
et son interface est
accessible via l'url : <contexte>/?app=HTTPAPI_V1_DEV
.
L'interface se présente comme ci-dessous :
Figure 10. Interface sandbox
Elle est séparée en deux parties :
GET
, POST
, PUT
, DELETE
),POST
, PUT
),Ce programme est mis à disposition à des fins pédagogique pour mieux comprendre l'API, son usage en production est à proscrire. La base de documents manipulée via l'application est la base réelle, si vous supprimez, modifiez, créez un document celui-ci est modifié en conséquence.
Ce document est publié sous licence CC http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
Vous êtes libres :
Selon les conditions suivantes :
Manuel de référence
© Anakeen, Anakeen Labs <labs@anakeen.com>
Module API HTTP Core, version 1.0
Édition 3
Publié le 03/08/2018
Ce livre a été produit avec easybook 4.8, logiciel libre et open source développé par Javier Eguiluz à l'aide de différents composants Symfony.