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).