-
Armand Bahi authoredArmand Bahi authored
Services web
1. Définition
Les web services sont la partie back-end de l'application ; ils se composent de plusieurs ressources qui permettent au client d'interroger la base de données, de lire/modifier des fichiers et d'effectuer des opérations sur la machine physique du serveur.
Dans vMap et autres produits Veremes, ils sont mis en place par une API-REST, ce qui signifie que l'on accède aux données selon des règles bien spécifiques.
Exemple de requête permettant de lister les cartes vMap :
https://corbieres/vmap_rest/vmap/maps
Exemple de requête permettant de voir les informations de la carte ayant pour identifiant '15' :
https://corbieres/vmap_rest/vmap/maps/{15}
L''API-REST retourne au client un résultat JSON ou XML contenant les informations demandées :
{
"maps": [
{
"theme_name": "Thème Géobretagne",
"theme_description": "Cartes Géobretagne avec fond OSM",
"crs_name": "[EPSG:2154]-RGF93.Lambert-93",
"map_id": 15,
"crs_id": "EPSG:2154",
"name": "Carte OSM Géobretagne",
"description": "Carte Geobretagne avec un fond osm",
"extent": "140807|6725441|303007|6799494",
"catalog_index": 3,
"thumbnail": "https://corbieres/vmap_ws_data/vitis/vmap_admin_map_vmap_admin_map/documents/15/thumbnail/geobret.png?d=1499068782",
"maptheme_id": 1,
"groups": "",
"groups_label": ""
}
],
"status": 1
}
2. Utilisation
2.1. En-têtes
Il y a divers en-têtes essentiels à l'utilisation des ressources.
2.1.1. Accept
Valeurs possibles :
- application/json
- application/xml
- application/x-vm-json
Définition
L'en-tête détermine le format de réponse demandé par le client. Les formats application/json et application/xml retournent un objet possédant un tableau qui porte le nom de la ressource (dans l'exemple ci-dessus, il s'agit de "maps"). Le format application/x-vm-json diffère en donnant comme nom du tableau "data", permettant de faire des requêtes génériques par le client.
2.1.2. Token
Le token de connexion identifie l'utilisateur de l'application, c'est grâce à lui que la ressource identifie si le demandeur possède les droits suffisants pour avoir un résultat, et c'est par son intermédiaire que se font les connexions à la base de données.
- Pour des raisons de sécurité, il est strictement interdit de passer le token en tant que paramètre dans l'URL. Il faut donc le passer en en-tête
- si une personne malveillante a accès au réseau (man in the middle), elle pourrait alors voir ce token et donc usurper l'identité d'un autre utilisateur.
2.1.3. X-HTTP-Method-Override
Lorsque l'on utilise régulièrement l'API-REST, il est possible que l'on soit confronté à des problèmes de longueur d'URL : à partir d'un certain nombre de caractères, les navigateurs refusent d’exécuter la requête et affichent l'erreur suivante :
414 URI Too Long
Pour pallier à cette contrainte, un en-tête X-HTTP-Method-Override a été mis en place pour envoyer une requête de type POST avec des paramètres figurant dans le body (sans limite de taille) et interprétables comme des requêtes GET :
General
Request Method:POST
Request Headers
X-HTTP-Method-Override: GET
2.2. Paramètres génériques
2.2.1. order_by
Permet de définir l'ordre d'affichage lorsqu'il y a plusieurs données. Par défaut, il vaut l'identifiant de la ressource.
2.2.2. sort_order
Couplé au paramètre "order_by", il permet de définir l'ordre avec les valeurs suivantes :
- asc : ordre ascendant
- desc : ordre descendant
2.2.3. limit
Si le paramètre "limit" est fourni, alors le tableau retourné se limite à "n" éléments.
2.2.4. offset
Souvent couplé avec les paramètres "limit" et "order_by", il peut permettre, par exemple, d'effectuer une pagination sur une liste.
2.2.5. attributs
Définit les attributs qui seront retournés par le client. Pour les renseigner, il faut écrire ces attributs en les séparant par le caractère "|".
2.2.6. distinct
True/false permet de distinguer les valeurs résultantes.
2.2.7. filter
Donne la possibilité à l’utilisateur de filtrer les données. Il faut écrire un objet JSON composé de relations et d'opérateurs.
2.2.7.1. Relations
Les relations définissent le type de condition à utiliser selon la structure JSON suivante :
{
"relation": "AND",
"operators":[{
"..."
}, {
"..."
}]
}
Dans cet exemple, on demande d'ajouter les filtres définis par les opérateurs selon la relation "AND". On peut également utiliser une relation "OR".
Il est aussi possible de faire dans une même requête du "AND" et du "OR" en incorporant une relation comme si c'était un opérateur :
{
"relation": "AND",
"operators":[{
"..."
}, {
"relation": "OR",
"operators": [{
"..."
}, {
"..."
}]
}]
}
Ainsi, on obtient une requête constituée de "AND" et de "OR" (voir l'exemple ci-après).
2.2.7.2. Opérateurs
Plus simples à comprendre, les opérateurs se composent de trois ou quatre arguments :
- column : nom de la colonne sur laquelle appliquer le filtre.
- value : valeur du filtre.
- compare_operator : type de comparaison ("=", "!=", "<>", ">=", "<=", ">", "<", "IN", "NOT IN", "IS NULL", "IS NOT NULL", "LIKE", "INTERSECT").
- compare_operator_options (optionnel) : ajoute des options suivant le type de compare_operator.
La structure est la suivante :
{
"column": "...",
"compare_operator": "...",
"value": "...",
"compare_operator_options": {
"..." : "..."
}
}
2.2.7.3. Exemples
Pour être plus parlant, voici quelques exemples avec leur équivalent sous forme SQL.
En utilisant une relation AND, on peut filtrer sur plusieurs opérateurs :
{
"relation": "AND",
"operators":[{
"column": "auteur",
"compare_operator": "=",
"value": "Laurent"
}, {
"column": "allume",
"compare_operator": "=",
"value": "true"
}, {
"column": "route_id",
"compare_operator": "=",
"value": 10
}]
}
Équivalent SQL
auteur='laurent' AND allume='true' AND route_id=10
Si un seul opérateur est utilisé, alors il n'est pas nécessaire de renseigner de relation :
{
"column":"auteur",
"compare_operator":"=",
"value":"laurent"
}
Équivalent SQL
auteur='laurent'
En utilisant des relations imbriquées, on peut effectuer des filtres complexes :
{
"relation": "AND",
"operators":[{
"column":"auteur",
"compare_operator":"=",
"value":"laurent"
}, {
"relation": "OR",
"operators": [{
"column":"allume",
"compare_operator":"=",
"value":"true"
}, {
"column":"route_id",
"compare_operator":"=",
"value":10
}]
}]
}
Équivalent SQL
auteur='laurent' AND (allume='true' OR route_id=10)
On peut utiliser "compare_operator" = "IN" en utilisant des valeurs situées dans un tableau :
{
"relation": "AND",
"operators":[{
"column":"auteur",
"compare_operator":"=",
"value":"laurent"
}, {
"relation": "OR",
"operators": [{
"column":"allume",
"compare_operator":"=",
"value":"true"
}, {
"column":"route_id",
"compare_operator":"IN",
"value":[5,10]
}]
}]
}
Équivalent SQL
auteur='laurent' AND (allume='true' OR route_id IN (5, 10))
Il est possible d'utiliser "compare_operator" = "LIKE" avec des valeurs suivies ou précédées du caractère "%" :
{
"column":"auteur",
"compare_operator":"LIKE",
"value":"laur%"
}
Équivalent SQL