Quelle est la manière «RESTful» d'ajouter des opérations non CRUD à un service RESTful? Disons que j'ai un service qui permet à CRUD d'accéder à des enregistrements comme celui-ci:
GET /api/car/123 <- Returns information for the Car object with ID 123
POST /api/car <- Creates a new car (with properties in the request)
PUT /api/car/123 <- Updates car 123 (with properties in the request)
DELETE /api/car/123 <- Deletes car 123
POST /api/car/123/wheel/ <- Creates a wheel and associates it to car 123
Si je veux changer la couleur de la voiture, je voudrais simplement POST /api/car/123
et inclure une variable POST pour la nouvelle couleur.
Mais disons que je veux acheter une voiture, et cette opération est plus compliquée que la simple mise à jour de la propriété «voiture possédée» d'un enregistrement «utilisateur». Est-il RESTful de simplement faire quelque chose comme POST /api/car/123/purchase
, où «achat» est essentiellement un nom de méthode? Ou devrais-je utiliser un verbe HTTP personnalisé, comme PURCHASE
au lieu de POST
?
Ou les opérations non CRUD sont-elles complètement hors du champ d'application de REST?
la source
PATCH /api/car/123
et d'envoyer un paramètre de couleur OU d'utiliserPUT /api/car/123
et d'envoyer tout l'objet voiture. POST inférerait que vous créez une nouvelle voiture et ne devrait probablement jamais inclure un identifiant à la fin de l'URLRéponses:
Pensez à l' achat en tant qu'entité commerciale ou ressource dans le dictionnaire RESTful. Cela étant dit, faire un achat crée en fait une nouvelle ressource. Alors:
passera une nouvelle commande. Les détails (utilisateur, voiture, etc.) doivent être référencés par identifiant (ou URI) à l'intérieur du contenu envoyé à cette adresse.
Peu importe que commander une voiture ne soit pas qu'un simple INSÉRER dans la base de données. En fait, REST ne consiste pas à exposer vos tables de base de données en tant qu'opérations CRUD. Du point de vue logique, vous créez une commande (achat), mais le côté serveur est libre d'effectuer autant d'étapes de traitement qu'il le souhaite.
Vous pouvez même abuser encore plus du protocole HTTP. Utilisez l'en-
Location
tête pour renvoyer un lien vers la commande nouvellement créée, choisissez soigneusement les codes de réponse HTTP pour informer les utilisateurs des problèmes (côté serveur ou côté client), etc.la source
La manière RESTful si je comprends bien, c'est que vous n'avez pas besoin de nouveaux verbes HTTP, il y a un nom quelque part qui signifiera ce que vous devez faire.
Acheter une voiture? Eh bien n'est-ce pas
la source
Ce que vous faites vraiment, c'est créer une commande. Ajoutez donc une autre ressource pour la commande et la publication et mettez-la là pendant le processus de commande.
Pensez en termes de ressources plutôt que d'appels de méthodes.
Pour finaliser la commande, vous devez probablement POST / api / order // complet ou quelque chose de similaire.
la source
Je pense que les API REST aident de bien plus de manières que la simple fourniture de sémantique. Vous ne pouvez donc pas choisir le style RPC uniquement à cause de certains appels qui semblent avoir plus de sens dans le style d'opération RPC. Un exemple est l'API google maps pour trouver des directions entre deux endroits. Cela ressemble à ceci: http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal
Ils auraient pu l'appeler "findDirections" (verbe) et le traiter comme une opération. Au contraire, ils ont fait de la "direction" (nom) une ressource et ont traité la recherche de directions comme une requête sur la ressource de directions (bien qu'en interne, il ne puisse y avoir de véritable ressource appelée direction et elle pourrait être implémentée par la logique métier pour trouver des directions basées sur des paramètres).
la source