La Collecte en vrac de Manipulation par le biais d'un REPOS (RESTful) de l'API
J'aimerais avoir quelques conseils sur la conception d'une API REST qui permettra aux clients d'ajouter/supprimer un grand nombre d'objets d'une collection efficacement.
Via l'API, les clients doivent être en mesure d'ajouter des éléments à la collection et supprimer des éléments, ainsi que la manipulation d'éléments existants. Dans de nombreux cas, le client voudra s'en vrac mises à jour de la collection, par exemple l'ajout de 1000 articles et la suppression de 500 articles différents. Il se sent comme le client doit être en mesure de le faire en une seule transaction avec le serveur, plutôt que d'avoir 1000 séparer les requêtes POST et 500 Suppressions.
Quelqu'un a une info sur les meilleures pratiques ou des conventions pour la réalisation de cet?
Actuel de ma réflexion est que l'on devrait être en mesure de METTRE un objet représentant la variation de la collection URI, mais cela semble en contradiction avec la HTTP 1.1 RFC, qui semble suggérer que les données envoyées dans une demande doit être interprété de façon indépendante à partir des données déjà présentes lors de l'URI. Cela implique que le client devra envoyer une description complète de ce nouvel état de la collection d'un seul coup, ce qui pourrait bien être beaucoup plus grand que le changement, ou même être plus que le client sait quand ils en font la demande.
Évidemment, je serais heureux de s'écarter de la RFC si nécessaire, mais préférez le faire de manière classique, si une telle convention existe.
- Contrôlez-vous les clients à l'aide de votre API ou avez-vous besoin de support client existant de produits? En d'autres termes: vous Êtes libre de définir la sémantique de la demande des entités?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez penser le changement de tâche comme une ressource en soi. Si vous êtes vraiment MIS-ing un objet unique, qui est un bloc de Données de mise à Jour de l'objet. Peut-être qu'il a un nom, propriétaire, et de gros blob de CSV, XML, etc. qui doit être interprétée et exécutée. Dans le cas de CSV vous pouvez aussi identifier quels types d'objets sont représentés dans les données au format CSV.
Liste des emplois, ajouter une tâche, d'afficher l'état d'une tâche de mise à jour d'un travail (probablement dans le but de le démarrer/l'arrêter), supprimer un travail (de l'arrêter si elle est en cours d'exécution) etc. Ces opérations de carte facilement sur une API REST de conception.
Une fois que vous avez cela en place, vous pouvez facilement ajouter différents types de données que votre grande quantité de données de mise à jour peut gérer, peut-être même mélangés dans la même tâche. Il n'y a pas besoin d'avoir cette même API dupliqué partout dans votre application pour chaque type de chose que vous voulez importer, en d'autres termes.
Cela se prête également très facilement à l'arrière-plan-mise en œuvre des tâches. Dans ce cas, vous voudrez probablement ajouter des champs à la tâche individuelle des objets qui permettent à l'API client de spécifier la façon dont ils veulent être informé (une URL qu'ils veulent que vous OBTENEZ lorsque c'est fait, ou de leur envoyer un e-mail, etc.).
Oui, METTRE crée/remplace, mais n'a pas partiellement mise à jour.
Si vous avez besoin de mise à jour partielle de la sémantique, de l'utilisation de PATCH. Voir http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-14.html.
Vous devez utiliser AtomPub. Il est spécifiquement conçu pour la gestion des collections via HTTP. Il pourrait même être une mise en œuvre pour la langue de votre choix.
Pour les Postes, au moins, il semble que vous devriez être en mesure de publier une liste d'URL et le corps de la requête contient une liste de nouvelles ressources au lieu d'une seule ressource.
Aussi loin que je le comprends, RESTE signifie REpresentational State Transfer, vous devez transférer l'état du serveur vers le client.
Si cela signifie que trop de données va-et-vient, peut-être vous avez besoin de changer votre représentation. Un collectionChange structure de travail, avec une série de suppressions (id) et les ajouts (avec des plein Représentations xml), Posté à une interface de manipulation de l'URL. L'interface de l'application peut choisir sa propre méthode pour les suppressions et les ajouts côté serveur.
La plus pure version serait probablement de définir les éléments de l'URL, et la collection contient une série d'Url. La nouvelle collection peut être MIS après les modifications apportées par le client, suivi par une série de Met les éléments ajoutés, et peut-être une série de suppressions si vous souhaitez réellement supprimer les éléments à partir du serveur plutôt que de simplement les supprimer de cette liste.
Vous pourriez présenter des méta-représentation de la collection existante éléments qui n'ont pas besoin de la totalité de leur état de transfert, de sorte que certains code abstrait votre mise à jour pourrait ressembler à ceci:
De l'ajout (et de modifier) les éléments se fait par la définition de leurs valeurs, de la suppression des éléments se fait par pas de mentionner la nouvelle collection et la réorganisation des éléments se fait en spécifiant l'ordre nouveau (si la commande est stockée à tous).
De cette façon, vous pouvez facilement représenter l'ensemble de la nouvelle collection sans avoir à re-transmettre tout contenu. À l'aide d'un
If-Unmodified-Since
en-tête permet de s'assurer que votre idée du contenu, en effet, correspond à l'serveurs idée (de sorte que vous n'avez pas accidentellement supprimer des éléments que vous simplement ne connaissais pas lorsque la demande a été soumise).PUT
sur le serveur deux fois (peut-être par accident), vous pourriez vous retrouver avec un corrompu de la collection; par exemple, l'élément no. 105 sera un autre élément de la deuxième fois que la première fois; les différents éléments 101-104 sera effacé la 2ème fois.