N'oubliez pas qu'avec une API REST, tout dépend de votre point de vue.
Les deux concepts clés d'une API REST sont les points de terminaison et les ressources (entités). En gros, un point de terminaison retourne des ressources via GET ou accepte des ressources via POST et PUT et ainsi de suite (ou une combinaison des éléments ci-dessus).
Il est admis qu'avec POST, les données que vous envoyez peuvent ou non entraîner la création d'une nouvelle ressource et de son ou ses points de terminaison associés, qui ne «vivront» probablement pas sous l'URL POSTée. En d'autres termes, lorsque vous POSTEZ, vous envoyez des données quelque part pour les manipuler. Le point de terminaison POST n'est pas l'endroit où la ressource peut normalement être trouvée.
Citant la RFC 2616 (avec les parties non pertinentes omises et les parties pertinentes mises en évidence):
9.5 POST
La méthode POST est utilisée pour demander que le serveur d'origine accepte l'entité incluse dans la demande en tant que nouveau subordonné de la ressource identifiée par l'URI de demande dans la ligne de demande. POST est conçu pour permettre à une méthode uniforme de couvrir les fonctions suivantes:
- ...
- Fournir un bloc de données, tel que le résultat de la soumission d'un formulaire, à un processus de traitement de données;
- ...
...
L'action effectuée par la méthode POST peut ne pas aboutir à une ressource identifiable par un URI . Dans ce cas, 200 (OK) ou 204 (Pas de contenu) est le statut de réponse approprié, selon que la réponse inclut ou non une entité qui décrit le résultat .
Si une ressource a été créée sur le serveur d'origine, la réponse DEVRAIT être 201 (Créé) ...
Nous nous sommes habitués aux points de terminaison et aux ressources représentant des «choses» ou des «données», que ce soit un utilisateur, un message, un livre - quel que soit le domaine du problème. Cependant, un point de terminaison peut également exposer une ressource différente, par exemple des résultats de recherche.
Prenons l'exemple suivant:
GET /books?author=AUTHOR
POST /books
PUT /books/ID
DELETE /books/ID
Il s'agit d'un CRUD REST typique. Mais que faire si nous ajoutions:
POST /books/search
{
"keywords": "...",
"yearRange": {"from": 1945, "to": 2003},
"genre": "..."
}
Il n'y a rien de non-RESTful à propos de ce point de terminaison. Il accepte des données (entité) sous la forme du corps de la requête. Ces données sont les critères de recherche - un DTO comme les autres. Ce point de terminaison produit une ressource (entité) en réponse à la demande: Résultats de la recherche . La ressource de résultats de recherche est temporaire, servie immédiatement au client, sans redirection et sans être exposée à partir d'une autre URL canonique.
Il s'agit toujours de REST, sauf que les entités ne sont pas des livres - l'entité de demande est des critères de recherche de livres et l'entité de réponse est des résultats de recherche de livres.