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 Monkeys David Peoples Janet Jackson
Requête PUT /12monkeys.xml (application/xml) :
12 Monkeys Terry Gilliam David Peoples Janet Peoples
Requête PATCH /12monkeys.xsl (application/xslt+xml) :
Janet Peoples Terry Gilliam
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.