mercredi 27 mai 2009

Traitement asynchrone avec une api REST

Une des critiques faite sur REST est le fait de son attachement au protocole HTTP. Ce protocole est "déconnecté" : il est impossible de reprendre une connexion précédente. Cela pose un problème dans le cadre de longs traitements asynchrones et de notifications.

Une possibilité pour palier à cette faiblesse est de considérer elle aussi cette transaction comme une ressource. Cette ressource est retournée immédiatement au client suite au premier appel. Ensuite, le client pourra récupérer l'état de cette transaction. Par exemple, supposons que nous souhaitons lancer un batch "batch1" de manière asynchrone :
  1. GET /batchs/batch1  HTTP/1.1  
  2. Host: xyz.com  
  3. Content-Type: application/xml; charset=utf-8  

  1. HTTP/1.1 200 OK  
  2. Content-Type: application/xml; charset=utf-8  
  3. Location: /transactions/1234  
  4. <ref>http://xyz.com/transactions/1234</ref>  


La réponse est immédiatement renvoyée et contient l'URI de la transaction utilisée. Le client peut consulter cette ressource pour connaitre le status de son traitement en cours.
  1. GET /transactions/1234 HTTP/1.1  
  2. Host: xyz.com  
  3. Content-Type: application/xml; charset=utf-8  

  1. HTTP/1.1 200 OK  
  2. Content-Type: application/xml; charset=utf-8  
  3. Content-Length: nnn  
  4. <transaction>  
  5.  <type>batch1</type>  
  6.  <status>In Progress</status>  
  7. </transaction>