Question

Le cadre de Agavi utilise la demande PUT pour créer et POST pour la mise à jour des informations. Habituellement, dans ce REST est utilisé dans l'autre sens (souvent référence à l'ajout d'informations POST tout en PUT remplaçant l'ensemble de données).

Si je comprends bien, la question importante est que PUT doit être idempotente, alors que POST ne possède pas cette exigence. Par conséquent, je wounder comment créer un nouvel enregistrement peut être idempotente (c.-à-demande multiple ne conduisent pas à de multiples créations d'un enregistrement) en particulier lorsque généralement le ORM utilise un identifiant comme clé primaire et l'identifiant d'un nouvel enregistrement ne serait pas connu au client (puisqu'il est autocreated dans la base de données), ne peut donc pas faire partie de la demande. Comment ne maintient Agavi l'exigence de idempotence à la lumière de cette situation pour la demande PUT.

Merci.

Était-ce utile?

La solution

PUT peut être utilisé aussi bien pour la création et la mise à jour des dossiers complets. POST est généralement utilisé pour les mises à jour partielles et des opérations connexes, ainsi que pour la création d'un nouveau type d'enregistrement sur le serveur sans spécifier une URL pour la ressource (par exemple POST / articles / 23 / commentaires retourne un 201 état et un emplacement: / articles / tête / 23 commentaires / 283136). Donc, dans votre cas (avec une séquence / ID autoincrement), vous pouvez utiliser cette approche.

Cependant, HTML (et forme ainsi Web) est différent. Il ne sait GET et POST, PUT et non SUPPR. Pour les opérations de suppression et de mise à jour, surchargeant la méthode POST.

Voilà pourquoi Agavi, par défaut, cartes POST pour « écrire » et GET à « lire » - c'est l'utilisation le plus courant, et « lire » et « écrire » ont été choisis parce qu'ils sont relativement neutres et aussi d'une manière représentent les aspects de sécurité de GET vs POST (sécurité comme dans « GET peut être appelée sans effets secondaires » et bla).

Vous pouvez modifier le mappage des verbes pour la mise en œuvre AgaviWebRequest en factories.xml; reportez-vous à la liste de diffusion des utilisateurs Agavi ou le canal IRC si vous avez besoin d'aide avec ce (ou demander à l'écart ici). Beaucoup de gens sur le canal IRC sont également tout à fait l'expérience avec la conception de schéma d'URL dans le cas où vous avez besoin de plus d'aide à rendre votre API assez.

Autres conseils

Au lieu de penser que la création PUT, pensez comme « mettre ». Vous mettez une ressource à une URI (ie envoyer une ressource entière à un URI).

PUT http://example.com/articles/1

Si vous répétez ce (envoyer la même ressource entière à la même URI), vous obtenez le même résultat et que vous ne l'avez pas changé la ressource à l'URI, qui est ce qui fait idempotent.

Si la mise en œuvre de Agavi de PUT est idempotent alors il met en œuvre PUT correctement. Sinon, ce n'est pas.

PUT peut être utilisé pour créer une ressource, sauf que si la ressource existe déjà (ou a déjà été créé par un PUT précédent) il va juste mettre à jour. POST ne doit pas mettre à jour les ressources, cependant, si cela est CRUD simple. Notez que les verbes HTTP ne sont pas un mappage défini à certaines actions nécessairement, car ils sont utiles pour beaucoup plus que CRUD.

Notez également que cette question n'a rien à voir avec REST - simplement l'utilisation de HTTP appropriée. Alors, s'il vous plaît enlever l'étiquette REST.

J'ai eu ce problème auparavant. Ceci peut être résolu par changer le factories.xml

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top