API Idéfix
Mis à jour le 2022-01-26Ce document décrit l'interface de programmation (en anglais, abbrévié API) offerte par le SRAM pour récupérer des fichiers au format Idéfix. Le format de ces documents est lui-même décrit par un schéma XSD.
Cet API permet de demander la production des fichiers ainsi que leur récupération à partir d'un même serveur. L'API se conforme au style d'architecture REST, offrant des ressources à des URLs spécifiques sur un serveur Web et acceptant une série d'actions sur ces ressources. Une familiarité avec ce style d'architecture est recommandé avant la lecture de ce document.
#Hôtes et version
L'interface programmaticale est hébergée au sein du site classer-direct-sram.qc.ca
et est disponible
à partir de l'URL https://classer-direct-sram.qc.ca/v1
. Le préfixe de chemin v1
ici indique
la version de l'API qui se retrouve à cette adresse (1). Tout changement important à l'interface programmaticale
entrainera une augmentation de ce numéro de version, permettant l'existence concurrente de plusieurs versions.
Les chemins d'URLs contenus dans ce document et servant à décrire les diverses ressources pouvant être manipulées assument toutes appartenir à ce serveur.
Le serveur doit être accédé par HTTPS, et donc par le port 443.
#Format
L'API utilise le format de données JSON encodé selon l'encodage de caractères UTF-8, à l'exception des fichiers Idéfix eux-mêmes qui sont des documents au format XML.
À moins qu'il en soit indiqué autrement, le corps des requêtes POST
et PUT
doit
être un objet JSON. Les requêtes de type POST
et
DELETE
ont plutôt leurs paramètres passés dans la
query string.
Un array passé dans une
query string l'est en créant une chaine dont les éléments sont
séparés par des virgules. Par exemple, la chaine AB,CD,EF
dans une
query string correspond,
en JSON à:
["AB", "CD", "EF"]
#Gestion des erreurs
Toutes les méthodes, en plus d’un code de retour HTTP approprié,
retournent, lorsque le Content-Type
est application/json
et qu’une erreur s'est
produite un objet JSON décrivant l'erreur:
{ "code": 1001, "message": "Query string invalide" }
Quand il y a des champs impliqués dans l'erreur, par exemple des paramètres sont invalides,
l'objet retourné pourrait inclure un attribut erreurs
indiquant quels champs sont en erreur:
{ "code": 1001, "message": "Query string invalide", "erreurs": [ { "champ": "session", "code": 1002, "message": "Cette valeur est requise." }, { "champ": "tour", "code": 1002, "message": "Cette valeur doit être un entier entre 1 et 4 ou la chaine 'ls24'." } ] }
#Authentification
L'accès aux fonctions du système requiert qu'une clé d'API soit envoyée avec chaque requête au système. Cette clé est rattachée à un utilisateur, soit une personne ou un système, et reçoit un sous-ensemble des permissions de l'utilisateur. Dans ce cas-ci, la permission d'accéder aux fonctions Idéfix du système Classer-Direct. Les collèges auxquels une clé donne accès sont ceux auxquels l'utilisateur a accès. Chaque clé est une séquence de caractères alphanumériques et d'un seul point, par exemple:
3mB7rdca.WXf2Ny86DJL7zVZB7pbT
Pour des raisons de sécurité, la clé est souvent identifiée uniquement par la partie précédent le point. Par contre, la clé entière doit être fournie au système Classer-Direct afin d'avoir accès à ses fonctions.
La clé est passée au système via l'entête HTTP
Authorization
avec le schème Bearer
. La clé ne doit pas être encodée en
base64
ou tout autre encodage spécial. Pour la clé mentionnée ci-haut, cela donnerait:
Authorization: Bearer 3mB7rdca.WXf2Ny86DJL7zVZB7pbT
Une clé peut être activée et désactivée par l'utilisateur associé à la clé et n'est plus valide dès que les permissions pour cette utilisateur sont retirés par le SRAM. Il est donc préférable d'utiliser une clé pour chaque utilisateur du programme effectuant l'accès aux fichiers Idéfix, plutôt qu'une clé par application et ce, même si la précédente version du système utilisait un utilisateur SRAM par collège dont le nom et le mot de passe était partagé par tous les utilisateurs effectifs du système. Dans le cas où cela s'avèrerait techniquement impossible, le SRAM permet aussi l'emploi d'un utilisateur par collège. Dans tous les cas, le client travaillant dans un collège devrait être celui qui a accès à la clé d'API, l'entrant à un endroit approprié dans l'application, plutôt que le développeur de l'application. La gestion de la clé d'API se fait par l'entremise du site Voute et sa création initiale requiert une demande d'accès au SRAM.
#Limites de rythme
Pour l'instant, le SRAM n'impose aucune limite explicite sur le nombre de requêtes pouvant être effectuées
dans une période donnée. Il se réserve cependant le droit d'imposer une telle limite sans préavis. Dans quel
cas, les requêtes retourneraient le code HTTP
429 Too Many Requests
.
Afin d'éviter l'imposition de telles limites, cependant, nous vous demandons de vous limiter à au plus une
requête par seconde par client (ex.: par cégep ou par poste de travail). De plus, puisque la génération de
fichiers peut prendre jusqu'à plusieurs minutes, vous ne devriez pas appeler la
ressource pour le contenu d'un fichier moins de 10 secondes après avoir obtenu
le code 404 Not Found
ou 450
pour cette exacte ressource.
#Principe général
Le système reçoit des requêtes de génération de fichiers Idéfix. Une requête peut ne générer aucun fichier, en générer un seul ou en générer plusieurs. Ces requêtes sont ajoutées au système immédiatement via l'API, mais les fichiers à produire pour une requête donnée sont traités un à la fois par le système. Le programme qui interface via l'API devrait donc minimalement procéder selon les étapes suivantes:
- Demander l'ajout d'une requête de fichiers Idéfix (
POST /v1/idefix
); - Obtenir le détail de la requête ajoutée (
GET /v1/idefix/{id_requete}
); - Pour chaque fichier à générer pour la requête:
- Demander le contenu du fichier (
GET /v1/idefix/{id_requete}/fichiers/{id_fichier}/contenu
); - Si code de la réponse est
200
, le corps de la réponse sera le fichier Idéfix produit et le programme peut passer au prochain fichier; - Sinon, attendre au moins 10 secondes;
- Répéter la demande de contenu.
- Demander le contenu du fichier (
Les requêtes et les fichiers périmés n'ont pas besoin d'être explicitement supprimés par l'appelant; ceux-ci sont automatiquement retirés après un certain temps.
#Actions
Verbe | Chemin | Action |
---|---|---|
GET | /v1/idefix | Lister les requêtes |
POST | /v1/idefix | Ajouter une requête |
GET | /v1/idefix/{id_requete} | Obtenir le détail d'une requête |
GET | /v1/idefix/{id_requete} /fichiers | Lister les fichiers produits par une requête |
GET | /v1/idefix/{id_requete} /fichiers/{id_fichier} | Obtenir le détail d'un fichier à produire |
GET | /v1/idefix/{id_requete} /fichiers/{id_fichier} /contenu | Obtenir le contenu d'un fichier |
#Lister les requêtes
application/json
Description:
Retourne les requêtes de fichiers Idéfix demandées par l'utilisateur associé à la clé d'API utilisée. Les requêtes peuvent être filtrées par les paramètres ayant été spécifié lors de leur ajout au système.
Les requêtes désuettes qui ont été retirées par le système ne sont pas listées et aucune pagination n'est offerte.Paramètres (query string):
colleges |
type: array de strings
optionnel
Les codes des collèges auxquels limiter les résultats. |
session |
type: string
optionnel
L'année-session, sous forme numérique (ex.: |
tour |
type: integer ou string
optionnel
Le tour (1 à 4) auquel limiter les résultats ou la chaine |
typeAdmission |
type: string
optionnel
Le type d'admission ("REG", "INT", "FCO") auquel limiter les résultats. |
Résultat:
Un array d'objets JSON ayant les attributs suivants:
Attribut | Type | Description |
---|---|---|
id |
integer | L'identifiant unique de la requête. |
href |
string | Un URL pointant vers la ressource de la requête. |
dateHeureAjout |
string | La date et l'heure auxquelles la requête a été ajoutée au système, sous le format AAAA-MM-JJ HH:mm:ss . |
Erreurs:
400
: Les paramètres sont mal formés.
#Ajouter une requête
application/json
Description:
Ajoute une requête de production de fichiers au système. Le système retourne immédiatement la ressource correspondante, mais les fichiers seront produits au fur-et-à-mesure que les ressources seront disponibles pour le faire. Normalement, une requête produira un fichier par collège, session et tour ayant des candidats concernés.
Paramètres (corps):
colleges |
type: array de strings
Les codes des collèges auxquels limiter les fichiers produits. |
groupe |
type: string
optionnel
Le nom du groupe de la formation continue auquel limiter les fichiers. |
nosDaSession |
type: array de strings
optionnel
La liste des numéros de DA session des dossiers à inclure dans les fichiers produits. Aucun numéro ne peut être présent plus d'une fois dans la liste. |
particularite |
type: string
optionnel
Le code de trois caractères (ex.: "PR1") identifiant la particularité à laquelle limiter les fichiers. |
programme |
type: string
optionnel
Le numéro du programme auquel limiter les fichiers. |
session |
type: string
L'année-session, sous forme numérique (ex.: |
tour |
type: integer ou string
optionnel
Le tour (1 à 4) auquel limiter les fichiers produits ou la chaine |
typeAdmission |
type: string
Le type d'admission ("REG", "INT", "FCO") auquel limiter les fichiers. |
Si nosDaSession
est spécifié, colleges
et session
deviennent
optionnels.
Résultat:
Un objet JSON ayant les attributs suivants:
Attribut | Type | Description |
---|---|---|
id |
integer | L'identifiant unique de la requête. |
href |
string | Un URL pointant vers la ressource de la requête. |
dateHeureAjout |
string | La date et l'heure auxquelles la requête a été ajoutée au système, sous le format AAAA-MM-JJ HH:mm:ss . |
typeAdmission |
string | Le type d'admission pour lequel des fichiers sont demandés ("REG", "INT", "FCO"). |
session |
string ou null |
L'année-session, sous forme numérique (ex.: 20223 ), pour laquelle des fichiers sont demandés. |
tour |
integer ou string ou null |
Le tour (1 à 4) pour lequel les fichiers sont demandés ou la chaine "ls24" si la requête a été demandée dans le format LS24 plutôt qu'à un tour donné. |
colleges |
array de strings ou null |
La liste des codes de collèges pour lequels les fichiers sont demandés. |
programme |
string ou null |
Le code du programme pour lequel les fichiers sont demandés. |
groupe |
string ou null |
Le nom du groupe à la formation continue pour lequel les fichiers sont demandés. |
nosDaSession |
array de strings ou null |
La liste des numéros de DA session à inclure dans les fichiers demandés. |
fichiers |
array d'objets | Un sommaire des fichiers à produire. Chaque objet a les attributs suivants:
|
Erreurs:
400
: Les paramètres sont mal formés (sous-code1003
) ou le groupe demandé est introuvable (sous-code1008
).403
: L'utilisateur n'a pas accès aux collèges demandés (sous-code1006
) ou aux fonctions Idéfix.
#Obtenir le détail d'une requête
{id_requete}
application/json
Description:
Retourne le détail complet d'une requête de fichiers Idéfix.
Résultat:
Un objet JSON ayant les mêmes attributs que pour l'ajout d'une requête.
Erreurs:
-
404
: La requête n'existe pas pour cet utilisateur (sous-code1005
). Elle pourrait avoir existé et avoir été retirée par le système. Elle pourrait également appartenir à un autre utilisateur.
#Lister les fichiers produits par une requête
{id_requete}
/fichiersapplication/json
Description:
Retourne la liste des fichiers qui sont à produire pour la requête donnée.
Résultat:
Un array d'objets JSON ayant les attributs suivants:
Attribut | Type | Description |
---|---|---|
id |
integer | L'identifiant unique du fichier. |
href |
string | Un URL pointant vers la ressource du fichier. |
Erreurs:
-
404
: La requête n'existe pas pour cet utilisateur (sous-code1005
). Elle pourrait avoir existé et avoir été retirée par le système. Elle pourrait également appartenir à un autre utilisateur.
#Obtenir le détail d'un fichier à produire
{id_requete}
/fichiers/{id_fichier}
application/json
Description:
Retourne le détail complet d'un fichier à produire.
Résultat:
Un objet JSON ayant les attributs suivants:
Attribut | Type | Description |
---|---|---|
id |
integer | L'identifiant unique du fichier. |
href |
string | Un URL pointant vers la ressource du fichier. |
session |
string | L'année-session contenue dans le fichier sous forme numérique (ex.: 20223 ). |
tour |
integer ou string | Le tour (1 à 4) contenu dans le fichier ou la chaine "ls24" si le fichier a été demandé dans le format LS24 plutôt qu'à un tour donné. |
programme |
string ou null |
Le numéro du programme contenu dans le fichier. |
particularite |
string ou null |
Le code de trois caractères (ex.: "PR1") identifiant la particularité contenue dans le fichier. |
groupe |
string ou null |
Le nom du groupe à la formation continue contenu dans le fichier. |
nosDaSession |
array de strings | La liste des numéros de DA session contenus dans le fichier. |
disponible |
boolean | true si le contenu du fichier est prêt à être récupéré. |
dateHeure |
string | La date et l'heure auxquelles le fichier à commencé à être produit, sous le format AAAA-MM-JJ HH:mm:ss . |
nom |
string | Le nom suggéré pour le fichier. |
Erreurs:
404
: La requête ou le fichier n'existe pas pour cet utilisateur (sous-code1005
).
#Obtenir le contenu d'un fichier
{id_requete}
/fichiers/{id_fichier}
/contenuapplication/xml
text/xml
Description:
Retourne le contenu d'un fichier Idéfix si celui-ci est disponible.
Résultat:
Le contenu du fichier Idéfix. Le contenu n'est pas en JSON, mais est plutôt retourné directement.
Erreurs:
404
: La requête ou le fichier n'existe pas pour cet utilisateur (sous-code1005
) ou le fichier demandé n'est pas disponible (sous-code1007
).450
: Le contenu du fichier demandé n'est pas disponible (sous-code1007
).