web-dev-qa-db-fra.com

Mettre à jour une collection de ressources entière dans un REST façon

J'ai un REST URI pour une liste de ressources, quelque chose comme:

http://foo.com/group/users

Chacun de ces utilisateurs a un numéro de séquence et je souhaite exposer un moyen de renuméroter ces valeurs pour tous les utilisateurs de la collection et de rendre cette modification disponible pour tous les utilisateurs ayant accès à la liste. Puisqu'il s'agit d'une action sur la collection dans son ensemble, je ne sais pas comment y parvenir.

Je peux imaginer une URL telle que http://foo.com/group/users?sequence=normalize, mais ni une PUT ni une POST n'a de sens pour la liste complète, à moins que je ne soumette la collection complète avec les nouveaux numéros comme données de message.

Comment puis-je effectuer une mise à jour d'une collection entière comme celle-ci de manière RESTful sans avoir à renvoyer toutes les ressources mises à jour de la collection?

13
Nick Gotch

Après le commentaire du raffian sur ma réponse initiale, j'ai retravaillé ma réponse pour qu'elle soit plus reposante ...

  • Utilisez la méthode PATCH

Cette méthode est généralement conçue pour mettre à jour partiellement l'état d'une ressource. Dans le cas d'une ressource de liste, nous pourrions envoyer une liste avec uniquement les éléments à mettre à jour et les identifiants des éléments de la liste. La demande suivante serait:

PATCH /group/users
[
    { "id": "userId1", "sequence": "newSequenceNumber1" },
    { "id": "userId2", "sequence": "newSequenceNumber2" },
    (...)
]
  • Utilisez la méthode POST sur la liste des ressources

Cette méthode est couramment utilisée pour ajouter un élément dans la liste gérée par la ressource. Donc, si vous voulez en tirer parti pour cette action, nous devons inclure dans la requête un indice concernant l'action à exécuter. Nous avons le choix d’ajouter cela dans un en-tête dédié ou dans la charge utile.

Avec la approche en-tête, vous obtiendrez quelque chose comme ça:

POST /group/users
X-Action: renumbering
[
    { "id": "userId1", "sequence": "newSequenceNumber1" },
    { "id": "userId2", "sequence": "newSequenceNumber2" },
    (...)
]

Avec la approche par la charge utile, vous aurez quelque chose comme ça:

POST /group/users
{
    "action": "renumbering",
    "list": {
        [
            { "id": "userId1", "sequence": "newSequenceNumber1" },
            { "id": "userId2", "sequence": "newSequenceNumber2" },
            (...)
        ]
    }
}

J'espère que ça vous aidera, Thierry

14
Thierry Templier

Vous pouvez utiliser à la fois PATCH et POST sur les URI. J'utiliserais PATCH si j'étais toi. C'est la meilleure solution pour les mises à jour en masse.

2
inf3rno

Sémantiquement, leméthode HTTP PATCH est la bonne solution . Ceci est également décrit dans la réponse actuellement choisie .

PATCH /group/users

[
    { "id": "userId1", "sequence": "newSequenceNumber1" },
    { "id": "userId2", "sequence": "newSequenceNumber2" },
    ...
]

Cependant, la deuxième méthode décrite dans la réponse choisie n’est pas reposante, car vous avez inventé de nouveaux verbes dans une requête POST. Ceci est SOAP, pas REST.

1
RayLuo