Eseguire operazioni condizionali tramite l'API Web
Data di pubblicazione: gennaio 2017
Si applica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Microsoft Dynamics 365 offre supporto per una serie di operazioni condizionali che si basano sul meccanismo standard di controllo delle versioni delle risorse HTTP chiamato ETag.
In questo argomento
ETags
Intestazioni If-Match e If-None-Match
Recuperi condizionali
Operazioni di upsert limitate
Applicare la concorrenza ottimistica
ETags
Il protocollo HTTP definisce un tag di entità (o ETag per brevità) per l'identificazione delle specifiche versioni di una risorsa. Gli ETag sono identificatori opachi i cui valori esatti dipendono dall'implementazione. I valori ETag vengono elaborati in due tipi: convalida debole e complessa. La convalida complessa indica che una risorsa univoca, identificata da un URI specifico, sarà identica a livello binario se il corrispondente valore ETag è invariato. La convalida debole garantisce solo che la rappresentazione delle risorse è semanticamente equivalente per lo stesso valore ETag.
Dynamics 365 genera una proprietà @odata.etag di convalida debole per ogni istanza di entità e questa proprietà viene restituita automaticamente con ogni record di entità recuperato. Per ulteriori informazioni, vedere Recupera un'entità utilizzando l'API Web.
Intestazioni If-Match e If-None-Match
Utilizza le intestazioni If-Match e If-None-Match con valori ETag per controllare se la versione corrente di una risorsa corrisponde all'ultima versione recuperata, a una versione precedente o non corrisponde ad alcuna versione. I confronti costituiscono la base del supporto operativo condizionale. Dynamics 365 consente agli ETag di supportare i recuperi condizionali, la concorrenza ottimistica e le operazioni upsert limitate.
Avviso
Il codice client non deve fornire un significato al valore specifico di un ETag né una relazione apparente tra gli ETag oltre l'uguaglianza o la diseguaglianza. Ad esempio, un valore ETag per la versione più recente di una risorsa non è sicuramente maggiore del valore ETag di una versione precedente. Inoltre, l'algoritmo utilizzato per generare i nuovi valori ETag è soggetto a modifiche senza preavviso nelle versioni di un servizio.
Recuperi condizionali
Etag consente di ottimizzare i recuperi dei record quando accedi allo stesso record più volte. Se in precedenza hai recuperato un record, puoi passare il valore ETag con l'intestazione If-None-Match per richiedere i dati da recuperare solo se sono stati modificati dall'ultima volta che sono stati recuperati. Se i dati sono stati modificati, la richiesta restituisce uno stato HTTP di 200 (OK) con gli ultimi dati nel corpo della richiesta. Se i dati non sono stati modificati, il codice di stato HTTP 304 (Not Modified) è stato restituito per indicare che l'entità non è stata modificata. I seguenti due messaggi di esempio restituiscono i dati per un'entità account con accountid uguale a 00000000-0000-0000-0000-000000000001 quando i dati non sono stati modificati da quando sono stati recuperati l'ultima volta.
Richiesta
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"
Risposta
HTTP/1.1 304 Not Modified Content-Type: application/json; odata.metadata=minimal OData-Version: 4.0
Operazioni di upsert limitate
Un upsert di norma funziona creando un'entità se non esiste; in caso contrario, aggiorna un'entità esistente. Tuttavia, è possibile usare gli ETag per ulteriormente vincolare gli upsert per impedire la creazione o l'aggiornamento.
Impedisci creazione in upsert
Se stai aggiornando i dati e c'è una possibilità che l'entità sia stata eliminata intenzionalmente, non vorrai ricreare l'entità. Per evitare questo, aggiungi un'intestazione If-Match alla richiesta con un valore di "*".
Richiesta
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 }
Risposta
Se viene rilevata l'entità, otterrai una risposta normale con stato 204 (No Content). Quando non viene rilevata l'entità, otterrai la seguente risposta con stato 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> } } }
Impedisci aggiornamento in upsert
Se stai inserendo i dati, è possibile che un record con lo stesso valore id esista già nel sistema ed è possibile che non desideri eseguirne l'aggiornamento. Per evitare questo, aggiungi un'intestazione If-None-Match alla richiesta con un valore di "*".
Richiesta
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 }
Risposta
Se viene rilevata l'entità, otterrai una risposta normale con stato 204 (No Content). Quando viene rilevata l'entità, otterrai la seguente risposta con stato 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> } } }
Applicare la concorrenza ottimistica
Puoi utilizzare la concorrenza ottimistica per rilevare se un'entità è stata modificata da quando è stata recuperata l'ultima volta. Se l'entità da aggiornare o eliminare è cambiata nel server da quando è stata recuperata, non puoi completare l'operazione di aggiornamento o eliminazione. Applicando il modello riportato di seguito puoi rilevare questa situazione, recuperare la versione più recente dell'entità e applicare i criteri necessari per rivalutare se riprovare l'operazione.
Applica la concorrenza ottimistica all'eliminazione
La seguente richiesta di eliminazione per un account con accountid of00000000-0000-0000-0000-000000000001 ha esito negativo perché il valore ETag inviato con l'intestazione If-Match è diverso dal valore corrente. Se il valore corrispondeva, è previsto uno stato 204 (No Content).
Richiesta
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
Risposta
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> } } }
Applica la concorrenza ottimistica all'aggiornamento
La seguente richiesta di aggiornamento per un account con accountid di 00000000-0000-0000-0000-000000000001 ha esito negativo perché il valore ETag inviato con l'intestazione If-Match è diverso dal valore corrente. Se il valore corrispondeva, è previsto uno stato 204 (No Content).
Richiesta
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"}
Risposta
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> } } }
Vedere anche
Esempio operazioni condizionali dell'API Web (C#)
Esempio di operazioni condizionali API Web (JavaScript lato client)
Eseguire operazioni tramite l'API Web
Comporre richieste HTTP e gestire gli errori
Query di dati tramite l'API Web
Creare un'entità utilizzando l'API Web
Recupera un'entità utilizzando l'API Web
Aggiorna ed elimina le entità con l'API Web
Associa e annulla associazione entità con l'API Web
Utilizzare le funzioni API Web
Utilizzare le azioni API Web
Eseguire operazioni in batch usando l'API Web
Rappresentare un altro utente usando l'API Web
Microsoft Dynamics 365
© 2017 Microsoft. Tutti i diritti sono riservati. Copyright