J'ai une collection de produits dans un groupe de produits, par exemple:
product-groups/123/products
Si je dois ajouter à la collection, est-ce OK que je ne passe que certains produits avec PUT?
Si je dois supprimer certains produits de la collection, est-ce OK que je passe des données de filtre (un tableau d'ID) avec DELETE?
Quelle est la meilleure façon de mettre en œuvre la fonctionnalité dans l'esprit de ReST?
Modifier: les articles sont des liens vers des entités distinctes, essentiellement des ID de produits.
rest
collections
user151851
la source
la source
Réponses:
En général, vous avez un point de terminaison qui représente l'ensemble de la collection de x :
Dites, vous souhaitez mettre à jour un seul produit, vous faites un PUT à
/products/{id}
. Si vous souhaitez mettre à jour partiellement un seul produit (pas mettre à jour tous les champs), vous pouvez également utiliser un PATCH pour/products/{id}
. Il en va de même pour la suppression d'une seule entité ( DELETE to/products/{id}
).Si vous souhaitez cibler une seule ressource, vous qualifiez via path, quelle ressource unique , vous souhaitez modifier.
La seule action qui rompt le schéma est la création d'une ressource. Lorsque vous créez une ressource, vous ciblez la collection dans son ensemble, dites POST to
/products
.Cela dit, il doit être clair que l'objectif des opérations affectant la collection dans son ensemble doit aller au point de terminaison de collecte approprié.
Par exemple, vous souhaitez récupérer un sous-ensemble de produits qui sont rouges, vous le demandez par
GET to
/products?colour=red
.Donc, si vous souhaitez supprimer tout cela, vous SUPPRIMEZ
/products?colour=red
. Ou si vous souhaitez supprimer certains produits viaid
, vous pouvez SUPPRIMER/products?id=1&id=2&id=3
.Qu'en est-il de la création en masse de ressources? POSTEZ votre collection
[{...},{...},{...}]
simplement/products
. Il en va de même pour PUT et PATCH .C'est vraiment simple.
Pour répondre à vos questions:
Ce n'est pas seulement OK, vous êtes encouragé à le faire comme ça.
C'est bon. Comme l'a écrit Eneko Alonso, il y a parfois des opérations en bloc encapsulées via des points de terminaison "contrôleur", c'est-à-dire qu'un POST est utilisé pour déclencher des opérations (complexes).
la source
PATCH
, et un remplacement complet viaPUT
.Habituellement, les méthodes REST sont destinées à fonctionner sur une seule entité / objet (CRUD).
Il existe plusieurs options:
Le premier suit les normes REST, mais peut être coûteux, car vos objets / entités de collection peuvent être très volumineux (la mise à jour d'un groupe qui a des milliers de produits juste pour ajouter / supprimer un produit serait une lourde demande).
La deuxième option est préférée par de nombreuses API, comme un moyen d'étendre REST au-delà des opérations CRUD.
Par exemple:
De nombreuses API utilisent toujours POST pour ces opérations étendues, mais rien ne vous limite à utiliser d'autres méthodes http (autres que la limitation de GET et DELETE pour avoir un corps vide)
la source
products/collection
renvoyer une «enveloppe» d'articles et le contenu de l'enveloppe modifié via un PUT? Comme, "voici exactement comment je veux que les articles de la collection soient".Juste pour préciser les réponses / commentaires précédents.
Selon mes connaissances, POST est la méthode pour ajouter des éléments uniques à la collection.
SUPPRIMER à son tour, est la méthode pour supprimer un seul élément de la collection. Les deux scénarios sont parfaitement RESTful.
Cependant, vous devez utiliser l'URI approprié pour référencer un seul élément ou la collection entière.
Par exemple, pour ajouter un élément à la collection, vous devez POSTER les données sur l'URI suivant:
Pour supprimer un seul produit de la collection, vous pouvez utiliser la méthode DELETE pour envoyer une demande à quelque chose comme:
La méthode PATCH peut être utilisée pour mettre à jour certains éléments de la collection. Par exemple, lorsque vous avez seulement besoin de mettre à jour un champ dans un élément. METTRE une représentation complète des ressources pour une très grande collection peut être une opération très coûteuse.
la source
En principe, toutes les opérations RESTful sont valides sur une collection, mais assurez-vous de comprendre comment la sémantique des verbes s'applique à une collection:
PUT est un remplacement complet .
/item/{id}
) et omettezname
, il doit être effacé ou défini sur null ou quelque chose de similaire.Bien qu'un PUT puisse être utilisé pour ajouter des éléments, vous devez envoyer "tous" les éléments. L'envoi de "certains" articles devrait entraîner des suppressions (je suppose que ce n'est pas ce que désire le PO).
DELETE est plus intuitif. Il est valide de supprimer la collection ou tout sous-ensemble filtré de celle-ci. Seuls les éléments inclus dans le filtre doivent être affectés.
PATCH est également valide. En théorie, vous êtes censé fournir une liste "d'opérations". Par exemple, vous devez techniquement envoyer quelque chose comme:
En pratique, il est plus courant de voir une API qui accepte une liste partielle d'objets où chaque élément est traité à l'aide d'une logique UPSERT (mise à jour ou insertion).
Techniquement, POST devrait traiter l'entrée "selon la sémantique spécifique de la ressource".
{resource}/activate
.REMARQUE: lorsque vous utilisez des opérations non GET sur des collections, examinez attentivement la définition du succès et de l'échec. REST ne vous donne pas un bon moyen de communiquer un succès partiel. Une bonne valeur par défaut consiste à supposer que vous exécuterez l'opération dans une transaction avec des critères de réussite tout ou rien. Si ce n'est pas ce que vous voulez, vous ne devriez probablement pas interagir directement avec la collection.
la source