Dans le cadre du projet Service d’accès aux données de la Vitrine-Recherche (SADVR, 2015-2016), une API REST a été développée par l’équipe du Centre d’expertise numérique pour la recherche (CEN-R) afin de redistribuer les données contenues dans le dépôt Vitrine-Recherche.
L’API REST développée par le CEN-R propose 5 services :
Dans la mesure où l’API fait usage du protocole Hypertext Transfer Protocol (HTTP), son fonctionnement n’est pas sans rappeler celui d’un site Web, à ceci près que les réponses de l’API sont formulées en JavaScript Object Notation (JSON) plutôt qu’en Hypertext Markup Language (HTML). Comme son nom l’indique, le format JSON est un format de données textuelles dérivé de la notation des objets du langage JavaScript. Comme le XML, le JSON permet de représenter de l’information structurée. Bien que le XML puisse être plus explicite quant à certains détails, le JSON reste le moyen le plus simple pour un développeur de traiter les données, tant en PHP qu'en JavaScript.
Nous supposons que l'utilisation du JavaScript inclut toujours celle de la bibliothèque jQuery; cette dernière facilitant les appels AJAX nécessaires à l'utilisation des API REST. |
Le HTTP sépare les envois Web en deux types : les requêtes et les réponses. Le poste client fait une requête HTTP à un serveur, qui lui renvoie une réponse.
Voici les trois éléments de la requête utilisés dans le cadre du projet SADVR :
La requête possède d'abord une méthode : GET, POST, PUT, DELETE, HEAD, etc. Dans la mesure où l'API REST offre uniquement un service de lecture de données, nous utiliserons exclusivement la méthode GET, qui spécifie justement la lecture seule. Taper une adresse Web dans un navigateur fait justement une requête GET à cette adresse.
La requête possède ensuite un URI (Uniform Resource Identifier) ou route. Comme son nom l'indique, elle identifie ce qu'on veut chercher par une adresse unique (ex: recherche d'individus : https://www.recherche.umontreal.ca/vitrine/rest/api/1.8/umontreal/id/individu)
La requête peut aussi posséder des paramètres, qui dans le cas de la requête GET sont ajoutés à la suite de l'URI, pour préciser la requête (ex: recherche de professeurs titulaires de certaines facultés données : https://www.recherche.umontreal.ca/vitrine/rest/api/1.8/umontreal/id/individu?fonction=42001&faculte[0]=01&faculte[1]=28)
Voici le domaine racine (préfixe)* avant chaque route pour l'API : https://www.recherche.umontreal.ca/vitrine/rest/api/1.7/umontreal/
*Le domaine racine n'est disponible que pour l'environnement de test actuellement. À terme, la documentation sera mise à jour afin que seul le domaine racine de l'environnement de production soit disponible.
Le /umontreal/ est inclus dans l'URI afin de permettre une utilisation éventuelle de l'API pour d'autres universités (Laval, Sherbrooke, etc.). |
Les réponses contiennent principalement deux éléments :
Bien qu'il existe une multitude de codes de réponses HTTP, nous en utiliserons principalement trois :
Dans le cas d'une réponse 200, le contenu sera toujours un JSON avec les données demandées.
Dans le cas d'une réponse 400 ou 500, le contenu sera le message d'erreur envoyé en JSON.
Dans le cadre du projet SADVR, il était impératif de disposer d'un identifiant unique et pérenne représentant les principales entités du dépôt Vitrine-Recherche. L'objectif visé par la mise en place d'un tel identifiant est de pouvoir y référer, sans équivoque, de façon neutre et uniforme.
Par pérenne, on entend que cet identifiant pourra être "résolu" à perpétuité, soit directement, soit par le biais d'un service de redirection ou d'équivalence. Les entités disposant d'un identifiant dans la Vitrine-Recherche sont les individus (professeurs, chercheurs, chargés de cours, etc.) et les unités de recherche (chaires, groupes, centres, etc.).
À noter que le matricule attribué aux individus, dans les systèmes de l'Université de Montréal, a été écarté dans la mesure où il s'agit d'une donnée sensible ne pouvant être exposée publiquement, sans contrôle d'accès.
Pour obtenir la liste de principaux changements effectuées d'une version à l'autre de l'API, voir la page de recension des changements : API REST - Changements par rapport aux versions antérieures.
Le Service des ressources permet d’exposer l’ensemble des valeurs possibles pour 6 des 7 paramètres proposés par le Service de recherche d’identifiant pérenne.
| Service | Requête : URI | Requête : paramètres | Réponse : champs pour chaque élément |
|---|---|---|---|
| Code SAD de toutes les facultés | ressource/faculte | uniterech : identifiant de l'unité de recherche (optionnel, multiple) |
|
| Code SAD de tous les départements | ressource/departement | uniterech : identifiant de l'unité de recherche (optionnel, multiple) |
|
| Code SAD de toutes les unités administratives | ressource/uniteadmin | --- |
|
| Code SAD de tous les titres de fonction | ressource/fonction | --- |
|
| Numéro SAD de tous les programmes | ressource/programme | --- |
|
| Identifiant de tous les domaines d'études | ressource/domaineetude | --- |
|
| Nom de tous les champs d'expertise de recherche | ressource/expertiserech |
|
(ci-dessous mots-clés seulement)
|
| Nom des secteurs de recherche | ressource/ | --- |
|
| Disciplines | ressource/discipline | --- |
|
| Nom des établissements affiliés à l'UdeM | ressource/etablaffilie | --- |
|
| Code et nom des langues parlées et écrites | ressource/langue | --- |
|
| Code et nom des types d'unités de recherche | ressource/typeuniterech | --- |
|
Règles d'affaire de l'exposition de l'expertise de rechercheIl n'est pas possible d'obtenir l'exposition globale de l'expertise, pour toutes les facultés et tous les départements confondus. Il faut préciser une (et une seule) faculté ou un ou des départements. On peut préciser une faculté ET un département, mais le département doit faire partie de la faculté indiquée. Dans ce cas, le fait d'inclure la faculté est inutile car le service retourne alors les mots-clés associés au département (et non tous les mots-clés utilisés par l'ensemble des départements de la faculté). Le service permet l'exposition de l'expertise conjointe de plusieurs départements. Toutefois, ceux-ci doivent tous faire partie de la même faculté. |
Réponse avec bonne requête (200 : OK) pour ressource/faculte. Les informations sont contenus dans l'élément data.
{"data": [
{
"codeSad": "01",
"nom": "Aménagement"
},
{
"codeSad": "03",
"nom": "Arts et sciences"
},
{
"codeSad": "08",
"nom": "Diététique et nutrition"
},
[...]
{
"codeSad": "48",
"nom": "Théologie et sc. des religions"
},
{
"codeSad": "99",
"nom": "Université de Montréal"
}
]} |
Réponse avec bonne requête (200 : OK) pour ressource/domaineetude. Les informations sont contenus dans l'élément data.
{"data": [
{
"id": "1",
"nom": "Aménagement"
},
{
"id": "2",
"nom": "Arts et musique"
},
{
"id": "3",
"nom": "Communication"
},
{
"id": "4",
"nom": "Droit"
},
{
"id": "5",
"nom": "Économie et politique"
},
{
"id": "6",
"nom": "Enseignement et sciences de l'éducation"
},
{
"id": "19",
"nom": "Environnement et développement durable"
},
[...]
{
"id": "13",
"nom": "Technologies de l'information (TIC)"
},
{
"id": "14",
"nom": "Théologie et sciences des religions"
}
]} |
Réponse avec bonne requête (200 : OK) pour ressource/expertiserech?departement=0337. Les informations sont contenus dans l'élément data.
{"data": [
{
"nom": "14e siècle",
"volet": "Période chronologique",
"nbIndividus": 0,
"nomTraduction": [
{
"codeLangue": "eng",
"nom": "14th century"
}
]
},
...
{
"nom": "Afghanistan",
"volet": "Pays",
"nbIndividus": 0,
"nomTraduction": [
{
"codeLangue": "eng",
"nom": "Afghanistan"
}
]
},
...
{
"nom": "Afrique",
"nomTraduction": [
{
"nom": "Africa",
"codeLangue": "eng"
}
],
"nbIndividus": 0,
"volet": "Continent"
},
...
{
"nom": "Afrique du Nord",
"nomTraduction": [
{
"nom": "North Africa",
"codeLangue": "eng"
}
],
"nbIndividus": 0,
"volet": "Sous-région"
},
...
{
"nom": "Architecture",
"volet": "Mot-clé",
"nomTraduction": [
{
"codeLangue": "eng",
"nom": "Architecture"
}
],
"departement": [
{
"departementCodeSad": "0337",
"departementNom": "Département d'histoire",
"nbIndividus": 1
},
{
"departementCodeSad": "0104",
"departementNom": "École d'architecture",
"nbIndividus": 16
},
{
"departementCodeSad": "0108",
"departementNom": "École d'urbanisme et d'architecture de paysage ",
"nbIndividus": 2
}
],
"faculte": [
{
"faculteCodeSad": "03",
"faculteNom": "Faculté des arts et des sciences",
"nbIndividus": 1
},
{
"faculteCodeSad": "01",
"faculteNom": "Faculté de l'aménagement",
"nbIndividus": 18
}
]
},
...
]} |
| Service | Requête : URI | Requête : paramètres | Réponse : champs pour chaque élément |
|---|---|---|---|
| Identifiants pérennes de tous les individus | /id/individu |
|
|
| Identifiants pérennes des unités de recherche | /id/uniterech |
|
|
Réponse avec bonne requête (200 : OK) pour id/individu. Les informations sont contenus dans l'élément data.
{"data": [
{
"idsadvr": "in13692",
"prenom": "Sylvie C.",
"nom": "Cartier",
"fonction": "Professeure titulaire",
"uniteAdmin": "Faculté des sciences de l'éducation - Département de psychopédagogie et d'andragogie",
"courriel": "sylvie.cartier@umontreal.ca",
"etablissementsAffilies": [],
"visuelOfficiel": "http://www.recherche.umontreal.ca/visuel/personne:13692.photoOfficiellePetite",
"visuelOfficielGrand": "http://www.recherche.umontreal.ca/visuel/personne:13692.photoOfficielle"
},
{
"idsadvr": "in13749",
"prenom": "Mohamed",
"nom": "Hrimech",
"fonction": "Professeur agrégé",
"uniteAdmin": "Faculté des sciences de l'éducation - Département de psychopédagogie et d'andragogie",
"courriel": "mohamed.hrimech@umontreal.ca",
"etablissementsAffilies": [],
"visuelOfficiel": "http://www.recherche.umontreal.ca/visuel/personne:13749.photoOfficiellePetite",
"visuelOfficielGrand": "http://www.recherche.umontreal.ca/visuel/personne:13749.photoOfficielle"
}
]} |
Réponse avec bonne requête (200 : OK) pour id/uniterech. Les informations sont contenus dans l'élément data.
{"data": [
{
"idsadvr": "ur13608",
"nom": "Groupe de recherche en épidémiologie des zoonoses et santé publique",
"acronyme": "GREZOSP",
"responsables": [{
"idsadvr": "in14753",
"prenom": "Jean-Pierre",
"nom": "Vaillancourt",
"fonction": "Professeur titulaire",
"uniteAdmin": "Faculté de médecine vétérinaire - Départment des sciences cliniques",
"courriel": "jean-pierre.vaillancourt@umontreal.ca"
}],
"visuelOfficiel": "http://www.recherche.umontreal.ca/visuel/uniterech:13608.photoOfficiellePetite",
"visuelOfficielGrand": "http://www.recherche.umontreal.ca/visuel/uniterech:13608.photoOfficielle"
},
...
{
"idsadvr": "ur13621",
"nom": "Centre de recherche interdisciplinaire en réadaptation du Montréal métropolitain",
"acronyme": "CRIR",
"responsables": [
{
"idsadvr": "in14505",
"prenom": "Bonnie",
"nom": "Swaine",
"fonction": "Professeure titulaire",
"fonctionCodeSAD": "42001",
"uniteAdmin": "Faculté de médecine - École de réadaptation",
"courriel": "bonnie.swaine@umontreal.ca"
},
{
"idsadvr": null,
"prenom": "Eva",
"nom": "Kehayia",
"fonction": null,
"fonctionCodeSAD": null,
"uniteAdmin": null,
"courriel": null
}
],
"visuelOfficiel": "http://www.recherche.umontreal.ca/visuel/uniterech:13621.photoOfficiellePetite",
"visuelOfficielGrand": "http://www.recherche.umontreal.ca/visuel/uniterech:13621.photoOfficielle"
},
]} |
Réponse avec mauvaise requête (400 : Bad request). Les erreurs sont contenues dans l'élément errors, selon le paramètre problématique
{
errors: {
uniterech: [
"Le paramètre uniterech doit être un entier ou un tableau d'entiers."
]
}
} |
Réponse avec erreur du côté serveur (500 : Internal server error). Le message d'erreur sera dans l'élément errors.
{
errors: "SQLSTATE[42000] [1044] Access denied for user 'usager'@'1.1.1.1/255.255.255.255' to database 'database'"
} |
| Service | Requête : URI | Requête : paramètres | Réponse |
|---|---|---|---|
| Identifiants pérennes de tous les individus | /idext/individu |
Note : Il est recommandé de spécifier au moins paramètre afin éviter d'obtenir |
(ci-dessus, premier niveau seulement; voir exemple de réponse pour détails) |
Réponse avec bonne requête (200 : OK) pour idext/individu. Les informations sont contenus dans l'élément data.
{
"data": [
{
"idsadvr": "in12345",
"prenom": "Claude",
"nom": "Toupin",
"affiliations": [12345
{
"fonction": {
"codeSad": "42001",
"nom": "Professeur titulaire"
},
"uniteAdministrative": {
"codeSad": "N202A0",
"nom": "Faculté des arts et des sciences - Département d'histoire"
},
"departement": {
"codeSad": "0337",
"nom": "Département d'histoire"
},
"faculte": {
"codeSad": "03",
"nom": "Faculté des arts et des sciences"
},
"courrielInstitutionnel": "claude.toupin@umontreal.ca",
"telephone": {
"numero": "5143436111",
"poste": "6543"
},
"immeuble": "Pavillon Lionel-Groulx",
"local": "C6534-1",
"exclusion": "0",
"exclusionTel": "0"
}
],
"etablissementsAffilies": [],
"visuelOfficiel": "http://www.recherche.umontreal.ca/visuel/personne:12345.photoOfficiellePetite",
"visuelOfficielGrand": "http://www.recherche.umontreal.ca/visuel/personne:12345.photoOfficielle",
"courriels": [],
"telephones": [
{
"numero": "5143436543",
"poste": null,
"categorie": "Travail 1"
},
{
"numero": "5143431234",
"poste": null,
"categorie": "Télécopieur"
}
],
"expertise": {
"secteursRecherche": [
{
"uid": "10",
"codeLangue": "fre",
"nom": "Sciences sociales et humaines",
"ordre": "1"
},
{
"uid": "10",
"codeLangue": "eng",
"nom": "Social Sciences and Humanities",
"ordre": "1"
}
],
"disciplines": [
{
"uid": "100",
"codeLangue": "fre",
"nom": "Archéologie",
"ordre": "1"
},
...
{
"uid": "100",
"codeLangue": "eng",
"nom": "Archaeology",
"ordre": "1"
},
...
],
"motsCles": [
...
{
"uid": "157",
"nom": "Urbanisme",
"ordre": "6",
"codeLangue": "fre",
"departement": "École d'urbanisme",
"departementCodeSAD": "0107",
"faculte": null,
"faculteCodeSAD": null,
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "157",
"nom": "City planning",
"ordre": "6",
"codeLangue": "eng",
"departement": "École d'urbanisme",
"departementCodeSAD": "0107",
"faculte": null,
"faculteCodeSAD": null,
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "2137",
"nom": "Grèce ancienne",
"ordre": "5",
"codeLangue": "fre",
"departement": "Département d'histoire",
"departementCodeSAD": "0337",
"faculte": null,
"faculteCodeSAD": null,
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "2137",
"nom": "Ancient Greece",
"ordre": "5",
"codeLangue": "eng",
"departement": "Département d'histoire",
"departementCodeSAD": "0337",
"faculte": null,
"faculteCodeSAD": null,
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
...
],
"pays": [],
"continents": [],
"periodesChronologiques": [
{
"uid": "37",
"ordre": "7",
"codeLangue": "fre",
"nom": "Antiquité"
},
{
"uid": "37",
"ordre": "7",
"codeLangue": "eng",
"nom": "Antiquity"
}
],
"phraseCle": [
{
"codeLangue": "fre",
"contenu": "Archéologie et histoire grecque"
}
]
},
"urlVitrine": [
{
"nom": "Vitrine de la recherche",
"url": "http://www.recherche.umontreal.ca/la-recherche-a-ludem/la-vitrine-des-professeurs/informations/chercheur/1234/"
},
{
"nom": "Répertoire des experts à l’intention des médias",
"url": "http://www.recherche.umontreal.ca/la-recherche-a-ludem/la-vitrine-des-professeurs/repertoire-des-experts-a-lintention-des-medias/informations/chercheur/1234/"
}
],
"recrutementRecherche": false
},
{
"idsadvr": "in14321",
"prenom": "Paul",
"nom": "Hurtubise",
"affiliations": [
{
"fonction": {
"codeSad": "42001",
"nom": "Professeur titulaire"
},
"uniteAdministrative": {
"codeSad": "N202A0",
"nom": "Faculté des arts et des sciences - Département d'histoire"
},
"departement": {
"codeSad": "0337",
"nom": "Département d'histoire"
},
"faculte": {
"codeSad": "03",
"nom": "Faculté des arts et des sciences"
},
"courrielInstitutionnel": "paul.hurtubise@umontreal.ca",
"telephone": {
"numero": "5143436111",
"poste": "7654"
},
"immeuble": "3744, rue Jean-Brillant",
"local": "333-22",
"exclusion": "0",
"exclusionTel": "0"
}
],
"etablissementsAffilies": [],
"visuelOfficiel": null,
"courriels": [],
"telephones": [],
"expertise": {
"secteursRecherche": [
{
"uid": "10",
"codeLangue": "fre",
"nom": "Sciences sociales et humaines",
"ordre": "0"
},
{
"uid": "10",
"codeLangue": "eng",
"nom": "Social Sciences and Humanities",
"ordre": "0"
}
],
"disciplines": [
{
"uid": "100",
"codeLangue": "fre",
"nom": "Histoire",
"ordre": "0"
},
{
"uid": "100",
"codeLangue": "eng",
"nom": "History",
"ordre": "0"
}
],
"motsCles": [
{
"uid": "1101",
"nom": "Jardins",
"ordre": "3",
"codeLangue": "fre",
"departement": "École d'architecture de paysage",
"departementCodeSAD": "0105",
"faculte": null,
"faculteCodeSAD": null,
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "1101",
"nom": "Gardens",
"ordre": "3",
"codeLangue": "eng",
"departement": "École d'architecture de paysage",
"departementCodeSAD": "0105",
"faculte": null,
"faculteCodeSAD": null,
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
...
],
"pays": [],
"continents": [],
"periodesChronologiques": [],
"phraseCle": [
{
"codeLangue": "fre",
"contenu": "Histoire de la Grèce antique"
}
]
},
"urlVitrine": [
{
"nom": "Vitrine de la recherche",
"url": "http://www.recherche.umontreal.ca/la-recherche-a-ludem/la-vitrine-des-professeurs/informations/chercheur/11111/"
},
{
"nom": "Répertoire des experts à l’intention des médias",
"url": null
}
],
"recrutementRecherche": false
}, |
| Service | Requête : URI | Requête : paramètres | Réponse |
|---|---|---|---|
| Informations sur un individu | /info/individu | idsadvr : IDSADVR (obligatoire, multiple) | (voir exemple de réponse pour détails) |
| Informations sur une unité de recherche | /info/uniterech | idsadvr : IDSADVR (obligatoire, multiple ) | (voir exemple de réponse pour détails) |
Réponse avec bonne requête (200 : OK) pour info/individu. Les informations sont contenus dans l'élément data.
{
"data": [
{
"idsadvr": "in12345",
"prenom": "Claude",
"nom": "Toupin",
"sexe": "M",
"institution": "Université de Montréal",
"paysCode": "CA",
"paysNom": "Canada",
"consentement": {
"departements": [],
"facultes": [],
"unitesRecherche": [],
"UdeM": [
{
"nom": "Vitrine de la recherche",
"statutConsentement": "1"
},
{
"nom": "Répertoire des experts à l’intention des médias",
"statutConsentement": "1"
}
]
},
"affichageWeb": [
{
"departements": [],
"facultes": [],
"unitesRecherche": [],
"UdeM": [
{
"nom": "Vitrine de la recherche",
"url": "http://www.recherche.umontreal.ca/la-recherche-a-ludem/la-vitrine-des-professeurs/informations/chercheur/12345/"
},
{
"nom": "Répertoire des experts à l’intention des médias",
"url": "http://www.recherche.umontreal.ca/la-recherche-a-ludem/la-vitrine-des-professeurs/repertoire-des-experts-a-lintention-des-medias/informations/chercheur/12345/"
}
]
}
],
"langues": [
{
"nom": "Anglais",
"medium": "Écrit"
},
{
"nom": "Français",
"medium": "Écrit"
},
{
"nom": "Anglais",
"medium": "Oral"
},
{
"nom": "Français",
"medium": "Oral"
},
{
"nom": "Grec moderne (après 1453)",
"medium": "Oral"
}
],
"courriels": [],
"affiliations": [
{
"fonction": {
"codeSad": "42001",
"nom": "Professeur titulaire"
},
"uniteAdministrative": {
"codeSad": "N202A0",
"nom": "Faculté des arts et des sciences - Département d'histoire"
},
"departement": {
"codeSad": "0337",
"nom": "Département d'histoire"
},
"faculte": {
"codeSad": "03",
"nom": "Faculté des arts et des sciences"
},
"courrielInstitutionnel": "claude.toupin@umontreal.ca",
"telephone": {
"numero": "5143436111",
"poste": "5432"
},
"immeuble": "Pavillon Lionel-Groulx",
"local": "C6543-1",
"exclusion": 0,
"exclusionTel": 0
}
],
"presenceWeb": [
{
"idcategorie": "13",
"categorie": "Page professionnelle (faculté,département,école)",
"url": "http://histoire.umontreal.ca/repertoire-departement/toupin-claude/"
},
{
"idcategorie": "14",
"categorie": "Site web de l’unité de recherche",
"url": "http://abcd.umontreal.ca/"
}
],
"telephones": [
{
"numero": "5143436111",
"poste": "4321",
"categorie": "Travail 1"
},
{
"numero": "5143431234",
"poste": "",
"categorie": "Télécopieur"
}
],
"etablissementsAffilies": [],
"formations": [],
"biographie": [
{
"codeLangue": "fre",
"contenu": "<p>Contenu de la biographie.</p>"
}
],
"recrutementRecherche": [],
"activiteEnseignement": [
{
"domainesEtude": [
{
"id": "9",
"codeLangue": "fre",
"nom": "Sciences humaines"
},
{
"id": "9",
"codeLangue": "eng",
"nom": "Humanities"
}
],
"groupesProgramme": [
{
"id": "148",
"codeLangue": "fre",
"nom": "Histoire"
},
{
"id": "57",
"codeLangue": "fre",
"nom": "Histoire et Études classiques"
},
{
"id": "148",
"codeLangue": "eng",
"nom": "History"
},
{
"id": "57",
"codeLangue": "eng",
"nom": "History and Classical Studies"
}
],
"programmes": [
{
"noSad": "116510",
"cycle": "1",
"faculteNom": "Faculté des arts et des sciences",
"faculteCodeSad": "03",
"departementNom": "Département d'histoire",
"departementCodeSad": "0337",
"noms": [
{
"codeLangue": "fre",
"nom": "Baccalauréat en histoire"
}
],
"groupesProgramme": [
{
"id": "148",
"codeLangue": "eng",
"nom": "History"
},
{
"id": "148",
"codeLangue": "fre",
"nom": "Histoire"
}
],
"domainesEtude": [
{
"id": "9",
"codeLangue": "eng",
"nom": "Humanities"
},
{
"id": "9",
"codeLangue": "fre",
"nom": "Sciences humaines"
}
]
}
],
"cours": [
{
"noSad": "HGL1011",
"trimestreCode": "H18",
"annee": "18",
"nom": "Initiation à l'archéologie grécoromaine",
"cycle": "1",
"sourceDonnees": "SAD",
"faculteCodeSad": "03",
"faculteNom": "Faculté des arts et des sciences",
"programmes": [
{
"noSad": "109510",
"noms": [
{
"codeLangue": "fre",
"nom": "Baccalauréat en études classiques"
}
]
},
...
]
}
]
}
]
}
],
"unitesRecherche": [],
"projetsRecherche": [
{
"categorie": "Projet de recherche au Canada",
"nom": "Un projet de recherche",
"dateDebut": "2015",
"dateFin": "2019",
"exclusion": "0",
"selection": "0",
"contenu": [],
"pays": [],
"continents": [],
"periodesChronologiques": [],
"financement": [
{
"organisme": "CRSH/Conseil de recherches en sciences humaines du Canada",
"programme": "Programme de subvention",
"dateDebut": "2016-04-01",
"dateFin": "2019-03-31"
}
],
"equipe": [
{
"chercheurPrincipal": [
{
"idsadvr": "in12345",
"prenom": "Claude",
"nom": "Toupin"
}
],
"coChercheur": []
}
]
}
],
"activitesRecherche": [
{
"categorie": "Thèses et mémoires dirigés",
"typeTransfert": null,
"nom": "Titre d'une thèse",
"dateDebut": "2016",
"dateFin": "2016",
"sourceFinancement": null,
"exclusion": "0",
"selection": "0",
"sourceDonnees": "Papyrus",
"contenu": [
{
"codeLangue": "eng",
"contenu": "<strong>Graduate :</strong> Tremblay, Sébastien<br/><strong>Cycle :</strong> Master's<br/><strong>Grade :</strong> M.A."
},
{
"codeLangue": "fre",
"contenu": "<strong>Diplômé(e) :</strong> Tremblay, Sébastien<br/><strong>Cycle :</strong> Maîtrise <br/><strong>Diplôme obtenu :</strong> M.A."
}
],
"partenaires": [],
"infosSupplementaires": [
{
"categorie": null,
"nom": "Lien vers le document dans Papyrus",
"description": null,
"adresse": "http://hdl.handle.net/1866/123456",
"datePublication": null,
"exclusion": "0",
"selection": "0"
}
]
},
...
{
"categorie": "Méthodes et formules pédagogiques",
"typeTransfert": null,
"nom": "Méthodes et formules pédagogiques",
"dateDebut": null,
"dateFin": null,
"sourceFinancement": null,
"exclusion": "0",
"selection": "0",
"sourceDonnees": null,
"contenu": [
{
"codeLangue": "fre",
"contenu": "<p>Un exemple de contenu d'activité avec un <a href=\"http://www.umontreal.ca/" target=\"_blank\">lien</a></p>"
}
],
"partenaires": [],
"infosSupplementaires": []
},
...
],
"publication": null,
"communication": null,
"expertise": [
{
"secteursRecherche": [
{
"uid": "10",
"codeLangue": "fre",
"nom": "Sciences sociales et humaines",
"ordre": 1
},
{
"uid": "10",
"codeLangue": "eng",
"nom": "Social Sciences and Humanities",
"ordre": 1
},
{
"uid": "18",
"codeLangue": "fre",
"nom": "Aménagement",
"ordre": 2
},
{
"uid": "18",
"codeLangue": "eng",
"nom": "Environmental Planning and Design",
"ordre": 2
},
...
],
"disciplines": [
{
"uid": "13",
"codeLangue": "eng",
"nom": "Classical Archaeology",
"ordre": 1
},
{
"uid": "13",
"codeLangue": "fre",
"nom": "Archéologie classique",
"ordre": 1
},
...
],
"motsCles": [
{
"uid": "3087",
"ordre": 5,
"codeLangue": "eng",
"nom": "Ancient Greece",
"departement": null,
"departementCodeSad": null,
"faculte": null,
"faculteCodeSad": null,
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "3087",
"ordre": 5,
"codeLangue": "fre",
"nom": "Grèce ancienne",
"departement": null,
"departementCodeSad": null,
"faculte": null,
"faculteCodeSad": null,
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "624",
"ordre": 6,
"codeLangue": "fre",
"nom": "Urbanisme",
"departement": null,
"departementCodeSad": null,
"faculte": "Faculté de l'aménagement",
"faculteCodeSad": "01",
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "624",
"ordre": 6,
"codeLangue": "eng",
"nom": "City planning",
"departement": null,
"departementCodeSad": null,
"faculte": "Faculté de l'aménagement",
"faculteCodeSad": "01",
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
...
],
"pays": [
{
"uid": "10214",
"codeLangue": "eng",
"nom": "Syrian Arab Republic",
"ordre": 9
},
{
"uid": "10214",
"codeLangue": "fre",
"nom": "Syrie (République arabe syrienne)",
"ordre": 9
}
],
"continents": [],
"periodesChronologiques": [
{
"uid": "5",
"codeLangue": "eng",
"nom": "Antiquity",
"ordre": 7
},
{
"uid": "5",
"codeLangue": "fre",
"nom": "Antiquité",
"ordre": 7
}
],
"phraseCle": [
{
"codeLangue": "fre",
"contenu": "Archéologie et histoire grecque"
}
],
"contenu": [
{
"codeLangue": "fre",
"contenu": "<p>Description de l'expertise.</p>"
}
]
}
],
"expertiseMedia": [
{
"typesMedias": [
{
"typeMedia": "Presse écrite (imprimé, numérique)"
},
{
"typeMedia": "Radio"
},
{
"typeMedia": "Télévision"
}
],
"langues": [
{
"nom": "Anglais",
"medium": "Écrit"
},
{
"nom": "Français",
"medium": "Écrit"
},
{
"nom": "Anglais",
"medium": "Oral"
},
{
"nom": "Français",
"medium": "Oral"
},
{
"nom": "Grec moderne (après 1453)",
"medium": "Oral"
}
],
"disciplines": [
{
"codeLangue": "eng",
"nom": "Archaeology",
"ordre": 4
},
{
"codeLangue": "fre",
"nom": "Archéologie",
"ordre": 4
},
...
],
"motsCles": [
{
"ordre": 1,
"codeLangue": "eng",
"nom": "Archeological Data Analysis",
"departement": null,
"departementCodeSad": null,
"faculte": "Faculté des arts et des sciences",
"faculteCodeSad": "03",
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"ordre": 1,
"codeLangue": "fre",
"nom": "Analyses des données archéologiques",
"departement": null,
"departementCodeSad": null,
"faculte": "Faculté des arts et des sciences",
"faculteCodeSad": "03",
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
...
],
"contenu": [
{
"codeLangue": "fre",
"contenu": "<p>Description de l'expertise</p>"
}
],
"infosSupplementaires": []
}
],
"prix": [
{
"vitrine": [],
"autre": []
}
],
"infosSupplementaires": [
{
"categorie": null,
"nom": "Découverte d'un nouveau site archéologique",
"description": "Un nouveau site archéologique mis à l'étude en Syrie.",
"adresse": "http://youtube.com/1234567890asdfghjkl",
"datePublication": null,
"exclusion": "0",
"selection": "0",
"sourceDonnees": null
}
],
"visuels": [
{
"categorie": "Photo officielle",
"nom": null,
"droitAuteur": null,
"ordre": null,
"url": "http://www.recherche.umontreal.ca/visuel/personne:12345.photoOfficielle",
"legendes": []
},
{
"categorie": "Portrait du chercheur",
"nom": "Mission archéologique",
"droitAuteur": "© Claude Toupin",
"ordre": null,
"url": "http://www.recherche.umontreal.ca/visuel/personne:12345.portrait.1.image",
"legendes": [
{
"codeLangue": "fre",
"contenu": "Photo montrant le site étudié"
}
]
}
],
"activitesPromotion": []
}
]
}
"activitesPromotion": []
}]} |
Ce service permet d'effectuer des recherches dans le moteur SOLR de la Vitrine-Recherche par le biais de l'API. Les requêtes sont formulées avec l'API selon la syntaxe native de SOLR. Les résultats produits par SOLR sont interceptés par l'API REST qui les reformate selon une structure de données communes à l'API. Plus précisément, la recherche d'individus (professeurs et experts pour les média) produit une liste de format identique au service étendu de recherche d'identifiants pérennes (/idext/individu) et le repérage des unités de recherche présente les résultats comme le service de recherche d'identifiants pérennes pour les unités de recherche (/id/uniterech).
Présentement, le contenu de trois "vitrines" est repérable via l'API. Il s'agit de la "Vitrine des professeurs", la "Vitrine des unités de recherche" et le "Répertoire des experts à l'intention des médias". Plus tard s'ajouteront la "Vitrine des bâtisseurs" et celle des prix. Chaque vitrine fait l'objet d'une route propre en ce qui concerne le service de repérage.
| Service | Route |
|---|---|
| Recherche dans la Vitrine des professeurs | /recherche/professeur/select |
| Recherche dans la Vitrine des unités de recherche | /recherche/uniterech/select |
| Recherche dans le Répertoire des experts à l'intention des médias | /recherche/expertmedia/select |
Dans le cadre du repérage dans la Vitrine-Recherche via l'API, une requête SOLR comporte habituellement 5 paramètres.
| Paramètre | Usage | Exemples |
|---|---|---|
q | Requête textuelle comme telle. Ce paramètre est obligatoire et permet de spécifier les termes et champs de recherche. Le nom d'un champ est suivi du caractère ":". On utilise les guillemets ASCII pour délimiter une experssion exacte. Les espaces sont remplacés par des "+". | q=ID:* (repérer tous les objets) q=Texte:Intelligence+artificielle+AND+Faculte_fac:"Faculté+de+droit" |
sort +asc/+desc | Préciser le tri des résultats. Par défaut, le tri s'effectue selon la pertinence telle qu'évaluée par SOLR. On utilise ce paramètre pour choisir un champ de tri particulier. On précise la direction du tri avec
| sort= |
start / rows | Les résultats de SOLR sont paginés. Le paramètre start désigne la position du pointeur au début de la page. Quant à rows, il indique le nombre de résultats par page. |
|
q.op | Pour préciser l'opérateur booléen s'appliquant entre les mots spécifiés dans la requête q. En l'absence de ce paramètret, c'est le ET (AND) qui s'applique. | q.op=AND&q=Texte:intelligence+artificielle (on cherche "intelligence" ET "artificielle")q.op=OR&q=Texte:intelligence+cognition (on cherche "intelligence" OU "cognition") |
Exemple d'une requête complète correspondant à la recherche simple dans l'interface de la Vitrine-Recherche illustrée ci-dessous.

q.op=OR&q=Texte%3Aintelligence+cognition&sort=UniteAdmin_tri+asc |
Exemple d'une requête complète correspondant à la recherche par critère illustrée ci-dessous, si l'on voulait obtenir la deuxième page de résultats, avec 10 résultats par page.

q=Faculte_fac%3A"Faculté+de+droit"+AND+Expertise_idx%3A"Droit+civil"&sort=ChercheurNP_tri+asc&start=10&rows=10 |
|
| Type | Champ SOLR | Libellé / fonction |
|---|---|---|
| Critère, par mots | Texte | Pour la recherche simple (tous les champs) |
| Critère, par expression exacte | Secteur_fac | Secteur de recherche |
| Critère, par expression exacte | Discipline_fac | Discipline |
| Critère, par expression exacte | ObjetsRech_fac | Expertise par mot-clé |
| Critère, par expression exacte | Faculte_fac | Faculté |
| Critère, par expression exacte | UniteRech_fac | Unité de recherche |
| Critère, par expression exacte | ChercheurNP_fac | Nom du professeur |
| Tri |
| Nom |
| Tri | Expertise_tri | Expertise |
| Tri | UniteAdmin_tri | Faculté d'attache |
| Critère. booléen | | Repérer les personnes qui affichent une notification de recrutement (valeur "true") |
| Type | Champ SOLR | Libellé / fonction |
|---|---|---|
| Critère, par mots | Texte | Pour la recherche simple (tous les champs) : n'est pas utilisé actuellement |
| Critère, par expression exacte | Secteur_fac | Secteur de recherche |
| Critère, par expression exacte | | Faculté |
| Critère, par expression exacte | | Établissement affilié à l'UdeM |
| Critère, par mots | | Activité de recherche |
| Critère, par expression exacte | | Responsable |
| Critère, par expression exacte | | Catégorie d'unité de recherche |
| Critère, par expression exacte | UniteRech_fac | Nom de l'unité de recherche |
| Tri | | Nom |
| Tri | | Responsable |
| Tri | | Secteur de recherche |
| Type | Champ SOLR | Libellé / fonction |
|---|---|---|
| Critère, par mots | Texte | Pour la recherche simple et option "tous les champs" de la recherche par critère |
| Critère, par expression exacte | Discipline_fac | Discipline |
| Critère, par expression exacte | ObjetsRech_fac | Expertise par mot-clé |
| Critère, par expression exacte | | Langue (oral) |
| Critère, par expression exacte | | Langue (écrite) |
| Critère, par expression exacte | | Média privilégié |
| Critère, par expression exacte | ChercheurNP_fac | Nom de l'expert |
| Tri |
| Nom |
| Tri | Expertise_tri | Expertise |
| Tri | UniteAdmin_tri | Faculté d'attache |
La réponse retournée par l'API REST du SADVR contient deux blocs. Le premier contient les informations relatifs à la pagination des résultats (paginationSOLR) et le second (data) contient la liste des résultats.
{
"paginationSOLR": {
"numFound": 73,
"start": 10,
"rows": 10
},
"data": [
...
]
} |
L'élément numFound est le nombre total d'items trouvés. Les éléments start et rows retournent les valeurs de ces paramètres initialement soumis à SOLR lors de la requête. Ces informations sont nécessaires pour permettre à l'application de générer les liens permettant d'atteindre d'autres pages de résultats que celle affichée.
Le format de la liste des résultats est le même que celui du service de recherche d’identifiant pérenne étendu pour les individus (/idext/individu).
{
"paginationSOLR": {
"numFound": 73,
"start": 10,
"rows": 10
},
"data": [
...
{
"idsadvr": "in20664",
"prenom": "Christine",
"nom": "Gagnon",
"affiliations": [
{
"fonction": {
"codeSad": "42032",
"nom": "Professeure associée"
},
"uniteAdministrative": {
"codeSad": "C000A0",
"nom": "Faculté de droit"
},
"departement": {
"codeSad": null,
"nom": null
},
"faculte": {
"codeSad": "11",
"nom": "Faculté de droit"
},
"courrielInstitutionnel": "christine.gagnon.3@umontreal.ca",
"telephone": {
"numero": null,
"poste": null
},
"immeuble": null,
"local": null,
"exclusion": "0",
"exclusionTel": "0"
}
],
"etablissementsAffilies": [],
"visuelOfficiel": "http://www.recherche.umontreal.ca/visuel/personne:20664.photoOfficiellePetite",
"visuelOfficielGrand": "http://www.recherche.umontreal.ca/visuel/personne:20664.photoOfficielle",
"courriels": [],
"telephones": [],
"expertise": {
"secteursRecherche": [
{
"codeLangue": "fre",
"nom": "Sciences sociales et humaines",
"ordre": "1"
},
{
"codeLangue": "fre",
"nom": "Droit",
"ordre": "2"
},
{
"codeLangue": "eng",
"nom": "Social Sciences and Humanities",
"ordre": "1"
},
{
"codeLangue": "eng",
"nom": "Law",
"ordre": "2"
}
],
"disciplines": [
{
"codeLangue": "fre",
"nom": "Droit",
"ordre": "1"
},
{
"codeLangue": "eng",
"nom": "Law",
"ordre": "1"
}
],
"motsCles": [
{
"uid": "372",
"nom": "Droit notarial",
"ordre": "1",
"codeLangue": "fre",
"departement": null,
"departementCodeSAD": null,
"faculte": "Faculté de droit",
"faculteCodeSAD": "11",
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "372",
"nom": "Notarial law",
"ordre": "1",
"codeLangue": "eng",
"departement": null,
"departementCodeSAD": null,
"faculte": "Faculté de droit",
"faculteCodeSAD": "11",
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "1372",
"nom": "Immobilier",
"ordre": "2",
"codeLangue": "fre",
"departement": null,
"departementCodeSAD": null,
"faculte": "Faculté de droit",
"faculteCodeSAD": "11",
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
},
{
"uid": "1372",
"nom": "Real estate",
"ordre": "2",
"codeLangue": "eng",
"departement": null,
"departementCodeSAD": null,
"faculte": "Faculté de droit",
"faculteCodeSAD": "11",
"uniteRecherche": null,
"uniteRechercheIdsadvr": null
}
],
"pays": [],
"continents": [],
"periodesChronologiques": [],
"phraseCle": [
{
"codeLangue": "eng",
"contenu": "Co-ownership law"
},
{
"codeLangue": "fre",
"contenu": "Droit de la copropriété"
}
]
},
"urlVitrine": [
{
"nom": "Vitrine de la recherche",
"url": "http://www.recherche.umontreal.ca/la-recherche-a-ludem/la-vitrine-des-professeurs/informations/chercheur/7085/"
},
{
"nom": "Répertoire des experts à l’intention des médias",
"url": null
}
],
"recrutementRecherche": false
},
...
]
}
|
Dans le cas des unités de recherche, la liste des résultats se présente de façon identique au service de recherche d’identifiant pérenne pour les unités (/id/uniterech).
{
"paginationSOLR": {
"numFound": 36,
"start": 0,
"rows": 20
},
"data": [
{
"idsadvr": "ur13611",
"nom": "Centre d'études ethniques des universités montréalaises",
"acronyme": "CEETUM",
"responsables": [
{
"idsadvr": "in13629",
"prenom": "Deirdre",
"nom": "Meintel",
"fonction": "Professeure titulaire",
"fonctionCodeSAD": "42001",
"uniteAdmin": "Faculté des arts et des sciences - Département d'anthropologie",
"courriel": "deirdre.meintel@umontreal.ca"
}
],
"visuelOfficiel": "http://www.recherche.umontreal.ca/visuel/uniterech:13611.photoOfficiellePetite"
"visuelOfficielGrand": "http://www.recherche.umontreal.ca/visuel/uniterech:13611.photoOfficielle",
},
{
"idsadvr": "ur13614",
"nom": "Centre de recherche en droit public",
"acronyme": "CRDP",
"responsables": [
{
"idsadvr": "in14999",
"prenom": "Vincent",
"nom": "Gautrais",
"fonction": "Professeur titulaire",
"fonctionCodeSAD": "42001",
"uniteAdmin": "Faculté de droit",
"courriel": "vincent.gautrais@umontreal.ca"
}
],
"visuelOfficiel": "http://www.recherche.umontreal.ca/visuel/uniterech:13614.photoOfficiellePetite"
"visuelOfficielGrand": "http://www.recherche.umontreal.ca/visuel/uniterech:13614.photoOfficielle"
},
...
]
} |
Voici un exemple de code PHP qui récupère les informations de base de tous les individus de l'unité de recherche n° 89, et qui les affiche à l'écran.
$params = [
'uniterech' => 89,
];
$paramString = http_build_query($params);
$route = ' https://www.recherche.umontreal.ca/vitrine/rest/api/1.6/umontreal/info/individu?';
$apiUri = $route . $paramString;
$response = file_get_contents($apiUri);
$json = json_decode($response);
/*** Regarder s'il y a des erreurs dans la réponse ***/
if (isset($json->errors)) {
//Traiter l'erreur
}
/*** La réponse est OK. Prendre les données ***/
$data = $json->data;
foreach ($data as $chercheur) {
echo "ID : " . $chercheur->id . "\n";
echo "Prénom : " . $chercheur->prenom . "\n";
echo "Nom de famille : " . $chercheur->nom . "\n";
echo "Courriel : " . $chercheur->courriel . "\n";
echo "Titre : " . $chercheur->titreFonction . "\n";
echo "Unité : " . $chercheur->uniteAdmin . "\n";
echo "\n";
} |
Le résultat est le suivant.
ID : 1 Prénom : Jurgen Nom de famille : Sygusch Courriel : jurgen.sygusch@umontreal.ca Titre : Professeur titulaire Unité : Faculté de médecine - Département de biochimie & médecine moléculaire ID : 49 Prénom : Jean-Yves Nom de famille : Lapointe Courriel : jean-yves.lapointe@umontreal.ca Titre : Professeur titulaire Unité : Faculté des arts et des sciences - Département de physique |
Les paramètres mis dans $params correspondent aux paramètres du tableau pour chaque requête. Ils peuvent être simples ou en tableau. Les paramètres peuvent être combinés.
Par exemple :
$params = [
'uniterech' => [89, 3, 5],
'faculte' => ['01', '18'],
'departement' => '0101',
'fonction' => '01402'
]; |
va chercher les membres faisant partie
Si l'un des membres n'a pas une information (par exemple, il n'est pas affilié à une unité de recherche), l'attribut est affecté à null.
Voici un exemple de code jQuery qui capte chaque entrée des individus dans des variables, ou qui affiche dans la console les erreurs de la requête.
N'oubliez pas d'inclure une version récente de jQuery dans votre page pour que ce code fonctionne. |
var params = {
'uniterech': 1,
'fonction': ['42001', '42007']
};
$.get('/vitrine/rest/api/1.6/id/individu', params)
.done( function(data) {
data.data.forEach(function(item) {
id = item.id;
nom = item.nom;
prenom = item.prenom;
adresseCourriel = item.courriel;
titre = item.titreFonction;
uniteAdmin = item.uniteAdmin;
//Faire des opérations avec les données
});
})
.fail( function (xhr, textStatus, error) {
var errors = xhr.responseJSON.errors;
if ('uniterech' in errors) {
console.log('Erreur dans arguments de "uniterech" : ' + errors['uniterech']);
} else if ('faculte' in errors) {
console.log('Erreur dans arguments de "faculte" : ' + errors['faculte']);
} else if ('departement' in errors) {
console.log('Erreur dans arguments de "departement" : ' + errors['departement']);
} else if ('fonction' in errors) {
console.log('Erreur dans arguments de "fonction" : ' + errors['fonction']);
} else {
console.log('Erreur interne du serveur : '. errors);
}
}); |
Pour exécuter les tests inclus dans l'application (et vérifier que tout fonctionne), allez au Terminal, naviguez vers le répertoire racine de l'application et tapez la ligne suivante.
php vendor/bin/codecept run |
Il existe plusieurs extensions de navigateur Web qui permettent de mettre en forme la réponse JSON lors de l'affichage dans un navigateur. Cela en facilite la consultation. On retient en particulier JSON Lite pour Firefox (https://addons.mozilla.org/fr/firefox/addon/json-lite/), Chrome (https://chrome.google.com/webstore/detail/json-lite/) et Opera (https://addons.opera.com/fr/extensions/details/json-lite/).
Les paquets installés pour tous les environnements sont :
laravel/framework
league/fractal
Ceux utilisés pour le développement seulement sont :
codeception/codeception
La liste de courriels et le blog pour chaque paquet (notamment pour les failles de sécurité) :
laravel/framework : https://laravel-news.com (s'ajouter à la liste courriel à partir du site)
league/fractal : https://github.com/thephpleague/fractal/issues?q=is%3Aopen+is%3Aissue
UniteRech_fac