Programmation client, année 2018

Correction des TD 1.

Formats d’échanges sur Internet

Les données transitent sur internet de serveurs à clients, ou de serveurs à serveurs afin de permettre de fournir de l’information de croiser des données, d’améliorer les services sur internet.

Par exemple, dans un formulaire, l’autocompletion peut utiliser des données géographiques fournit par un service tiers comme l’API gouvernementale.

Pour que cela soit possible il faut pouvoir échanger des données entre serveur dans un format qui soit lisible à pour les machines mais aussi pour les humains qui vont devoir utiliser ces services.

Deux formats principaux existent:

  1. Le XML (voir la page wikipedia n’est pas à proprement parlé un format d’échange de données mais un format permettant de structurer des données (à échangé ou à stocker). Le XML fait parti des formats de données à balise tel que le SVG ou le HTML.

  2. Le format JSON (voir la page wikipedia qui permet d’échanger des objets JavaScript. C’est ce dernier qui est le plus souvent utilisé pour les échanges d’informations via des API.

Les deux formats sont en vérité assez proche puisqu’ils décrivent une arborescence (comme un système de fichier informatique). Le format RDF est également un format d’échange (à balise) permettant de définir des notions sémantiques, utile pour faire du raisonnement ontologique.

API

Une API est un ensemble de fonctions (ou de classe et méthodes en programmation orienté objet) permettant d’interagir avec un service. Ces ensembles sont (souvent mais pas tous le temps) documenté et permettent d’interconnecter des services les uns aux autres sans savoir comment fonctionne en interne les services.

Sur internet, le protocole HTTP définit comment les données des services web sont échangés. C’est une surcouche au protocole TCP/IP. Il formalise également des spécification que doivent satisfaire des API utilisant ce protocole: on parle alors d’API REST, explicant l’origine du nom des méthodes GET, POST, PUT, DELETE qu’on croise notamment lorsqu’on réalise des formulaires sur internet.

API et Méthode GET

Pour accéder en lecture aux informations d’une API, on utilise ce qu’on appelle la méthode GET. Il s’agit d’accéder à une ressource en lui transmettant des clefs/ valeurs encodée dans l’URL.

Par exemple, l’url (https://geo.api.gouv.fr/communes?nom=Lille&format=json) se décompose en deux parties, l’url (https://geo.api.gouv.fr/communes) qui contient la description des communes de France, et les clefs valeurs: nom=Lille (on filtre la liste selon le champ “nom”) et format=json (on retourne la liste au format JSON).

En modifiant le champ nom on peut récupérer des informations supplémentaires. Quand le nombre de communes n’est pas trop gros, on peut demander à l’API de classer les communes par taille de population, à l’aide du champ boost=Population. Le résultat va retourner plus ou moins le résultat trié par population. Le premier résultat sera toujours le plus peuplé, mais dans la suite, des inversions peuvent avoir lieu.

Par exemple, la requête https://geo.api.gouv.fr/communes?boost=population&nom=lille&format=json retourne Lillemer (population 324) avant Saint-André-lez-Lille population 11533.

L’API a donc des limites fortes sur les informations qu’on peut en tirer. Il est donc nécessaire de savoir retraiter les données une fois qu’on les a récupérer.

Python, ipython

Python est un langage orienté scripte. Il est adapté pour résoudre des projets de traitements de données, possède un très grand nombre de modules le rendant polyvalent. Un de ces modules, ipython, permet d’interagir interactivement avec Python. L’un des modules de base de Python permet de gérer les fichiers JSON:

#Ceci est un commentaire
import json # charge le module json
chaine_de_characteres = """ 
[{"nom":"Bouligny","population":2655,"code":"55063","_score":0.6332354717228803},{"nom":"Bouligney","population":428,"code":"70083","_score":0.6194980464096772},{"nom":"Bouligneux","population":304,"code":"01052","_score":0.49033441450330295}]
"""  #résultat de la requête https://geo.api.gouv.fr/communes?nom=Boulig&boost=population&fields=nom,population
obj = json.loads(chaine_de_caracteres) #transforme la chaîne en objet manipulable en Python
print(obj[0]["nom"]) #Affiche Bouligny
print(obj[1]["population"]) # Affiche 428

Pour executer le script utiliser la commande python3 nom_du_script.py

Pour trier en fonction de la population plus efficacement qu’avec l’API, on peut également utiliser Python. Dans un terminal, executer la commande:

curl 'https://geo.api.gouv.fr/communes?boost=population&nom=lille&format=json' > fichier.json

Cette commande télécharge le fichier json directement dans votre répertoire personnel. Le script suivant, permet de le lire:

import json 
with open("fichier.json") as f: # ouvre le fichier (en lecture)
    obj = json.load(f) # le transmet au module json

On peut également le trier et le resauvegarder dans le fichier.

import json 
with open("fichier.json") as f: # ouvre le fichier en lecture
    obj = json.load(f) # le transmet au module json
obj.sort(key=lambda e:e["population"], reverse=True) 
#Trie objet en utilisant la population comme clefs de triage par ordre décroissant
# Le trie se fait *en place*, si on veut garder l'objet initial on peut utiliser la fonction sorted
with open("fichier_trie.json", "w") as g: # ouvre (et créer) le fichier en écriture
    json.dump(obj, g) #sauvegarde obj au format json

Correction question 8

Écrire un script en Python qui affiche pour chaque région de France les 10 villes les plus peuplées commençant par la lettre M. Attachez le script au mail.

Pour répondre à cette question, il faut remarquer que les communes viennent avec un code région et qu’on doit donc récupérer pour chaque région son code. En épluchant la documentation de l’API on peut voir que le fichier présent à l’adresse (https://geo.api.gouv.fr/regions) permet d’obtenir la liste de toutes les régions ainsi que leur code région. À l’aide al commande suivante, on peut ainsi télécharger le fichier json correspondant:

curl 'https://geo.api.gouv.fr/regions' > regions.json
curl 'https://geo.api.gouv.fr/communes?nom=M' > communes_M.json 

Le script Python permet de donner pour chaque région de France les 10 plus grandes villes:

import json 
with open("regions.json") as f: 
    regions = json.load(f) # charge les régions
with open("communes_M.json") as f:
    communes = json.load(f) # charge la liste des communes

for region in regions: #région est un dictionnaire {'code':nombre, 'nom':chaine_de_charactères}
    print("Pour la région:", region["nom"])
    Communes_regions = filter(lambda e:
                                  "population" in e and
                                  "codeRegion" in e and
                                  e["codeRegion"] == region["code"], communes) 
    #retourne les communes de la regions (et filtre les communes sans le champ "population"
    Communes_triees = sorted(Communes_regions, key=lambda e: e["population"], reverse=True) 
    #retourne les communes triées 
    for commune in list(Communes_triees)[:10]:
        print("Commune", commune["nom"], commune["population"], "hab")      

Compiled the: dim. 07 janv. 2024 23:19:24 CET