J'essaie de déplacer une ressource de Qu'est-ce qui est un moyen reposant de demander au serveur de déplacer une ressource de cette manière? P> / gaux / 1 code> à / gaux / 2 code> tel que: p>
état initial h3>
état final h3>
3 Réponses :
get / gaux / 1 code> li>
-
Supprimer / godets / 1 code> li>
-
Met / gaux / 2 {Data renvoyé par # 1} code> li>
qui ne rend pas le serveur 301 code>, cependant. L'alternative serait d'utiliser le WebDAV déplacer code> méthode , c'est-à-dire en créant votre propre annotation @move code> à l'aide de l'annotation @httpmethod code> Annotation: p> xxx pré> mais ce faisant de la sorte d'architecture de repos Principe d'utilisation de HTTP comme une interface uniforme ( java reposant ). P> ol>
Réponse intéressante mais pas la bonne parce que, par votre propre assertion, ce qui précède n'est pas reposant.
Ce qui n'est pas reposant, en utilisant @move code>?
@Matt, vous avez écrit: "Mais cela fait tellement rompre le principe architectural de Repos de l'utilisation de HTTP comme une interface uniforme." Tu n'imples pas que @Move n'est pas reposant? Précisez s'il vous plaît. De plus, je ne pense pas que une combinaison de supprimer et de mettre est reposante dans le sens où vous impliquez que / garets / 2 fait référence à un objet différent de / seaux / 1 qui n'est pas vrai.
Avez-vous lu la section Extensions de méthode HTTP en Java reposant?
@Matt: Oui, j'ai fait. Je crois comprendre qu'ils soutiennent la définition de nouvelles méthodes tant qu'ils sont bien établis dans la communauté (contre tout le monde définissant leurs propres méthodes personnalisées). Je ne comprends pas le texte de votre réponse cependant. Dites-vous que l'introduction @Move est reposante ou pas?
J'ai trouvé un thread de discussion très intéressant où le mode de discussion discute @move ici: Tech. groupes.yahoo.com/group/res-discuss/Message/5874 et TECH.GROUPS.YAHOOO.COM/GROUP/REST-Discuss/Message/5867
Belle trouvaille. Ma tâche sur la matière est qu'il n'y a pas une façon très reposante de faire "bouger" car "bouger" n'est pas une opération reposante. Je pense aux opérations reposantes ayant des mappages directs à, par exemple, des opérations SQL ( get -> sélectionnez code>, post-post -> insérer code>, etc.) et il n'y a certainement pas "MOVE "Opération SQL.
Les gars sur le repos-discussion semblent être d'accord avec vous. Ils soutiennent que les relations entre les ressources appartiennent à la représentation des ressources (Pensez les liens HTML) par opposition à quelque chose dont vous avez besoin pour conserver à l'aide d'une commande de déplacement. Cela semble voler face à ce que http 301 est tout cependant, n'est-ce pas? Comment empêcher les clients de croire à tort qu'une ressource a été supprimée quand elle a été vraiment déplacée?
Que diriez-vous de l'approche suivante? Chaque ressource a une URI canonique. Au lieu d'ajouter la ressource canonique dans le seau, nous ajoutons un lien symbolique. Lorsqu'une ressource est déplacée, nous supprimons le lien symbolique d'un seau et ajoutons un nouveau lien symbolique dans le deuxième godet. En enseignant aux clients de communiquer uniquement avec l'URI canonique, nous garantissons que les clients ne croiseront jamais à tort qu'une ressource a été supprimée. En fait, une solution encore meilleure pour promouvoir la ressource au niveau supérieur. Au lieu d'ajouter / godets / 1 dans / seaux, nous devrions ajouter / FOO / 1 à la place.
Ce n'est pas très efficace lors de la déplacement d'une énorme ressource, car elle nécessite 2n code> du trafic réseau (où n code> est la taille de la ressource). (c.-à-d. Un fichier 2GIB nécessite 4GIB de transfert de réseau).
Répondre à ma propre question:
/ balles code> li>
- le reste semble fonctionner mieux en termes de liens symboliques par opposition à des valeurs inline, donc au lieu de
get / gaux / 1 code> retourner la valeur de la balle dans le godet, faisons-la renvoyer l'URI de la balle à la place. li>
ul> Nous pouvons ensuite déplacer des balles comme suit: P>
(examine original state)
GET /buckets/1: "balls = {'/balls/1'}"
GET /buckets/2: "balls = {}"
GET /balls/1: "bucket = /buckets/1"
(move ball into bucket #2)
PUT /balls/1: "bucket = /buckets/2"
(examine new state)
GET /buckets/1: "balls = {}"
GET /buckets/2: "balls = {'/balls/1'}"
GET /balls/1: "bucket = /buckets/2"
J'aime ta réponse, mais je ne comprends pas votre mention d'atomicité. Il me semble que vous avez deux demandes. Le monde ne sera-t-il pas dans un état étrange entre les deux demandes? (Le ballon réside dans 2 seaux, ce qui n'est pas vraiment l'état que vous voulez être).
Comment dites-vous les différents entre mis qui déplacez-vous une balle entre le seau et une mise à jour de la balle?
@Ido, si un utilisateur met un godet qui diffère de la valeur actuelle, c'est un mouvement. N'oubliez pas que vous pourriez déplacer une balle et mettre à jour son état en même temps.
Cela fonctionne bien si vous envoyez une ressource complète comportant une pièce d'identité mise à jour. Si vous souhaitez simplement déplacer la ressource sur le serveur, la demande de remplissage devra en quelque sorte expliquer cela.
Créer une ressource originale: p>
Procédure de serveur d'appel responsable des ressources en mouvement: P>
Chemin de ressources d'origine doit maintenant renvoyer le code d'état déplacé: p>
ressource doit maintenant être disponible sur le nouveau chemin: P>
mettre / godet / 1 code> p> li>
post / godet / 1 / Move-to / 2 code> p> li>
get / godet / 1 http 301 code> p> li>
get / godet / 2 http 200 code> p> li>
ol>
Dupliqué possible de Déplacer la ressource dans une architecture reposante