Séance 3 : requête POST

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

<form action="./comment/create" method="POST">
  <label>Nom : <input name="name"></label>
  <label>Adresse mél : <input name="email"></label>
  <label>Commentaire : <textarea name="comment"></textarea></label>
  <button>Laisser un commentaire</button>
</form>

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

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

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.

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