.. _action api: ======================================================================== Espace developpeurs ======================================================================== Cette section documente l'API de CKAN, pour les développeurs qui veulent écrire du code qui interagit avec les sites CKAN et leurs données. L'API **Action** de CKAN est une puissante API de type RPC qui expose toutes les fonctionnalités de base de CKAN aux clients API. de CKAN aux clients de l'API. Toutes les fonctionnalités de base d'un site CKAN (tout ce que vous pouvez faire avec l'interface Web et plus encore) peuvent être utilisées par du code externe qui appelle l'API CKAN. code externe qui appelle l'API CKAN. Par exemple, en utilisant l'API CKAN, votre application peut: * Obtenez des listes formatées en JSON des jeux de données, thematiques ou autres objets: La liste des jeux de donnees: http://demo.ckan.org/api/3/action/package_list Les thematiques: http://demo.ckan.org/api/3/action/group_list Les mots-cles: http://demo.ckan.org/api/3/action/tag_list * Obtenez une représentation JSON complète d'un ensemble de données, d'une ressource ou d'un autre objet: http://demo.ckan.org/api/3/action/package_show?id=adur_district_spending http://demo.ckan.org/api/3/action/tag_show?id=gold http://demo.ckan.org/api/3/action/group_show?id=data-explorer * Recherche de jeux de donnees ou de ressources correspondant à une requête: http://demo.ckan.org/api/3/action/package_search?q=spending http://demo.ckan.org/api/3/action/resource_search?query=name:District%20Names * Créer, mettre à jour et supprimer des ensembles de données, des ressources et d'autres objets * Obtenez un flux d'activité des ensembles de données récemment modifiés sur un site: http://demo.ckan.org/api/3/action/recently_changed_packages_activity_list ------------------------- Effectuer une requête API ------------------------- Pour appeler l'API CKAN, envoyez un dictionnaire JSON dans une requête HTTP POST vers l'une des URL API de CKAN. URL de l'API CKAN. Les paramètres de la fonction API doivent être indiqués dans le dictionnaire dictionnaire JSON. CKAN renverra également sa réponse dans un dictionnaire JSON. Une façon de poster un dictionnaire JSON à une URL est d'utiliser la ligne de commande client `Curl `_. Par exemple, pour obtenir une liste des noms de tous les ensembles de données dans le ``data-explorer`` sur demo.ckan.org, installez curl, puis appelez la fonction API ``group_list`` en exécutant cette commande dans un terminal :: curl https://demo.ckan.org/api/3/action/group_list La réponse de CKAN ressemblera à ceci :: { "help": "...", "result": [ "data-explorer", "department-of-ricky", "geo-examples", "geothermal-data", "reykjavik", "skeenawild-conservation-trust" ], "success": true } La réponse est un dictionnaire JSON avec trois clés: 1. ``"success"``: ``true`` or ``false``. L'API a pour objectif de toujours renvoyer le code d'état ``200 OK`` dans sa réponse HTTP qu'il y ait eu ou non des erreurs dans la requête. de toujours vérifier la valeur de la clé "success" dans le dictionnaire des réponses et et (si le succès est ``false``) de vérifier la valeur de la clé ``"error"``. de la clé. .. note:: Si une requête à l'API présente des problèmes de formatage majeurs, CKAN peut tout de même renvoyer une réponse HTTP avec un code d'état ``409``, ``400`` ou ``500`` (par ordre croissant de gravité). 2. ``"result"``: le résultat retourné par la fonction que vous avez appelée. Le type et la valeur du résultat dépendent de la fonction que vous avez appelée. Dans le cas de la fonction Dans le cas de la fonction ``group_list``, il s'agit d'une liste de chaînes de caractères, les noms de tous les ensembles de données qui appartiennent au groupe. S'il y a eu une erreur en répondant à votre requête, le dictionnaire contiendra contiendra une clé ``"error"`` avec les détails de l'erreur à la place de la clé clé ``"result"``. Un dictionnaire de réponse contenant une erreur aura l'aspect suivant ceci:: { "help": "Creates a package", "success": false, "error": { "message": "Access denied", "__type": "Authorization Error" } } 3. ``"help"``: la chaîne de documentation de la fonction que vous avez appelée. La même requête HTTP peut être effectuée en utilisant le module standard ``urllib2`` de Python, avec ce code Python:: #!/usr/bin/env python import urllib2 import urllib import json import pprint # Effectuer la requête HTTP. response = urllib2.urlopen('http://demo.ckan.org/api/3/action/group_list', data_string) assert response.code == 200 # Utilisez le module json pour charger la réponse de CKAN dans un dictionnaire. response_dict = json.loads(response.read()) # Vérifier le contenu de la réponse. assert response_dict['success'] is True result = response_dict['result'] pprint.pprint(result) ------------------------------------------------------------------------------------------------------- Exemple : Importation de jeux de données avec l'API CKAN ------------------------------------------------------------------------------------------------------- Vous pouvez ajouter des ensembles de données à l'aide de l'interface Web de CKAN, mais lorsque vous importez de nombreux ensembles de données, il est généralement plus efficace d'automatiser le processus. ensembles de données, il est généralement plus efficace d'automatiser le processus d'une manière ou d'une autre. Dans Dans cet exemple, nous allons vous montrer comment utiliser l'API CKAN pour écrire un script Python pour importer des jeux de données dans CKAN. pour importer des jeux de données dans CKAN. :: #!/usr/bin/env python import urllib2 import urllib import json import pprint # Mettez les détails de l'ensemble de données que nous allons créer dans un dict. dataset_dict = { 'name': 'my_dataset_name', 'notes': 'A long description of my dataset', 'owner_org': 'org_id_or_name' } # Utilisez le module json pour convertir le dictionnaire en une chaîne de caractères à afficher. data_string = urllib.quote(json.dumps(dataset_dict)) # Nous allons utiliser la fonction package_create pour créer un nouvel ensemble de données. request = urllib2.Request( 'http://www.my_ckan_site.com/api/action/package_create') # La création d'un jeu de données nécessite un en-tête d'autorisation. # Remplacez *** par votre clé API, provenant de votre compte utilisateur sur le site CKAN. # sur lequel vous créez le jeu de données. request.add_header('Authorization', '***') # Effectuer la requête HTTP. response = urllib2.urlopen(request, data_string) assert response.code == 200 # Utilisez le module json pour charger la réponse de CKAN dans un dictionnaire. response_dict = json.loads(response.read()) assert response_dict['success'] is True # package_create renvoie le paquet créé comme résultat. created_package = response_dict['result'] pprint.pprint(created_package) ---------------------------------------------------------------------- API versions ---------------------------------------------------------------------- Les API de CKAN sont classées par version. Si vous faites une demande à une URL d'API sans numéro de version, CKAN choisira la dernière version de l'API. numéro de version, CKAN choisira la dernière version de l'API :: http://demo.ckan.org/api/action/package_list Alternativement, vous pouvez spécifier le numéro de version de l'API souhaité dans l'URL que vous demandez:: http://demo.ckan.org/api/3/action/package_list La version 3 est actuellement la seule version de l'API d'action. Nous vous recommandons de spécifier le numéro d'API dans vos requêtes, car ceci car cela garantit que votre client API fonctionnera sur différents sites exécutant différentes différentes versions de CKAN (et continuera à fonctionner sur les mêmes sites, lorsque ces sites lorsque ces sites passeront à une nouvelle version de CKAN). Comme la dernière version de l'API peut changer lorsqu'un site est mis à niveau vers une nouvelle version de CKAN, ou peut différer sur différents sites exécutant différentes versions de CKAN, le résultat d'une demande d'API qui ne spécifie pas le numéro de version de l'API ne peut pas être fiable. .. _api authentication: --------------------------------------------------------------------------------------- Authentification et jetons d'API --------------------------------------------------------------------------------------- Certaines fonctions de l'API nécessitent une autorisation. L'API utilise les mêmes fonctions d'autorisation fonctions d'autorisation et de configuration que l'interface Web, donc si un utilisateur est autorisé à faire quelque chose dans l'interface Web, il sera également autorisé à le faire via l'API. également. Lorsque vous appelez une fonction API qui nécessite une autorisation, vous devez vous authentifier en fournissant une clé d'authentification avec votre requête requête HTTP. À partir de CKAN 2.9, il est recommandé d'utiliser des jetons d'API. Il s'agit de des clés cryptées qui peuvent être générées manuellement à partir de l'interface utilisateur (Profil utilisateur > Gérer > Jetons d'API) ou via la fonction :py:func:`~ckan.logic.action.create.api_token_create`. Un utilisateur peut créer autant de jetons que nécessaire pour différentes utilisations, et révoquer un ou plusieurs jetons à tout moment. En outre, l'activation le plugin central ``expire_api_token`` permet de définir la date d'expiration d'un jeton. Pour fournir votre jeton API dans une requête HTTP, incluez-le dans un en-tête ``Authorization`` ou ``X-CKAN-API-Key``. Par exemple, pour demander si vous suivez ou non l'utilisateur ``markw`` sur demo.ckan.org en utilisant curl, exécutez cette commande:: curl -H "Authorization: XXX" https://demo.ckan.org/api/3/action/am_following_user?id=markw (Remplacer ``XXX`` par votre jeton d'API.) Ou, pour obtenir la liste des activités à partir de votre tableau de bord utilisateur sur demo.ckan.org, exécutez ce code Python:: request = urllib2.Request('https://demo.ckan.org/api/3/action/dashboard_activity_list') request.add_header('Authorization', 'XXX') response_dict = json.loads(urllib2.urlopen(request, '{}').read()) ----------------------------------------------------------------- Support JSONP ----------------------------------------------------------------- Pour répondre aux scripts d'autres sites qui souhaitent accéder à l'API, les données peuvent être renvoyées au format JSONP, où les données JSON sont "complétées" par un appel de fonction. appel de fonction. La fonction est nommée dans le paramètre "callback". Par exemple: http://demo.ckan.org/api/3/action/package_show?id=adur_district_spending&callback=myfunction .. note :: This only works for GET requests .. _api-examples: ------------ API Examples ------------ Tags (not in a vocabulary) ========================== Liste de tous les mots-cles: * navigateur: http://demo.ckan.org/api/3/action/tag_list * curl: ``curl http://demo.ckan.org/api/3/action/tag_list`` * ckanapi: ``ckanapi -r http://demo.ckan.org action tag_list`` Top 10 des mots-cles utilisés par les jeux de données: * navigateur: http://demo.ckan.org/api/action/package_search?facet.field=[%22tags%22]&facet.limit=10&rows=0 * curl: ``curl 'http://demo.ckan.org/api/action/package_search?facet.field=\["tags"\]&facet.limit=10&rows=0'`` * ckanapi: ``ckanapi -r http://demo.ckan.org action package_search facet.field='["tags"]' facet.limit=10 rows=0`` Tous les jeux de données qui ont le mots-cles 'économie': * navigateur: http://demo.ckan.org/api/3/action/package_search?fq=tags:economy * curl: ``curl 'http://demo.ckan.org/api/3/action/package_search?fq=tags:economy'`` * ckanapi: ``ckanapi -r http://demo.ckan.org action package_search fq='tags:economy'`` Tag Vocabularies ================ Les 10 mots-cles et mots-cles de vocabulaire utilisés par les jeux de données * navigateur: http://demo.ckan.org/api/action/package_search?facet.field=[%22tags%22]&facet.limit=10&rows=0 * curl: ``curl 'http://demo.ckan.org/api/action/package_search?facet.field=\["tags"\]&facet.limit=10&rows=0'`` * ckanapi: ``ckanapi -r http://demo.ckan.org action package_search facet.field='["tags"]' facet.limit=10 rows=0`` Par exemple, Facet : `vocab_Topics` signifie qu'il y a un vocabulaire appelé Topics, et que ses tags les plus importants sont listés sous ce vocabulaire. Une liste de jeux de données utilisant le mots-cles 'éducation' du vocabulaire 'Topics' : * navigateur: https://data.hdx.rwlabs.org/api/3/action/package_search?fq=vocab_Topics:education * curl: ``curl 'https://data.hdx.rwlabs.org/api/3/action/package_search?fq=vocab_Topics:education'`` * ckanapi: ``ckanapi -r https://data.hdx.rwlabs.org action package_search fq='vocab_Topics:education'`` Téléchargement d'une nouvelle version d'un fichier de ressources ===================================================================================================================== Vous pouvez utiliser le paramètre ``upload`` de la fonction :py:func:`~ckan.logic.action.patch.resource_patch` pour télécharger une nouvelle version d'un fichier de ressources. Cela nécessite une requête ``multipart/form-data``. Avec curl, vous pouvez le faire en utilisant la requête ``@file.csv``:: curl -X POST -H "Content-Type: multipart/form-data" -H "Authorization: XXXX" -F "id=" -F "upload=@updated_file.csv" https://demo.ckan.org/api/3/action/resource_patch