Depuis mars 2010, HTTP a une nouvelle méthode : PATCH. C'est un événement car HTTP a un jeu restreint de méthodes (l'interface uniforme) qui n'avait pas connu d'ajout depuis 1997.

Historique

En 1996, HTTP 1.0 est standardisé avec les méthodes suivantes (qui sont celles utilisées par le Web "classique", celui des sites comme Wikipedia ou Amazon) :

  • GET pour obtenir une représentation de ressource
  • POST pour créer, modifier ou détruire une ressource
  • (Et HEAD, que nous ne détaillerons pas)

En 1997, HTTP 1.1 introduit de nouvelles méthodes, principalement pour soulager POST, ce qui donne l'interface uniforme suivante (utilisée par les Web Services REST) :

  • GET pour obtenir une ressource
  • POST pour créer une ressource
  • PUT pour modifier une ressource
  • DELETE pour détruire une ressource
  • (Et HEAD, TRACE, CONNECT et OPTIONS que nous ne détaillerons pas)

En 2010, a donc été ajouté PATCH, pour modifier des ressources.

PUT et PATCH

Nous avons désormais deux méthodes qui permettent de modifier des ressources, mais elles diffèrent grandement :

  • Le corps d'une requête PUT contient la nouvelle représentation de la ressource. Le corps d'une requête PATCH contient juste des instructions permettant au serveur d'effectuer la modification.
  • Par conséquent, le corps d'une requête PATCH n'est pas forcément du même type que la représentation de la ressource qui sera modifiée.
  • PATCH ne peut pas créer une nouvelle ressource, même en lui spécifiant une URI encore inutilisée.
  • Ni PUT ni PATCH ne sont sûres. Mais seule PUT est idempotente.

Exemples

Le corps des messages HTTP sont qualifiés par un type de média et PATCH ne fait pas exception. Le type application/x-www-urlencoded étant déconseillé pour PUT, nous allons nous intéresser aux types suivants :

Format text/plain et dérivés

Si la ressource est du texte simple, nous ne pouvons pas utiliser des expressions régulières pour PATCH car ces dernières ne sont pas identifiables par un type de média. Voici donc la requête avec un fichier diff.

Réponse GET /12monkeys.txt (text/plain) :

Title  12 Monkeys
Writter  David Peoples  Janet Jackson

Requête PUT /12monkeys.txt (text/plain) :

Title  12 Monkeys
Director  Terry Gilliam
Writter  David Peoples  Janet Peoples

Requête PATCH /12monkeys.txt (text/x-patch) :

2c2,3
< Writter  David Peoples  Janet Jackson
---
> Director  Terry Gilliam
> Writter  David Peoples  Janet Peoples

Format application/xml et dérivés

Pour du XML, en attendant que XML Patch soit mûr, voici une proposition utilisant XSL.

Réponse GET /12monkeys.xml (application/xml) :

12 MonkeysDavid PeoplesJanet Jackson

Requête PUT /12monkeys.xml (application/xml) :

12 MonkeysTerry GilliamDavid PeoplesJanet Peoples

Requête PATCH /12monkeys.xsl (application/xslt+xml) :

Conclusion

L'utilité de PATCH est évidente quand on doit manipuler des ressources volumineuses (ce qui n'est pas le cas de nos exemples) car cette méthode réduit la taille des messages au prix d'un traitement côté serveur.

Il s'agit d'une méthode encore confidentielle, sans implémentation connue. Je ne suis pas sûr qu'elle s'imposera un jour, mais j'ai hâte de voir les utilisations qui pourront en être faites.

Pour en savoir plus, vous pouvez lire le billet de Stéphane Bortzmeyer.