Imaginez une requête qui démarre un processus en cours d'exécution dont la sortie est un grand ensemble d'enregistrements.Comment concevoir une API REST pour extraire un flux de données volumineux (éphémère)?
Nous pourrions commencer le processus avec une requête POST:
POST/api/v1/long calcul
La sortie se compose d'une grande séquence d'enregistrements numérotés, qui doivent être envoyées au client. Comme la sortie est grande, le serveur ne stocke pas tout et maintient ainsi une fenêtre d'enregistrements avec une limite supérieure sur la taille de la fenêtre. Disons qu'il stocke jusqu'à 1000 enregistrements (et met en pause le calcul chaque fois que ces nombreux enregistrements sont disponibles). Lorsque le client récupère des enregistrements, le serveur peut ensuite supprimer ces enregistrements et continuer ainsi à générer plus d'enregistrements (car plus d'emplacements dans la fenêtre 1000-longueur sont gratuits).
Disons que nous récupérons les enregistrements avec:
GET/api/v1/long calcul ack = 213
Nous pouvons prendre cela signifie que le serveur doit renvoyer les enregistrements à partir de index 214. Lorsque le serveur reçoit cette requête, il peut supposer que le client (well-behaved) reconnaît que les enregistrements jusqu'au numéro 213 sont reçus par le client et qu'il les supprime, puis renvoie les enregistrements commençant par le numéro 214 à est disponible à ce moment-là.
Suivant si le client demande:
GET/api/v1/long calcul ack = 214
le serveur supprimerait enregistrement 214 et renvoyer les enregistrements à partir de 215.
?Cela semble être une conception raisonnable jusqu'à ce qu'il soit remarqué que les requêtes GET doivent être sûres et idempotentes (voir la section 9.1 du HTTP RFC).
Questions:
- Y at-il une meilleure façon de concevoir cette API?
- Est-il correct de le garder comme GET même s'il semble violer la norme?
- Serait-il raisonnable de faire une requête POST, comme:
POST/api/v1/long calcul/tronquer-et chercher ack = 213
2616 n'est plus à jour. Merci d'utiliser RFC 723x à la place. –
Je suis avec @Evert et @EricStein que d'autres protocoles/styles sont probablement plus adaptés. Néanmoins, HTTP offre une solution de streaming soignée pour les données qui renvoie la même sortie pour chaque client - [requêtes GET partielles] (https://tools.ietf.org/html/rfc7233). Alors que la RFC explique plus ou moins les gammes d'octets, des gammes personnalisées comme 'Content-Range:" items 21-40/* "' sont également possibles, bien que vous ne receviez pas l'accusé de réception. Cela devrait être fait différemment. Notez que le serveur n'a pas besoin de stocker le résultat entier s'il est capable de calculer les mêmes segments de résultats pour chaque client –
@RomanVottner Ranges fonctionnerait, mais l'API doit toujours gérer à la fois le cas où la plage demandée n'est pas encore remplie et comment supprimer en toute sécurité les enregistrements pour en créer davantage. –