2014-09-08 4 views
0

Je voudrais savoir s'il existe un moyen RESTful de gérer la mise à jour de plusieurs enregistrements avec une requête où vous ne connaissez pas les identifiants des enregistrements à mettre à jour.Mise à jour de plusieurs enregistrements dans une API RESTful

Exemple:

Vous avez des ressources /jobs. Supposons que vous puissiez lister ces tâches de la manière suivante: GET /jobs?sort=priority&inprogress=false&limit=10 Cela vous renverra une liste de 10 tâches qui ne sont pas en cours dans l'ordre de priorité.

Dites maintenant que vous souhaitez modifier l'état de ces travaux en inprogress = true. Quel serait un moyen RESTful d'y parvenir? Évidemment, vous pouvez effectuer un GET puis mettre à jour chacun d'entre eux individuellement, mais vous pouvez avoir un autre processus qui a déjà saisi ceux entre vous faisant le GET et faire la mise à jour. Ensuite, vous obtiendrez une requête qui a échoué parce que ceux-ci ont déjà été mis à jour, ce qui est la principale chose que je veux éviter.

Serait-il RESTful d'effectuer une mise à jour basée sur le filtrage comme une requête GET par exemple

PATCH /jobs?sort=priority&inprogress=false&limit=10 

{[op:"replace", path:"/inprogress", value:true]} 

Pour que cela mettre à jour les 10 premiers emplois qui ne sont pas en cours par ordre de priorité, les changer pour être InProgress et les renvoyer.

Est-ce RESTful? Ou existe-t-il un meilleur moyen d'y parvenir de manière RESTful?

Répondre

1

Mise à jour:

Après avoir lu les commentaires, je me rends compte que la commande de mise à jour des ressources est vraiment PATCH, cette réponse ne s'applique. Désolé pour la confusion.


Dans les opérations définition Rest GET (et PUT également) doivent être idempotents: cela signifie que (voir here)

« les effets secondaires de N> 0 demandes identiques est le même que pour une seule demande:

(donc lors de l'utilisation des opérations idempotents votre application cliente pourrait répéter tout appel avec la confiance qu'il ne sera pas avoir des résultats inattendus)

La façon dont vous prétendez utiliser GET ne suit pas clairement cette restriction, vous devez utiliser un POST pour obtenir ce processus "arrêté".

Aussi je voudrais utiliser une ressource différente pour différencier clairement cette opération: quelque chose comme

POST /activate-jobs?sort=priority&limit=10 
+0

En fait, cela n'a rien à voir avec REST. REST prend en charge l'utilisation de standards (interface uniforme/messages auto-descriptifs), et la [méthode HTTP] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2) est une norme ... Vous n'êtes pas obligé d'utiliser une URL différente, il en va de même. – inf3rno

+0

@ inf3rno Si vous ne spécifiez rien d'autre et que vous utilisez les méthodes HTTP courantes, il est entendu que vous faites référence à l'implémentation HTTP Rest. Dans cette implémentation, les méthodes GET, HEAD, PUT et DELETE doivent être idempotentes, de sorte que son utilisation prévue de GET ne respecte pas cette spécification. Et à propos de l'URI: je ne dis pas qu'il doit utiliser un autre URI, ce n'était qu'une recommandation. Je suis sûr que vous serez d'accord que c'est une bonne pratique d'utiliser des noms pour des actions qui décrivent ce que cette action fait. – DaniCE

+0

Je suis d'accord, mais le client ne devrait rien savoir sur la structure de l'URL, vous devez ajouter des métadonnées, par exemple des liens IANA aux liens, et vérifier ceux-ci afin de décider lequel suivre. Je suppose que Chris n'utilise même pas de liens (HATEOAS), donc ce n'est même pas un service REST, juste un RPC qui utilise les standards HTTP ... PATCH n'est pas une méthode idempotente, donc il pourrait être utilisé pour ce qu'il veut. – inf3rno

Questions connexes