web-dev-qa-db-fra.com

Manière REST d'envoyer des commandes

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?

53
Ralph

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: ...
  1. "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

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

70
redben

Je suggère ceci:

  • Créez une ressource que vous pouvez OBTENIR qui vous dira au client comment envoyer la commande, semblable à un formulaire HTML, en utilisant un POST s'il y a des effets secondaires à cette commande.
  • POST sur la ressource pour déclencher la commande et renvoyer l'URI à une nouvelle ressource que vous créez lors de l'exécution de cette demande POST (par exemple 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).
  • Laissez le client vérifier les résultats de cette ressource à l'aide de GET. Vous pouvez également renvoyer la représentation de cette ressource (ou quelque chose de similaire) comme l'entité renvoyée par le POST juste avant).

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.

15
Bruno

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
5
Martin Konecny