Utiliser des demandes conditionnelles
Bêta
Cette fonctionnalité est en version bêta. Pour l'utiliser, un administrateur de workspace doit activer Files API V3 with Large File Upload Support depuis la page Previews . Consultez Gérer les aperçus Databricks.
Les demandes conditionnelles vous permettent de faire dépendre une opération de l'état actuel du fichier cible, de sorte que la demande ne prenne effet que si le fichier est dans l'état que vous attendez. Cela vous permet d'éviter les transferts inutiles, d'empêcher les mises à jour perdues provenant d'auteurs concurrents et de créer ou de supprimer des fichiers en toute sécurité.
L'API Files 3.0 prend en charge les quatre en-têtes conditionnels HTTP standard de la RFC 9110.
En-tête | Compare à | Récompensé le |
|---|---|---|
| Du fichier | Lit, écrit et supprime |
| Du fichier | Lectures et écritures |
| Le | Lire uniquement |
| Le | Lire uniquement |
If-Modified-Since et If-Unmodified-Since s'appliquent uniquement aux opérations de lecture (GET et HEAD). Ils ne sont pas pris en charge lors de l'upload ou de la suppression.
Lorsque la condition n'est pas remplie, le serveur n'effectue pas l'opération et renvoie l'un des statuts suivants :
304 Not Modified, lorsqu'une requêteGETouHEADavecIf-None-MatchouIf-Modified-Sinceéchoue. Elle confirme que votre copie en cache est toujours valide, donc il n’est pas nécessaire d’envoyer le fichier à nouveau.412 Precondition Failed, lorsque toute autre condition échoue. La lecture, le upload ou la suppression n’est pas effectué.
Validateurs : ETag et Last-Modified
Une requête conditionnelle compare un validateur que vous fournissez au validateur actuel du fichier. L'API Files renvoie les deux validateurs sous forme d'en-têtes de réponse. Vous pouvez donc les capturer et les utiliser dans une requête ultérieure :
ETag: un identifiant opaque pour le contenu actuel du fichier. Stockez la valeur exacte renvoyée par le serveur, y compris les guillemets qui l’entourent, et renvoyez-la sans modification. Ne pas l’analyser ou le construire.Last-Modified: date de dernière modification du fichier, au format HTTP-date.
Les deux validateurs sont renvoyés sur les réponses GET et HEAD. ETag est également renvoyé sur PUT et la réponse multipart complete-upload.
Last-Modified a une précision d'une seconde. If-Modified-Since et If-Unmodified-Since ne peuvent pas détecter plusieurs changements effectués dans la même seconde, donc ne vous fiez pas à eux pour un contrôle précis de la concurrence. Utilisez plutôt ETag avec If-Match ou If-None-Match.
Lectures conditionnelles
Sur GET et HEAD, les quatre en-têtes conditionnels sont respectés. L'utilisation la plus courante est la revalidation du cache : vous avez une copie précédemment download et vous voulez que le serveur renvoie les octets uniquement s'ils ont été modifiés.
Envoyez If-None-Match avec le ETag de votre copie mise en cache, ou If-Modified-Since avec l'heure à laquelle vous l'avez récupérée pour la dernière fois. Si le fichier n'est pas modifié, le serveur renvoie 304 Not Modified sans corps et vous continuez à utiliser votre copie mise en cache. S'il a été modifié, le serveur renvoie 200 OK avec le nouveau contenu.
Pour revalider un fichier mis en cache, envoyez son ETag et download le corps uniquement si le fichier a changé :
GET /api/3.0/fs/files/Volumes/main/default/reports/report.csv
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
Les deux autres en-têtes de lecture affirment la condition opposée. If-Match renvoie le fichier uniquement si son ETag correspond toujours, sinon il renvoie 412. If-Unmodified-Since ne la renvoie que si le fichier n'a pas changé depuis l'heure indiquée, et renvoie sinon 412.
Vous pouvez envoyer au plus deux en-têtes conditionnels lors d'une lecture. Les demandes avec plus ne sont pas prises en charge. Lorsque vous en envoyez deux, leur priorité suit la RFC 9110.
Écritures conditionnelles
Sur PUT, vous pouvez utiliser If-None-Match et If-Match pour protéger un upload contre l'état actuel du fichier :
If-None-Match: *enregistre le fichier uniquement s'il n'existe pas déjà. Cela garantit que l'upload ne va pas accidentellement écraser un autre upload et perdre ses données, ce qui est une variante du problème de mise à jour perdue. Si un fichier existe déjà au niveau du chemin d'accès, la requête renvoie412 Precondition Failed.If-Match: <etag>empêche le problème de mise à jour perdue. Il vérifie que l’upload n’écrasera pas une autre modification effectuée depuis que vous avez récupéré le fichier. L’upload réussit uniquement si leETagactuel du fichier correspond à celui que vous fournissez. Sinon, la demande renvoie412 Precondition Failed. Si aucun fichier n’existe sur le chemin d’accès, la demande renvoie404.
Pour créer un fichier uniquement s'il n'existe pas déjà, envoyez If-None-Match: *:
PUT /api/3.0/fs/files/Volumes/main/default/reports/report.csv
If-None-Match: *
Content-Type: application/octet-stream
<binary data>
200 OK
Pour écraser un fichier seulement s'il correspond toujours à la version que vous avez récupérée en dernier, envoyez son ETag avec If-Match:
PUT /api/3.0/fs/files/Volumes/main/default/reports/report.csv
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Content-Type: application/octet-stream
<binary data>
200 OK
Les formes suivantes ne sont pas prises en charge sur PUT: une liste de ETag, If-Match: *, If-None-Match avec un ETag spécifique, If-Modified-Since et If-Unmodified-Since.
Pour un upload multipart, envoyez l'en-tête conditionnel lors de l'appel initiate-upload. L'API Files la stocke et l'évalue une fois l'upload terminé, de sorte que la condition s'applique au fichier final assemblé. Vous pouvez utiliser les deux mêmes en-têtes que sur PUT: If-None-Match: * et If-Match: <etag>. Les en-têtes conditionnels lors de l'appel complete-upload ou abort-upload lui-même ne sont pas pris en charge.
Suppressions conditionnelles
DELETE est idempotent. La suppression d'un fichier qui n'existe pas renvoie tout de même 204 No Content. Cela simplifie le nettoyage, mais un DELETE simple ne peut pas vous dire si vous avez supprimé la version que vous souhaitiez. Pour rendre une suppression conditionnelle, envoyez If-Match:
If-Match: <etag>supprime le fichier uniquement si sonETagactuel correspond à celui que vous fournissez. Si un autre utilisateur a modifié le fichier après que vous l'avez récupéré, la requête renvoie412 Precondition Failedau lieu de supprimer sa modification. Si le fichier n'existe plus, la requête renvoie404.If-Match: *supprime le fichier uniquement s'il existe. La requête renvoie204si le fichier existait et404s'il n'existait pas.
DELETE /api/3.0/fs/files/Volumes/main/default/reports/report.csv
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
204 No Content
Les en-têtes conditionnels restants (If-None-Match, If-Modified-Since et If-Unmodified-Since) ne sont pas pris en charge sur DELETE.