Statut HTTP 412 (Échec de la précondition) et versionnement de la base de données
Je me suis mise en œuvre d'un service web RESTful qui accède à une base de données. Les entités dans la base de données sont versionnées pour détecter de multiples mises à jour. Par exemple, si la valeur actuelle est {"name":"Bill", "comment":"tinker", "version":3}
si un utilisateur Met {"name":"Bill", "comment":"tailor", "version":3}
la demande va réussir (200 OK) et la nouvelle valeur sera {"name":"Bill", "comment":"tailor", "version":4}
. Si un deuxième utilisateur Met {"name":"Bill", "comment":"sailor", "version":3"}
que la demande échoue (409 Conflit) car le numéro de version ne correspond pas.
Il y a des non-Sommeil interfaces, de sorte que la conception de bases de données ne peut pas être modifié. L'interface RESTful appelle une interface existante qui gère les détails de la vérification de la version.
Une règle de pouce dans les services web RESTful qui est de suivre les détails de l'adresse HTTP à chaque fois que possible. Serait-il mieux dans ce cas utiliser un conditionnel en-tête de la demande et retourner 412 Échec de la Condition préalable si la version ne correspond pas? L'en-tête approprié semble être Si-Match. Cet en-tête prend un ETag (Balise d'Entité) qui pourrait être un hachage de la représentation de l'état actuel de la ressource.
Si je l'ai fait, les ETags serait pour les apparences de l'amour, parce que la version en serait toujours à la vraie chose que je suis en essais.
Est-il une raison je devrais le faire, d'autres de "faire plus de Repos", ce que c'est censé vouloir dire?
source d'informationauteur Mark Lutton
Vous devez vous connecter pour publier un commentaire.
La chose appropriée à faire est de toujours suivre la spécification HTTP, si vous êtes en utilisant HTTP, et la raison en est simplement de permettre à des personnes qui comprennent la spécialisation à fonctionner correctement.
412 doit être utilisée uniquement si une condition préalable (par exemple, Si le Match) a causé la version correspondante à l'échec, alors que 409 doit être utilisé si l'entité susceptible de causer un conflit (la spécification HTTP lui-même fait allusion à ce comportement dans l' définition de 409).
Par conséquent, un client qui ne veut pas envoyer les ETags ne s'attend un 412. À l'inverse, un client qui ne envoyer des ETags de ne pas comprendre que c'est ETags qui sont à l'origine d'un 409.
Je m'en tiendrais à sens unique. Vous dites que "le schéma de base de données ne peut pas changer", mais cela ne vous empêchera pas d' (à droite sur le serveur HTTP de la couche) pour extraire la version de la datbase de la représentation et de la mettre dans l'ETag, et puis, sur le chemin, prenez le Si-Match de l'en-tête et de le mettre dans le champ version.
Mais en le faisant complètement dans le corps de l'entité elle-même n'est pas interdit. Il nécessite simplement d'expliquer le concept et comment il fonctionne, alors qu'avec l'ETag solution vous pouvez simplement pointer les gens à la spécification HTTP.
Edit: Et la version du pavillon n'a pas à être un hachage de la ressource actuelle; une version est tout à fait acceptable.
ETag: "3"
est parfaitement valide ETag.