72 votes

Manipulation de la collecte en bloc via une API REST (RESTful)

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 aurait-il des infos sur les meilleures pratiques ou des conventions pour atteindre cet objectif?

Ma pensée 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 le 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.

62voto

Jamie Flournoy Points 14769

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.).

9voto

Julian Reschke Points 12698

Oui, PUT crée / remplace, mais ne met pas à jour partiellement.

Si vous avez besoin d'une sémantique de mise à jour partielle, utilisez PATCH. Voir http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-14.html .

2voto

dowski Points 2143

Vous devriez utiliser AtomPub . Il est spécialement conçu pour gérer les collections via HTTP. Il pourrait même y avoir une implémentation pour la langue de votre choix.

2voto

Hank Gay Points 36173

Pour les POST, au moins, il semble que vous devriez pouvoir poster une URL de liste et que le corps de la demande contienne une liste de nouvelles ressources au lieu d'une seule.

1voto

Phil H Points 10133

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 version la plus pure 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X