Les lecteurs de nouvelles à ce sujet seront frappés par la discussion sans fin sur ce que vous devriez faire, et l'absence relative des enseignements tirés de l' expérience. Le fait que REST soit "préféré" par rapport à SOAP est, je suppose, un apprentissage de haut niveau par expérience, mais bonté, nous devons avoir progressé à partir de là? Nous sommes en 2016. La thèse de Roy remonte à 2000. Qu'avons-nous développé? C'était amusant? A-t-il été facile de s'intégrer avec? Soutenir? Va-t-il gérer la montée en puissance des smartphones et des connexions mobiles feuilletées?
Selon ME, les réseaux réels ne sont pas fiables. Délai d'expiration des demandes. Les connexions sont réinitialisées. Les réseaux tombent pendant des heures ou des jours à la fois. Les trains entrent dans les tunnels avec des utilisateurs mobiles à bord. Pour toute demande donnée (comme cela a parfois été reconnu dans toute cette discussion), la demande peut tomber dans l'eau sur son chemin, ou la réponse peut tomber dans l'eau sur le chemin du retour. Dans ces conditions, émettre des demandes PUT, POST et DELETE directement contre des ressources substantielles m'a toujours paru un peu brutal et naïf.
HTTP ne fait rien pour assurer une exécution fiable de la demande-réponse, et c'est très bien car c'est bien le travail des applications réseau. En développant une telle application, vous pouvez sauter à travers les cercles pour utiliser PUT au lieu de POST, puis plus de cercles pour donner un certain type d'erreur sur le serveur si vous détectez des demandes en double. De retour chez le client, vous devez ensuite sauter à travers des cerceaux pour interpréter ces erreurs, récupérer, revalider et republier.
Ou vous pouvez le faire : considérez vos demandes dangereuses comme des ressources éphémères pour un seul utilisateur (appelons-les actions). Les clients demandent une nouvelle "action" sur une ressource substantielle avec un POST vide à la ressource. POST ne sera utilisé que pour cela. Une fois en possession de l'URI de l'action fraîchement émise, le client transmet la demande non sécurisée à l'URI de l'action, et non à la ressource cible . La résolution de l'action et la mise à jour de la "vraie" ressource est correctement l'affaire de votre API, et est ici découplée du réseau peu fiable.
Le serveur fait l'affaire, renvoie la réponse et la stocke par rapport à l'URI d'action convenu . Si quelque chose ne va pas, le client répète la requête (comportement naturel!), Et si le serveur l'a déjà vue, il répète la réponse stockée et ne fait rien d'autre .
Vous remarquerez rapidement la similitude avec les promesses: nous créons et renvoyons l'espace réservé pour le résultat avant de faire quoi que ce soit. Comme une promesse, une action peut réussir ou échouer une seule fois, mais son résultat peut être récupéré à plusieurs reprises.
Mieux encore, nous donnons aux demandes d'envoi et de réception la possibilité de lier l'action identifiée de manière unique à l'unicité de leurs environnements respectifs. Et nous pouvons commencer à exiger et à appliquer !, un comportement responsable de la part des clients: répétez vos demandes autant que vous le souhaitez, mais ne générez pas de nouvelle action tant que vous n'êtes pas en possession d'un résultat définitif de l'action existante.
Ainsi, de nombreux problèmes épineux disparaissent. Les demandes d'insertion répétées ne créeront pas de doublons, et nous ne créons pas la véritable ressource tant que nous ne sommes pas en possession des données. (les colonnes de la base de données peuvent rester non nulles). Les demandes de mise à jour répétées n'atteindront pas les états incompatibles et n'écraseront pas les modifications ultérieures. Les clients peuvent (re) récupérer et traiter de manière transparente la confirmation d'origine pour une raison quelconque (le client est tombé en panne, la réponse a disparu, etc.).
Les demandes de suppression successives peuvent voir et traiter la confirmation d'origine, sans générer d'erreur 404. Si les choses prennent plus de temps que prévu, nous pouvons répondre provisoirement et nous avons un endroit où le client peut vérifier le résultat définitif. La plus belle partie de ce modèle est sa propriété Kung-Fu (Panda). Nous prenons une faiblesse, la propension des clients à répéter une demande chaque fois qu'ils ne comprennent pas la réponse, et la transformons en force :-)
Avant de me dire que ce n'est pas RESTful, veuillez considérer les nombreuses façons dont les principes REST sont respectés. Les clients ne construisent pas d'URL. L'API reste découvrable, mais avec un petit changement de sémantique. Les verbes HTTP sont utilisés de manière appropriée. Si vous pensez que c'est un énorme changement à mettre en œuvre, je peux vous dire par expérience que ce n'est pas le cas.
Si vous pensez que vous aurez d'énormes quantités de données à stocker, parlons de volumes: une confirmation de mise à jour typique est une fraction de kilo-octet. HTTP vous donne actuellement une minute ou deux pour répondre définitivement. Même si vous ne stockez les actions que pendant une semaine, les clients ont amplement l'occasion de se rattraper. Si vous avez des volumes très élevés, vous souhaiterez peut-être un magasin de valeurs de clés conforme à l'acide dédié ou une solution en mémoire.