Je pense que vous pouvez utiliser une méthode POST ou PATCH pour gérer cela, car ils conçoivent généralement pour cela.
L'utilisation d'une POST
méthode est généralement utilisée pour ajouter un élément lorsqu'elle est utilisée sur une ressource de liste, mais vous pouvez également prendre en charge plusieurs actions pour cette méthode. Consultez cette réponse: Comment mettre à jour une collection de ressources REST . Vous pouvez également prendre en charge différents formats de représentation pour l'entrée (s'ils correspondent à un tableau ou à un seul élément).
Dans ce cas, il n'est pas nécessaire de définir votre format pour décrire la mise à jour.
L'utilisation d'une PATCH
méthode convient également car les requêtes correspondantes correspondent à une mise à jour partielle. Selon RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
Plusieurs applications étendant le protocole HTTP (Hypertext Transfer Protocol) nécessitent une fonctionnalité pour effectuer une modification partielle des ressources. La méthode HTTP PUT existante permet uniquement un remplacement complet d'un document. Cette proposition ajoute une nouvelle méthode HTTP, PATCH, pour modifier une ressource HTTP existante.
Dans ce cas, vous devez définir votre format pour décrire la mise à jour partielle.
Je pense que dans ce cas, POST
et PATCH
sont assez similaires puisque vous n'avez pas vraiment besoin de décrire l'opération à faire pour chaque élément. Je dirais que cela dépend du format de la représentation à envoyer.
Le cas de PUT
est un peu moins clair. En fait, lorsque vous utilisez une méthode PUT
, vous devez fournir la liste complète. En fait, la représentation fournie dans la demande remplacera celle de la ressource de liste.
Vous pouvez avoir deux options concernant les chemins des ressources.
- Utilisation du chemin d'accès aux ressources pour la liste de documents
Dans ce cas, vous devez fournir explicitement le lien des documents avec un classeur dans la représentation que vous fournissez dans la demande.
Voici un exemple d'itinéraire pour cela /docs
.
Le contenu d'une telle approche pourrait être pour la méthode POST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Utilisation du chemin d'accès aux ressources secondaires de l'élément de classeur
En outre, vous pouvez également envisager d'exploiter les sous-itinéraires pour décrire le lien entre les documents et les classeurs. Les conseils concernant l'association entre un document et un classeur n'ont plus à être spécifiés dans le contenu de la requête.
Voici un exemple d'itinéraire pour cela /binder/{binderId}/docs
. Dans ce cas, envoyer une liste de documents avec une méthode POST
ou PATCH
attachera des documents au classeur avec identifiant binderId
après avoir créé le document s'il n'existe pas.
Le contenu d'une telle approche pourrait être pour la méthode POST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
Concernant la réponse, c'est à vous de définir le niveau de réponse et les erreurs à renvoyer. Je vois deux niveaux: le niveau de statut (niveau global) et le niveau de charge utile (niveau plus fin). A vous aussi de définir si toutes les insertions / mises à jour correspondant à votre demande doivent être atomiques ou non.
Dans ce cas, vous pouvez tirer parti de l'état HTTP. Si tout se passe bien, vous obtenez un statut 200
. Sinon, un autre statut comme 400
si les données fournies ne sont pas correctes (par exemple, l'ID du classeur n'est pas valide) ou autre chose.
Dans ce cas, un statut 200
sera retourné et c'est à la représentation de la réponse de décrire ce qui a été fait et où les erreurs se produisent finalement. ElasticSearch a un point de terminaison dans son API REST pour la mise à jour en masse. Cela pourrait vous donner quelques idées à ce niveau: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Vous pouvez également implémenter un traitement asynchrone pour gérer les données fournies. Dans ce cas, l'état HTTP renvoyé sera 202
. Le client doit extraire une ressource supplémentaire pour voir ce qui se passe.
Avant de terminer, je voudrais également noter que la spécification OData aborde le problème des relations entre les entités avec la fonctionnalité nommée liens de navigation . Peut-être pourriez-vous jeter un œil à ceci ;-)
Le lien suivant peut également vous aider: https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
J'espère que ça vous aide, Thierry
GET /docs
et récupérer tous les documents dans un classeur particulierGET /docs?binder_id=x
. Pour supprimer un sous-ensemble des ressources, dois-je appelerDELETE /docs?binder_id=x
ou dois-je appelerDELETE /docs
avec un{"binder_id": x}
dans le corps de la demande? Souhaitez-vous jamais utiliserPATCH /docs?binder_id=x
pour une mise à jour par lots, ou simplementPATCH /docs
et passer des paires?