Effectuer les opérations conditionnelles à l’aide de l’API Web
Microsoft Dataverse fournit la prise en charge d’un ensemble d’opérations conditionnelles basées sur le mécanisme de contrôle de version de ressource HTTP standard appelé ETags.
ETags
Le protocole HTTP définit une balise d’entité, ou ETag en abrégé, pour identifier les versions spécifiques d’une ressource. Les ETags sont des identificateurs opaques dont les valeurs exactes sont dépendantes de la mise en œuvre. Les valeurs d’ETag se présentent sous deux formes : validation forte et faible. Une validation forte indique qu’une ressource unique, identifiée par un URI spécifique, est identique au niveau binaire si sa valeur ETag correspondante est inchangée. La validation faible garantit uniquement que la représentation d’une ressource est sémantiquement équivalente pour la même valeur de l’ETag.
Dataverse génère une propriété @odata.etag
à validation faible pour chaque instance d’entité, et cette propriété est automatiquement retournée à chaque enregistrement d’entité récupéré. Pour plus d’informations, voir Récupérer une ligne de table à l’aide de l’API web.
En-têtes If-Match et If-None-Match
Utilisez les en-têtes If-Match et If-None-Match avec des valeurs ETag pour vérifier si la version actuelle d’une ressource correspond à la dernière version récupérée, correspond à une version précédente ou ne correspond à aucune version. Ces comparaisons forment la base de support conditionnelle d’exploitation. Dataverse fournit des ETags pour prendre en charge des récupérations conditionnelles, l’accès concurrentiel optimiste et des opérations upsert limitées.
Avertissement
Un code client ne doit donner aucune signification à la valeur spécifique d’un ETag, ni à une relation apparente entre des ETags outre l’égalité ou l’inégalité. Par exemple, la valeur d’un ETag pour une version plus récente d’une ressource n’est pas garantie comme étant supérieure à la valeur de l’ETAG d’une version antérieure. En outre, l’algorithme utilisé pour générer des valeurs d’ETag peut faire l’objet de modifications sans préavis. entre les versions d’un service.
Récupérations conditionnelles
Les Etags vous permettent d’optimiser les récupérations d’enregistrement lorsque vous accédez au même enregistrement plusieurs fois. Si vous avez déjà récupéré un enregistrement, vous pouvez transmettre la valeur ETag avec l’en-tête If-None-Match
pour demander que les données soient récupérées uniquement si elles ont changé depuis la dernière fois qu’elles ont été récupérées. Si les données ont changé, la requête renvoie un statut HTTP de 200 OK
avec les dernières données dans le corps de la requête. Si les données ne sont pas modifiées, le code d’état HTTP 304 Not Modified
est renvoyé pour indiquer que l’enregistrement n’a pas été modifié.
La paire de messages d’exemple suivante renvoie des données pour un enregistrement de compte avec le accountid
égal à 00000000-0000-0000-0000-000000000001
lorsque les données n’ont pas changé depuis leur dernière récupération lorsque la valeur Etag était W/"468026"
Demande :
GET [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001)?$select=accountcategorycode,accountnumber,creditonhold,createdon,numberofemployees,name,revenue HTTP/1.1
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: W/"468026"
Réponse :
HTTP/1.1 304 Not Modified
Content-Type: application/json; odata.metadata=minimal
OData-Version: 4.0
Les sections suivantes décrivent les limites de l’utilisation des récupérations conditionnelles.
La table doit avoir l’accès concurrentiel optimiste activé
Vérifiez si une table a une concurrence optimiste activée à l’aide de la requête API Web suivante. Les tables pour lesquelles la concurrence optimiste est activée ont la propriété EntityMetadata.IsOptimisticConcurrencyEnabled définie sur true
.
GET [Organization URI]/api/data/v9.2/EntityDefinitions(LogicalName='<Entity Logical Name>')?$select=IsOptimisticConcurrencyEnabled
La requête ne doit pas inclure $expand
L’Etag ne peut détecter que si l’enregistrement unique en cours de récupération a changé. Lorsque vous utilisez $expand
dans votre requête, davantage d’enregistrements peuvent être renvoyés et il n’est pas possible de détecter si l’un de ces enregistrements a changé ou non. Si la requête inclut $expand
, 304 Not Modified
n’est jamais renvoyé.
La requête ne doit pas inclure d’annotations
Lorsque l’en-tête est inclus dans une requête, il n’est jamais renvoyé. Prefer: odata.include-annotations
GET
304 Not Modified
Les valeurs des annotations peuvent faire référence aux valeurs d’enregistrements associés. Ces enregistrements ont peut-être changé et ce changement n’a pas pu être détecté, il serait donc incorrect d’indiquer que rien n’a changé.
Limiter les opérations upsert
Un upsert fonctionne généralement en créant un enregistrement s’il n’existe pas ; sinon, il met à jour un enregistrement existant. Toutefois, les ETags peuvent être utilisés pour contraindre davantage les upserts à empêcher des créations ou à empêcher des mises à jour.
Éviter la création dans upsert
Si vous mettez à jour des données et qu’il existe une possibilité que l’enregistrement ait été supprimé intentionnellement, vous ne souhaiterez pas recréer l’enregistrement. Pour éviter cela, ajoutez un en-tête If-Match
à la requête avec une valeur *
.
Demande :
PATCH [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001) HTTP/1.1
Content-Type: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
If-Match: *
{
"name": "Updated Sample Account ",
"creditonhold": true,
"address1_latitude": 47.639583,
"description": "This is the updated description of the sample account",
"revenue": 6000000,
"accountcategorycode": 2
}
Réponse :
Si l’enregistrement est trouvé, vous obtenez un réponse normal avec le statut 204 No Content
. Lorsque l’enregistrement n’est pas trouvé, vous obtenez le message réponse suivant avec le statut 404 Not Found
.
HTTP/1.1 404 Not Found
OData-Version: 4.0
Content-Type: application/json; odata.metadata=minimal
{
"error": {
"code": "",
"message": "account With Id = 00000000-0000-0000-0000-000000000001 Does Not Exist"
}
}
Éviter la mise à jour dans upsert
Si vous insérez des données, il est possible qu’un enregistrement avec la même valeur existe déjà dans le système et que vous ne souhaitiez pas le mettre à jour. id
Pour éviter cela, ajoutez un en-tête If-None-Match
à la requête avec une valeur « * ».
Demande :
PATCH [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001) HTTP/1.1
Content-Type: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: *
{
"name": "Updated Sample Account ",
"creditonhold": true,
"address1_latitude": 47.639583,
"description": "This is the updated description of the sample account",
"revenue": 6000000,
"accountcategorycode": 2
}
Réponse :
Si l’enregistrement n’est pas trouvé, vous obtiendrez un réponse normal avec le statut 204 No Content
. Lorsque l’enregistrement est trouvé, vous obtenez le réponse suivant avec le statut 412 Precondition Failed
.
HTTP/1.1 412 Precondition Failed
OData-Version: 4.0
Content-Type: application/json; odata.metadata=minimal
{
"error":{
"code":"",
"message":"A record with matching key values already exists."
}
}
Appliquer l’accès concurrentiel optimiste
Vous pouvez utiliser la concurrence optimiste pour détecter si un enregistrement a été modifié depuis sa dernière récupération. Si l’enregistrement que vous souhaitez mettre à jour ou supprimer a changé sur le serveur depuis que vous l’avez récupéré, vous ne souhaiterez peut-être pas terminer l’opération de mise à jour ou de suppression. En appliquant le modèle présenté ici, vous pouvez détecter cette situation, récupérer la version la plus récente de l’enregistrement et appliquer tous les critères nécessaires pour réévaluer s’il faut réessayer l’opération.
Appliquer l’accès concurrentiel optimiste sur la suppression
La requête suivante de suppression d’un compte avec un accountid
de 00000000-0000-0000-0000-000000000001
échoue car la valeur ETag envoyée avec l’en-tête If-Match
est différente de la valeur actuelle. Si la valeur correspond, un 204 No Content
statut est attendu.
Demande :
DELETE [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001) HTTP/1.1
If-Match: W/"470867"
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Réponse :
HTTP/1.1 412 Precondition Failed
Content-Type: application/json; odata.metadata=minimal
OData-Version: 4.0
{
"error":{
"code":"","message":"The version of the existing record doesn't match the RowVersion property provided."
}
}
Appliquer l’accès concurrentiel optimiste sur la mise à jour
La requête suivante de mise à jour d’un compte avec un accountid
de 00000000-0000-0000-0000-000000000001
échoue car la valeur ETag envoyée avec l’en-tête If-Match
est différente de la valeur actuelle. Si la valeur correspond, un 204 No Content
statut est attendu.
Demande :
PATCH [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001) HTTP/1.1
If-Match: W/"470867"
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
{"name":"Updated Account Name"}
Réponse :
HTTP/1.1 412 Precondition Failed
Content-Type: application/json; odata.metadata=minimal
OData-Version: 4.0
{
"error":{
"code":"","message":"The version of the existing record doesn't match the RowVersion property provided."
}
}
Voir aussi
Exemple d’opérations conditionnelles de l’API Web (C#)
Exemple d’opérations conditionnelles de l’API Web (Javascript côté client)
Effectuer des opérations à l’aide de l’API Web
Composer des demandes Http et gérer les erreurs
Interroger des données à l’aide de l’API Web
Créer une ligne de table à l’aide de l’API web
Récupérer une ligne de table à l’aide de l’API web
Mettre à jour et supprimer des lignes de table à l’aide de l’API web
Associer et dissocier des lignes de tables à l’aide de l’API web
Utiliser des fonctions API Web
Utiliser des actions API web
Exécuter des opérations par lots à l’aide de l’API Web
Emprunter l’identité d’un autre utilisateur à l’aide de l’API Web
Notes
Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)
Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).