Comment envoyez-vous des "commandes" à un serveur RESTful?
Cas d'utilisation: mon serveur met en cache certaines informations afin de ne pas avoir à lire la base de données chaque fois que ces informations sont demandées. J'ai besoin d'un moyen d'envoyer une commande à partir de mon application cliente pour dire au serveur de vider le cache. Souhaitez-vous utiliser POST
ou PUT
sur une URL comme ".../flush_cache
"?
La "commande" n'est pas vraiment des données qui nécessitent un "transfert d'état représentatif", à moins que l'état en cours de transfert ne soit le résultat de la commande - "interrupteur désactivé", "cache vidé", etc. En règle générale, comment REST envoyer des commandes au serveur?
J'ai souvent rencontré une telle situation dans un projet antérieur. Étant donné que REST est bien ... sur les ressources, il n'est pas toujours clair comment gérer les choses qui sont vraiment de nature RPC.
Un moyen facile de contourner cela est de le considérer comme la partie bureaucratique du reste, la demande peut être une ressource elle-même:
1 . "Vous souhaitez déclencher une commande sur mon serveur? Remplissez d'abord ce formulaire I90292 et envoyez-le nous":
POST /bureaucracy/command-request
Content-Type: application/x-www-form-urlencoded
Content-Length: ...
"D'accord, nous verrons ce que nous pouvons faire. Votre numéro de dossier est le 999"
201 créé (ou 202 accepté selon le commentaire de Kugel) Emplacement/bureaucratie/commande-demande/999
Et puis le client vérifie régulièrement
GET/bureaucratie/commande-demande/999
J'espère qu'il obtiendra une réponse comme celle-ci
200 OK
<command-request>
<number>999</number>
...
<result>Success</result>
</command-request>
Bien sûr, si le service bureaucratique a un excellent service client, il offrirait au client de l'appeler quand il le fera s'il le souhaite:
"Vous souhaitez déclencher une commande sur notre serveur? Veuillez remplir ce formulaire et nous l'envoyer. Notez que vous pouvez joindre vos coordonnées afin que nous puissions vous appeler une fois terminé"
POST /bureaucracy/command-request?callback=client.com/bureaucracy/inbox
Ou en tant qu'en-tête http personnalisé X-Callback: http://client.com/bureaucracy/inbox
Je suggère ceci:
http://server.example/results/00001
), peut-être avec un statut 204 (sans contenu) et un en-tête d'emplacement ou une redirection (selon le client qui peut comprendre).C'est à vous de décider du cycle de vie de la ressource de résultat. Cela peut être de courte durée si vous n'avez pas besoin de stocker les résultats pour longtemps. L'URI pourrait être construit à partir d'un UUID par exemple.
Dans votre cas, pourquoi ne pas faire du cache
la ressource?
DELETE /cache
Lorsque vous souhaitez le rincer.
POST /cache
lorsque vous voulez en créer un nouveau.
Ou combinez les deux précédents comme suit:
DELETE /cache?autorecreate=true