Reposant ressource accepte une liste d'objets
Je suis en train de construire une collection de RESTful ressources qui travaillent comme suit: (je vais utiliser le "peuple", comme un exemple):
OBTENIR /personnes/{clé} - retourne un objet personne (JSON)
OBTENIR /les gens?prenom=Bob - retourne une liste d'objets de la personne qui est "prenom" est "Bob" (JSON)
METTRE /personnes/{clé} - attend un objet de personne dans la charge utile (JSON), les mises à jour de la personne dans le banque de données avec le {clé} trouvée dans le paramètre de l'URL pour correspondre à la charge utile. Si c'est un nouvel objet, le client spécifie la clé de l'objet nouveau.
Je me sens assez à l'aise avec la conception jusqu'à présent (bien que toute entrée/critiques sont les bienvenues).
J'aimerais aussi pouvoir METTRE une liste de personnes, cependant, je ne suis pas confiant dans le Repos de ma conception. C'est ce que j'ai à l'esprit:
METTRE /personnes - attend une liste d'objets JSON forme avec les touches inclus dans l'objet ("key":"32948"). Les mises à jour de tous les objets correspondants dans la base de données.
Cette opération sera la quantité, donc je voudrais l'utiliser "PUT". Cependant elle se brise une règle, car une requête GET à cette même ressource ne sera pas de retour l'équivalent de ce que le client vient de METTRE, mais plutôt de retourner tous les "gens" des objets (puisqu'il n'y aurait pas de filtres sur la requête). Je soupçonne qu'il y a aussi quelques autres règles qui peuvent être brisées ici.
Quelqu'un a mentionné l'utilisation d'un "PATCH" demande dans une question précédente que j'ai eu: RESTE la ressource de la Liste des biens
"PATCH" a l'air fantastique, mais je ne veux pas l'utiliser car elle n'est pas dans l'échelle de l'utiliser encore et n'est pas compatible avec un grand nombre de programmes et d'Api encore.
Je préfère ne pas utiliser de POST, parce que POST indique que la demande n'est pas idempotent.
Quelqu'un avez des commentaires /suggestions?
Suivi:::
Alors que j'ai hésité à utiliser la POSTE, car il semble être le moins-petit dénominateur commun, fourre-tout pour les opérations RESTful et plus peut être dit à propos de cette opération (plus précisément, qu'il est idempotent), METTRE ne peuvent pas être utilisés parce que ses exigences sont trop étroites. Plus précisément: la ressource n'est pas complètement ré-écrit et l'équivalent de la ressource n'est pas d'être envoyé à partir d'une requête GET à la même ressource. À l'aide d'un METTRE avec des propriétés en dehors de ses spécifications peuvent causer des problèmes lorsque les applications, api, et/ou les programmeurs de tenter de travailler avec la ressource et sont remplies avec un comportement inattendu de la ressource.
En plus de la accepté de répondre, Darrel Miller a eu une excellente suggestion, si l'opération devait absolument être MIS et c'était pour ajouter un UUID sur la fin du chemin d'accès aux ressources, donc un équivalent OBTENIR la demande sera de retour l'équivalent des ressources.
OriginalL'auteur Chris Dutrow | 2010-07-07
Vous devez vous connecter pour publier un commentaire.
POST
indique une action générique d'autres queGET
,PUT
, etDELETE
(le générique de table de hachage actions). Parce que le générique de la table de hachage des actions inappropriées, l'utilisationPOST
. La sémantique dePOST
sont déterminés par la ressource à laquelle une entité estPOST
ed. C'est contrairement à la sémantique du générique de table de hachage méthodes, qui sont bien connus.OriginalL'auteur yfeldblum
L'aide est certainement pas le bon verbe dans ce cas. POST est destiné à faire exactement ce que vous demandez. À partir de la Spécification HTTP:
En tant que tel, si vous voulez mettre à jour de multiples ressources en un seul appel, vous ont d'utiliser la POSTE.
Juste cause est nécessaire pour être idempotent et POST n'est pas, ne veut pas dire que le POST ne peut pas être idempotent. Votre choix de HTTP verbe ne doit pas être basé sur cela, mais basée sur la relation de la ressource demandée et les ressources mises en. Si votre demande est directement la manipulation de la ressource demandée, utilisez le METTRE. Si c'est en agissant sur certains autres ressources (ou de ressources, comme dans votre cas), l'utilisation de la POSTE.
OriginalL'auteur AdmiralNemo
Je ne vois vraiment pas un moyen facile que vous pourriez utiliser METTRE de créer un ensemble arbitraire de personnes. Sauf si, vous êtes prêt à demander au client de générer un GUID et faire quelque chose comme,
Sur le côté serveur, vous pouvez prendre les gens de la liste et de les ajouter à la
/People
ressource.Une légère variation de cette approche serait d'obtenir le serveur d'inclure un lien tel que
dans les Personnes ressources. Le client aurait besoin de savoir qu'il a besoin de METTRE une liste de personnes à la
AddList
lien. Le serveur aurait besoin pour s'assurer que chaque fois qu'il rend la /les Personnes ressources, il crée une nouvelle url pour le AddList lien.OriginalL'auteur Darrel Miller
Concernant Darren Miller suggestion de l'utilisation de la METTRE à un GUID (je ne peux pas commenter...), le point de l'utilisation serait pour atteindre idempotence de l'opération. Le test décisif si idempotence serait cette conversation entre le client et le serveur:
PUT /PeopleList/{1E8157D6-3BDC-43b7-817D-C3DA285DD606}
204 NO CONTENT
(indique que tout s'est bien passé)204
PUT /PeopleList/{1E8157D6-3BDC-43b7-817D-C3DA285DD606}
Comment le serveur de différencier les deux? Si le GUID est "utilisée" pour ainsi dire ensuite, le serveur devrait répondre
404
ou410
. Cela introduit un tout petit peu de la conversation de l'état sur le serveur pour se souvenir de tous les Guid qui ont été utilisés.Deux clients voyait souvent la même chose, je suppose, à cause de la mise en cache, ou simplement conserver rassis réponses autour de.
Je pense que la bonne solution est d'utiliser la POSTE à créer un (initialement vide, de courte durée) d'une zone d'attente pour une ressource à laquelle vous pouvez METTRE, c'est à dire les clients ont besoin de POSTER pour créer le GUID de ressources plutôt que de la découvrir via un lien:
POST /PeopleList/CreateHoldingArea
201 CREATED
etLocation: /PeopleList/{1E8157D6-3BDC-43b7-817D-C3DA285DD606}
PUT /PeopleList/{1E8157D6-3BDC-43b7-817D-C3DA285DD606}
Cela signifierait que la perte de idempotence ne serait pas entraîner beaucoup de frais généraux; les clients ne peuvent tout simplement créer un nouveau Guid (par Affichage) si ils ne voient pas l'initiale
201 CREATED
réponse. Le "tout petit peu de la conversation de l'état" n'être créé mais pas encore utilisé, les zones d'attente.L'idéal serait bien sûr de ne pas exiger de tout état conversationnel sur le serveur, mais il m'échappe.
OriginalL'auteur mogsie