Udfør betingede operationer ved hjælp af web-API
Udgivet: januar 2017
Gælder for: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Microsoft Dynamics 365 understøtter et sæt betingede handlinger, der er afhængige af standardmekanismen for HTTP-ressourceversionering, der kaldes ETags.
Dette emne indeholder
ETags
If-Match- og If-None-Match-headers
Betingede hentninger
Begræns upsert-handlinger
Anvend optimistisk samtidighed
ETags
HTTP-protokollen definerer et objektmærke, eller forkortet ETag (entity tag), for at identificere bestemte versioner af en ressource. ETags er uigennemsigtige id'er, hvis nøjagtige værdier er afhængige af, om de implementeres. ETag-værdier forekommer i to varianter: stærk og svag validering. Stærk validering betyder, at en entydig ressource, der identificeres af en bestemt URI, bliver identisk på binært niveau, hvis den tilsvarende ETag-værdi er uændret. Svag validering garanterer kun, at ressourcerepræsentationen er semantisk den samme for den samme ETag-værdi.
Dynamics 365 genererer en @odata.etag-egenskab, der udfører svar validering, for hver objektforekomst, og denne egenskab returneres automatisk med alle hentede objektposter. Du kan finde flere oplysninger under Hente et objekt ved hjælp af web-API'et.
If-Match- og If-None-Match-headers
Brug If-Match- ogIf-None-Match--headers med ETag-værdier til at kontrollere, om den aktuelle version af en ressource matcher den sidst hentede, svarer til en tidligere version eller ikke svarer til en version. Disse sammenligninger danner grundlag for understøttelse af betingede handlinger. Dynamics 365 indeholder ETags for at understøtte betingede hentninger, optimistisk samtidighed og begrænsede upsert-handlinger.
Advarsel |
---|
Klientkoden bør ikke give mening for den specifikke værdi af et ETag eller et eventuelt synligt forhold mellem ETags ud over, om de er lig med eller ikke lig med. En ETag-værdi for en nyere version af en ressource er f.eks. ikke nødvendigvis større end ETag-værdien for en tidligere version. Desuden kan den algoritme, der bruges til at generere nye ETag-værdier, ændres uden varsel mellem versioner af en tjeneste. |
Betingede hentninger
Etags giver dig mulighed at optimere hentning af poster, hver gang du åbner den samme post flere gange. Hvis du tidligere har hentet en post, kan du overføre ETag-værdien med If-None-Match-headeren for at anmode om data, der kun må hentes, hvis de er ændret, siden de sidst blev hentet. Hvis dataene er ændret, returnerer anmodningen en HTTP-status på 200 (OK) med de nyeste data i anmodningens hoveddel. Hvis dataene ikke er blevet ændret, returneres HTTP-statuskoden 304 (Not Modified) for at angive, at objektet ikke er blevet ændret. Følgende eksempelmeddelelsespar returnerer data for et kontoobjekt, hvor accountid er lig med 00000000-0000-0000-0000-000000000001, når dataene ikke er blevet ændret, siden de sidst blev hentet.
Anmodning
GET cc_WebAPI_ServiceURI/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"
Svar
HTTP/1.1 304 Not Modified Content-Type: application/json; odata.metadata=minimal OData-Version: 4.0
Begræns upsert-handlinger
En upsert fungerer normalt ved at oprette et objekt, hvis der findes et. Ellers opdateres et eksisterende objekt. ETags kan dog anvendes til yderligere at begrænse upserts til enten at forhindre oprettelse eller tuk at forhindre opdatering.
Undgå create i upsert
Hvis du opdaterer data, og der er mulighed for, at objektet blev slettet med vilje, vil du ikke oprette objektet igen. Hvis du vil undgå dette, skal du tilføje en If-Match-header til anmodningen med værdien "*".
Anmodning
PATCH cc_WebAPI_ServiceURI/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 }
Svar
Hvis objektet findes, får du et normal svar med status 204 (No Content). Når objektet ikke findes, får du følgende svar med status 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", "innererror": { "message": "account With Id = 00000000-0000-0000-0000-000000000001 Does Not Exist", "type": "System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]", "stacktrace": <stack trace removed for brevity> } } }
Undgå update i upsert
Hvis du indsætter data, er der mulighed for, at en post med den samme id-værdi allerede findes i systemet, og du vil muligvis ikke opdatere den. Hvis du vil undgå dette, skal du tilføje en If-None-Match-header til anmodningen med værdien "*".
Anmodning
PATCH cc_WebAPI_ServiceURI/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 }
Svar
Hvis objektet ikke findes, får du et normal svar med status 204 (No Content). Når objektet findes, får du følgende svar med status 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.", "innererror":{ "message":"Cannot insert duplicate key.", "type":"System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]", "stacktrace":<stack trace removed for brevity> } } }
Anvend optimistisk samtidighed
Du kan bruge optimistisk samtidighed til at registrere, om et objekt er blevet ændret, siden det sidst blev hentet. Hvis det objekt, du vil opdatere eller slette, er ændret på serveren, siden du hentede det, ønsker du muligvis ikke at fuldføre opdateringen eller sletningen. Du kan registrere denne situation ved at anvende det mønster, der er vist her, hente den nyeste version af objektet og anvende eventuelle nødvendige kriterier for at vurdere, om du vil prøve handlingen igen.
Anvend optimistisk samtidighed ved sletning
Følgende sletteanmodning for en konto med accountid of00000000-0000-0000-0000-000000000001 mislykkes, fordi ETag-værdien , der blev sendt med If-Match-headeren, er forskellig fra den aktuelle værdi. Hvis værdien havde matchet, ville statussen 204 (No Content) være forventet.
Anmodning
DELETE cc_WebAPI_ServiceURI/accounts(00000000-0000-0000-0000-000000000001) HTTP/1.1 If-Match: W/"470867" Accept: application/json OData-MaxVersion: 4.0 OData-Version: 4.0
Svar
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.", "innererror":{ "message":"The version of the existing record doesn't match the RowVersion property provided.", "type":"System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]", "stacktrace":" <stack trace details omitted for brevity> } } }
Anvend optimistisk samtidighed ved opdatering
Følgende opdateringsanmodning for en konto, hvor accountid er 00000000-0000-0000-0000-000000000001, mislykkes, fordi ETag-værdien , der blev sendt med If-Match-headeren, er forskellig fra den aktuelle værdi. Hvis værdien havde matchet, ville en 204 (No Content)-status være forventet.
Anmodning
PATCH cc_WebAPI_ServiceURI/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"}
Svar
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.", "innererror":{ "message":"The version of the existing record doesn't match the RowVersion property provided.", "type":"System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]", "stacktrace":" <stack trace details omitted for brevity> } } }
Se også
Eksempel på Web API Conditional operationer (C#)
Eksempel på Web API Conditional operationer (JavaScript på klientsiden)
Udføre operationer ved hjælp af web-API
Skrive HTTP-anmodninger og håndtere fejl
Forespørg på data ved hjælp af Web-API'en
Oprette et objekt ved hjælp af Web-API
Hente et objekt ved hjælp af web-API'et
Opdatere og slette objekter ved hjælp af web-API'et
Tilknytte og fjerne tilknytningen af objekter ved hjælp af web-API'et
Bruge Web-API-funktioner
Brug Web API-handlinger
Udføre batchhandlinger ved hjælp af Web-API
Efterligne en anden bruger ved hjælp af Web-API'en
Microsoft Dynamics 365
© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret