Séance 3 : requête POST ======================= .. include:: common.rst.inc .. ifslides:: .. include:: credits.rst.inc Introduction ++++++++++++ Motivation ---------- Jusqu'à maintenant, nous n'avons utilisé que des requêtes de consultation (``GET`` et ``HEAD``). Il est parfois nécessaire de *modifier* les données du serveur. C'est notamment ce qui se passe lorsqu'on utilise un formulaire HTML (par exemple pour poster un billet de blog ou passer une commande). Requête POST ++++++++++++ Rappel : structure d'un formulaire ---------------------------------- .. code-block:: html
Que se passe-t-il lorsqu'on clique sur le bouton ? Requête POST de formulaire -------------------------- Le navigateur envoie une requête ``POST`` à l'URL indiquée par l'attribut ``action``. Le *contenu* de cette requête décrit les champs du formulaire, sous la forme suivante :: name=valeur1&email=valeur2&comment=valeur3 Ce format est identifié dans l'entête de message:: content-type: application/x-www-form-urlencoded NB: les *valeurs* doivent être encodées selon un format particulier. En java, la classe `java.net.URLEncoder `_ offre cette fonctionnalité. Autres formats de données ------------------------- Le type de contenu ``application/x-www-form-urlencoded`` est bien adapté pour les formulaires HTML, mais n'est pas le seul possible. Pour les services Web destinés à être utilisés par d'autres programmes, d'autres types (comme XML ou JSON) sont utilisés. .. note:: D'ailleurs, même pour les formulaires HTML, lorsqu'on souhaite téléverser un fichier, on utilise un autre type de contenu : ``multipart/form-data``. Requête POST en Java ++++++++++++++++++++ Exemple ------- .. code-block:: java URL url = new URL("http://httpbin.org/post"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.addRequestProperty("content-type", "application/x-www-form-urlencoded"); conn.setDoOutput(true); OutputStream stream = conn.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(stream); writer.write("hello=world&bonjour=monde"); writer.close(); conn.connect(); .. note:: Cet exemple est un simple test. En situation réelle, il faut construire le contenu du message de manière robuste, notamment en utilisant `java.net.URLEncoder `_. Exemple JSON ------------ .. code-block:: java URL url = new URL("http://httpbin.org/post"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.addRequestProperty("content-type", "application/json"); conn.setDoOutput(true); OutputStream stream = conn.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(stream); writer.write("{ \"hello\": \"world\", \"bonjour\": \"monde\" }"); // writer.close(); conn.connect(); Votre travail +++++++++++++ Le contexte ----------- Nous allons utiliser le `Blog éphémère`__, un service de blog minimaliste dédié à ce cours. __ https://liris-ktbs01.insa-lyon.fr:8000/blogephem/ Votre travail ------------- Écrivez un programme qui * permette à l'utilisateur de saisir un titre et un contenu, * crée sur le blog éphémère un article avec ces informations, * affiche l'URL de l'article créé. En commentaire de votre code, vous expliquerez le travail de rétro-ingénierie que vous aurez effectué pour pouvoir écrire ce programme (par exemple, en affichant le code source du formulaire de création, et en utilisant la console développeur de votre navigateur).