Les conséquences de la POSTE n'étant pas idempotent (API RESTful)
Je me demande si mon approche actuelle de sens ou si il ya une meilleure façon de le faire.
J'ai de multiples situations où je veux en créer de nouveaux objets et de laisser le serveur attribuer un ID à ces objets. Envoi d'une requête POST semble être la façon la plus appropriée de le faire.
Cependant, car le POST n'est pas idempotent la demande peut se perdre et de l'envoyer de nouveau, peut créer un second objet. Demande également à être perdu peut être tout à fait commun depuis l'API est souvent accessible via les réseaux mobiles.
Par conséquent, j'ai décidé de diviser le tout en un processus en deux étapes.
D'abord l'envoi d'une requête POST pour créer un nouvel objet qui retourne l'URI de l'objet dans l'Emplacement d'en-tête. Deuxièmement, l'exécution d'une idempotent METTRE de la demande à l'fournis Emplacement pour remplir le nouvel objet avec les données. Si un nouvel objet n'est pas remplie dans un délai de 24 heures, le serveur peut le supprimer grâce à une sorte de lot de travail.
Que c'est raisonnable ou est-il une meilleure approche?
Grâce
Vous devez vous connecter pour publier un commentaire.
Le seul avantage de la POST-création METTEZ-la création est le serveur de génération d'Identifiants.
Je ne pense pas que c'valeurs de l'absence d'idempotence (et puis la nécessité pour la suppression des doublons ou vide d'objets).
Au lieu de cela, je voudrais utiliser un PUT avec un UUID dans l'URL. En raison de l'UUID de générateurs de vous presque certain que l'ID que vous générez côté client sera unique côté serveur.
having a 50% probability of at least one collision (...) would be equivalent to generating 1 billion UUIDs per second for about 85 years
(voir Wikipédia).bien tout dépend, pour commencer, vous devriez parler plus sur Uri, des ressources et des représentations et ne pas être préoccupé par les objets.
La Méthode POST est conçu pour les non-idempotent les demandes ou les demandes avec des effets secondaires, mais il peut être utilisé pour la quantité de demandes.
sur le POST de données de formulaire /some_collection/
Appropriés de la fonction de hachage peut être aussi simple que certains champs concaténés, ou pour les grands champs de valeurs ou un tronc md5 fonction peut être utilisée. Voir [fonction de hachage] pour plus de détailsDeux.
J'ai supposé que vous:
pour l'identité ne peut être changé
Votre méthode de production de l'id du serveur, dans la demande, dans une requête-réponse, est un très bon produit! L'unicité est très important, mais les clients, comme les prétendants, de continuer ou de répéter la demande jusqu'à ce qu'ils réussissent, ou jusqu'à ce qu'ils obtiennent un échec qu'ils sont prêts à accepter (peu probable). Donc, vous avez besoin pour obtenir l'unicité de quelque part, et vous n'avez que deux options. Soit le client, avec un GUID qu'Aurélien suggère, ou le serveur, comme vous le suggérez. J'aime l'option de serveur. Graines de colonnes dans relationnelles DBs sont une source facilement accessible de l'unicité de zéro le risque de collisions. Round 2000, j'ai lu un article défendant cette solution a appelé quelque chose comme "Simple et Fiable de Messagerie avec l'adresse HTTP", c'est donc une approche établie à un problème réel.
La lecture RESTE des choses, vous pourriez être pardonné de penser un tas d'adolescents a juste hérité d'Elvis manoir. Ils sont tout excité à discuter de la façon de réorganiser les meubles, et ils sont hystériques à l'idée qu'ils pourraient avoir besoin d'apporter quelque chose dans la maison. L'utilisation des POSTES est recommandé parce que là, sans jamais aborder les problèmes liés à la non-quantité de demandes.
Dans la pratique, vous aurez probablement voulez vous assurer que tous les dangereux les demandes de votre api sont idempotents, à l'exception nécessaire d'identité de génération de demandes, qui comme vous le soulignez n'a pas d'importance. Générer des identités est bon marché et ceux qui sont inutilisés sont facilement éliminés. Comme un clin d'oeil au RESTE, n'oubliez pas d'obtenir votre nouvelle identité avec un POST, donc il n'est pas mis en cache et répété partout.
Concernant le débat sur ce que signifie idempotent, je dis qu'il doit être tout. Les demandes successives ne doit pas générer des effets supplémentaires, et devrait recevoir la même réponse que le premier traité la demande. Pour ce faire, vous voulez stocker toutes les réponses du serveur de sorte qu'ils peuvent être relus, et votre id sera d'identifier les actions, pas seulement les ressources. Vous allez être mis à la porte de sa maison, mais vous aurez une robustesse api.
Mais maintenant, vous avez deux demandes qui peuvent être perdus? Et le POSTE peut encore être répété, la création d'une autre instance de la ressource. Ne pas trop penser à des trucs. Juste le processus de traitement par lots regarder pour des dupes. Éventuellement avoir un "accès" comte des statistiques sur vos ressources pour voir qui de la dupe candidats a été le résultat d'un abandon de poste.
Une autre approche: l'écran entrants de la POSTE contre un log pour voir si c'est une répétition. Devrait être facile à trouver: si le contenu du corps d'une demande est le même que celui d'une demande juste à l'x il y a le temps, on le considère comme une répétition. Et vous pouvez vérifier les paramètres supplémentaires comme l'adresse IP d'origine, même d'authentification, ...
N'importe quelle méthode HTTP utilisée, il est théoriquement impossible de faire un idempotent demande sans générer de l'identificateur unique de client-côté, temporairement (dans le cadre d'une demande de vérification du système) ou permanent l'id du serveur. Une requête HTTP d'être perdu, de ne pas créer un doublon, si il y a une préoccupation que la demande pourrait réussir au serveur, mais la réponse ne permet pas de faire revenir le client.
Si le client final peut facilement supprimer les doublons et ils ne provoquent pas de données inhérentes conflits, il est probablement pas une grosse affaire à développer une ad-hoc de duplication de système de prévention. L'utilisation de POSTE de la demande et de l'envoyer au client de retour 201 statut dans l'en-tête HTTP et le serveur a généré id unique dans le corps de la réponse. Si vous avez des données qui montre les duplications sont fréquents ou tout double causes des problèmes importants, je voudrais utiliser et créer l'id unique du côté client. Utiliser le client créé id l'id de base de données - il n'y a aucun avantage à en créer une autre id unique sur le serveur.
Je pense que vous pourriez aussi l'effondrement de la création et de la demande de mise à jour en une seule requête (upsert). Afin de créer une nouvelle ressource, POSTE client une “usine” de ressources, situé par exemple à l'usine /url-nom. Et puis, le serveur retourne l'URI de la ressource.