17.1 Extension de l'API REST
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 :
- une classe de CRUD : celle-ci fournit les 4 méthodes du CRUD et retourne les valeurs.
- une inscription dans la liste des API existantes.
17.1.1 Classe de CRUD
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
: lecontentParameters
est le contenu du$_GET
, -
POST
: lecontentParameters
est :- si le
header
content-type
estapplication/json
: le contenu est lephp://input
, - si le
header
content-type
estx-www-form-urlencoded
ouform-data
: le contenu est le$_POST
,
- si le
-
PUT
: lecontentParameters
est :- si le
header
content-type
estapplication/json
: le contenu est lephp://input
, - si le
header
content-type
estx-www-form-urlencoded
ouform-data
: le contenu est lephp://input
form décodé,
- si le
-
DELETE
: lecontentParameters
est un array vide.
17.1.2 Messages pour les types json
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;
17.1.2.1 Exemple de message retourné
{ "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} }
17.1.3 Méthodes de la classe Crud
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'attributurlParameters
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'attributcontentParameters
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.
17.1.4 Enregistrement d'une route
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 partieapi/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 typeCRUD
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 leContent-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
.
- soit via l'url suivante connecté en admin :
?app=HTTPAPI_V1&action=INIT_RULES
, - soit via l'appel suivant (dans le info.xml, ou en ligne de commande)
./wsh.php --app=HTTPAPI_V1 --action=INIT_RULES
.