Esempio operazioni condizionali dell'API Web
Data di pubblicazione: gennaio 2017
Si applica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Questo gruppo di esempi dimostra come eseguire determinate operazioni condizionalmente basate sulla versione del record di entità contenuto nel server Dynamics 365 e/o attualmente gestito dal client. Per ulteriori informazioni, vedere Eseguire operazioni condizionali tramite l'API Web. Questo esempio è implementato come un progetto distinto per le lingue seguenti:
Esempio operazioni condizionali dell'API Web (C#)
Esempio di operazioni condizionali API Web (JavaScript lato client)
L'API Web di Dynamics 365 segue le convenzioni del protocollo OData v4.0 che utilizza ETags per implementare il controllo della versione della risorsa. Le operazioni condizionali API Web dipendono da questo meccanismo di controllo della versione.
In questo argomento vengono illustrati la struttura e il contenuto degli esempi a un livello superiore e indipendente dal linguaggio. Fornisce i dettagli sulle richieste e sulle risposte HTTP e l'output collegato di programma, se applicabile. Rivedi gli argomenti di esempio collegati sopra per ottenere le implementazione specifiche del linguaggio e i dettagli correlati su come eseguire le operazioni descritte in questo argomento.
Dimostra
Questo esempio è suddiviso in tre sezioni principali, elencate nella tabella seguente. Ogni sezione contiene un set di operazioni correlate API Web che vengono descritte in dettaglio nella sezione concettuale associata dell'argomento Eseguire operazioni condizionali tramite l'API Web.
Sezione codice |
Argomenti concettuali associati |
---|---|
GET condizionale |
|
Concorrenza ottimistica all'eliminazione e all'aggiornamento |
|
Controllo delle operazioni di upsert |
Le sezioni seguenti contengono una breve discussione delle operazioni dell'API Web di Dynamics 365 eseguite insieme ai messaggi HTTP corrispondenti e all'output associato alla console che è uguale per ogni implementazione di linguaggio. Per brevità, le intestazioni HTTP meno pertinenti sono state omesse. Gli URI dei record varieranno con l'indirizzo base dell'organizzazione e l'ID del record assegnato dal server Dynamics 365.
Dati di esempio
Nell'esempio viene creato il record seguente prima dell'esecuzione delle sezioni principali di codice.
Tipo di entità |
Proprietà assegnate dal client |
Proprietà assegnate dal server |
---|---|---|
Nome: Contoso Ltd. |
ID: 14e151db-9b4f-e611-80e0-00155da84c08 |
GET condizionale
Questa sezione del programma illustra come eseguire i recuperi condizionali per ottimizzare la larghezza di banda e l'esecuzione del server mentre gestisce lo stato del record più recente nel client.Ulteriori informazioni:Recuperi condizionali
Tenta di recuperare l'account Contoso Ltd. solo se non corrisponde alla versione esistente, identificato dal valore ETag iniziale restituito alla creazione del record account. Questa condizione è rappresentata dall'intestazione If-None-Match.
Richiesta HTTP
GET http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08)?$select=name,revenue,telephone1,description HTTP/1.1 If-None-Match: W/"628448" OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json
Risposta HTTP
HTTP/1.1 304 Not Modified
Output della console
Instance retrieved using ETag: W/"628448" Expected outcome: Entity was not modified so nothing was returned.
Il valore risposta, 304 Not Modified, indica che il record corrente è il più aggiornato, in modo che il server non restituisce il record necessario nel corpo della risposta.
Aggiornare l'account modificando la proprietà primaria del numero di telefono.
Richiesta HTTP
PUT http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08)/telephone1 HTTP/1.1 OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json Content-Type: application/json { "value": "555-0001" }
Risposta HTTP
HTTP/1.1 204 No Content
Output della console
Account telephone number updated.
Ritenta la stessa operazione condizionale GET utilizzando il valore ETag originale. Questa volta che l'operazione restituisce i dati richiesti perché la versione del server è diversa (più nuova) dalla versione identificata nella richiesta. Come in tutti i recuperi di record, la risposta include un'intestazione ETag che identifica la versione corrente.
Richiesta HTTP
GET http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08)?$select=name,revenue,telephone1,description HTTP/1.1 If-None-Match: W/"628448" OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json
Risposta HTTP
HTTP/1.1 200 OK Content-Type: application/json; odata.metadata=minimal ETag: W/"628460" { "@odata.context":"http://cc_WebAPI_ServiceURI/$metadata#accounts(name,revenue,telephone1,description)/$entity", "@odata.etag":"W/\"628460\"", "name":"Contoso Ltd", "revenue":5000000.0000, "telephone1":"555-0001", "description":"Parent company of Contoso Pharmaceuticals, etc.", "accountid":"14e151db-9b4f-e611-80e0-00155da84c08", "_transactioncurrencyid_value":"0d4ed62e-95f7-e511-80d1-00155da84c03" }
Output della console
Instance retrieved using ETag: W/"628448" { "@odata.context": "http://cc_WebAPI_ServiceURI/$metadata#accounts(name,revenue,telephone1,description)/$entity", "@odata.etag": "W/\"628460\"", "name": "Contoso Ltd", "revenue": 5000000.0, "telephone1": "555-0001", "description": "Parent company of Contoso Pharmaceuticals, etc.", "accountid": "14e151db-9b4f-e611-80e0-00155da84c08", "_transactioncurrencyid_value": "0d4ed62e-95f7-e511-80d1-00155da84c03" }
Concorrenza ottimistica all'eliminazione e all'aggiornamento
Questa sezione del programma illustra come eseguire le operazioni di aggiornamento ed eliminazione condizionale. L'uso più comune per tali operazioni consiste nell'implementare un approccio di concorrenza ottimistica all'elaborazione record in un ambiente multiutente.Ulteriori informazioni:Applicare la concorrenza ottimistica
Tenta di eliminare l'account originale solo se corrisponde alla versione originale (valore ETag). Questa condizione è rappresentata dall'intestazione If-Match. Questa procedura non riesce perché il record account è stato aggiornato nella sezione precedente e pertanto la relativa versione è stata aggiornata nel server.
Richiesta HTTP
DELETE http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08) HTTP/1.1 If-Match: W/"628448" OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json
Risposta HTTP
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.", . . . } }
Output della console
Expected Error: The version of the existing record doesn't match the property provided. Account not deleted using ETag 'W/"628448"', status code: '412'.
Tenta di aggiornare l'account solo se corrisponde al valore ETag originale. Di nuovo, questa condizione è rappresentata dall'intestazione If-Match e l'operazione non riesce per lo stesso motivo.
Richiesta HTTP
PATCH http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08) HTTP/1.1 If-Match: W/"628448" OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json Content-Type: application/json; charset=utf-8 { "telephone1": "555-0002", "revenue": 6000000 }
Risposta HTTP
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.", . . . } }
Output della console
Expected Error: The version of the existing record doesn't match the property provided. Account not updated using ETag 'W/"628448"', status code: '412'.
Ritenta un aggiornamento, ma utilizza invece il valore ETag corrente ottenuto dall'ultimo recupero record nella sezione precedente.
Richiesta HTTP
PATCH http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08) HTTP/1.1 If-Match: W/"628460" OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json { "telephone1": "555-0003", "revenue": 6000000 }
Risposta HTTP
HTTP/1.1 204 No Content
Output della console
Account successfully updated using ETag: W/"628460", status code: '204'.
Conferma il completamento dell'aggiornamento recuperando e producendo l'output con lo stato corrente. Utilizza una richiesta GET di base.
Richiesta HTTP
GET http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08)?$select=name,revenue,telephone1,description HTTP/1.1 OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json
Risposta HTTP
HTTP/1.1 200 OK Content-Type: application/json; odata.metadata=minimal ETag: W/"628461" OData-Version: 4.0 { "@odata.context":"http://cc_WebAPI_ServiceURI/$metadata#accounts(name,revenue,telephone1,description)/$entity", "@odata.etag":"W/\"628461\"", "name":"Contoso Ltd", "revenue":6000000.0000, "telephone1":"555-0003", "description":"Parent company of Contoso Pharmaceuticals, etc.", "accountid":"14e151db-9b4f-e611-80e0-00155da84c08", "_transactioncurrencyid_value":"0d4ed62e-95f7-e511-80d1-00155da84c03" }
Output della console
{ "@odata.context": "http://cc_WebAPI_ServiceURI/$metadata#accounts(name,revenue,telephone1,description)/$entity", "@odata.etag": "W/\"628461\"", "name": "Contoso Ltd", "revenue": 6000000.0, "telephone1": "555-0003", "description": "Parent company of Contoso Pharmaceuticals, etc.", "accountid": "14e151db-9b4f-e611-80e0-00155da84c08", "_transactioncurrencyid_value": "0d4ed62e-95f7-e511-80d1-00155da84c03" }
Controllo delle operazioni di upsert
Questa sezione del programma illustra come eseguire le operazioni condizionali PATCH, limitando le operazioni di upsert per eseguirle come operazioni di solo aggiornamento o solo inserimento.Ulteriori informazioni:Operazioni di upsert limitate
Tenta di inserire, senza aggiornare, le proprietà dei ricavi e del telefono principale per l'account. L'intestazione If-None-Match con il valore * rappresenta questa condizione di upsert. Questa procedura non riesce perché questo record account esiste ancora nel server (a meno che non sia stato eliminato simultaneamente da un altro utente o processo).
Richiesta HTTP
PATCH http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08) HTTP/1.1 If-None-Match: * OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json Content-Type: application/json; charset=utf-8 { "telephone1": "555-0004", "revenue": 7500000 }
Risposta HTTP
HTTP/1.1 412 Precondition Failed Content-Type: application/json; odata.metadata=minimal OData-Version: 4.0 { "error":{ "code":"","message":"A record with matching key values already exists.", . . . } }
Output della console
Expected Error: A record with matching key values already exists. Account not updated using ETag 'W/"628448", status code: '412'.
Tenta di eseguire la stessa operazione di aggiornamento senza creazione. A tale scopo, l'intestazione condizionale If-Match viene utilizzata con un valore *. Questa operazione riesce perché il record esiste nel server.
Richiesta HTTP
PATCH http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08) HTTP/1.1 If-Match: * OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json Content-Type: application/json; charset=utf-8 { "telephone1": "555-0005", "revenue": 7500000 }
Risposta HTTP
HTTP/1.1 204 No Content
Output della console
Account updated using If-Match '*'
Recupera e produci l'output dello stato corrente con una richiesta GET di base. Il valore ETag restituito è cambiato in modo da riflettere la nuova versione aggiornata del record account.
Richiesta HTTP
GET http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08)?$select=name,revenue,telephone1,description HTTP/1.1 OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json
Risposta HTTP
HTTP/1.1 200 OK Content-Type: application/json; odata.metadata=minimal ETag: W/"628463" OData-Version: 4.0 { "@odata.context":"http://cc_WebAPI_ServiceURI/$metadata#accounts(name,revenue,telephone1,description)/$entity", "@odata.etag":"W/\"628463\"", "name":"Contoso Ltd","revenue":7500000.0000, "telephone1":"555-0005", "description":"Parent company of Contoso Pharmaceuticals, etc.", "accountid":"14e151db-9b4f-e611-80e0-00155da84c08", "_transactioncurrencyid_value":"0d4ed62e-95f7-e511-80d1-00155da84c03" }
Output della console
{ "@odata.context": "http://cc_WebAPI_ServiceURI/$metadata#accounts(name,revenue,telephone1,description)/$entity", "@odata.etag": "W/\"628463\"", "name": "Contoso Ltd", "revenue": 7500000.0, "telephone1": "555-0005", "description": "Parent company of Contoso Pharmaceuticals, etc.", "accountid": "14e151db-9b4f-e611-80e0-00155da84c08", "_transactioncurrencyid_value": "0d4ed62e-95f7-e511-80d1-00155da84c03" }
Elimina l'account con un DELETE di base.
Richiesta HTTP
DELETE http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08) HTTP/1.1 OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json
Risposta HTTP
HTTP/1.1 204 No Content
Output della console
Account was deleted.
Come nel passaggio 2, tenta di aggiornare l'account se esiste. Di nuovo, questa condizione è rappresentata dall'intestazione If-Match con un valore *. Questa procedura non riesce perché il record è stato eliminato. Tuttavia, se l'intestazione If-Match non è presente, l'operazione di upsert di base risultante correttamente crea un nuovo record.
Richiesta HTTP
PATCH http://cc_WebAPI_ServiceURI/accounts(14e151db-9b4f-e611-80e0-00155da84c08) HTTP/1.1 If-Match: * OData-MaxVersion: 4.0 OData-Version: 4.0 Accept: application/json Content-Type: application/json; charset=utf-8 { "telephone1": "555-0006", "revenue": 7500000 }
Risposta HTTP
HTTP/1.1 404 Not Found Content-Type: application/json; odata.metadata=minimal OData-Version: 4.0 { "error":{ "code":"","message":"account With Id = 14e151db-9b4f-e611-80e0-00155da84c08 Does Not Exist", . . . } }
Output della console
Expected Error: Account with Id = 14e151db-9b4f-e611-80e0-00155da84c08 does not exist. Account not updated because it does not exist, status code: '404'.
Nessuna necessità di pulire i dati di esempio perché l'unico record account è già stato eliminato nel passaggio 4.
Vedere anche
Utilizzare l'API Web di Microsoft Dynamics 365
Eseguire operazioni condizionali tramite l'API Web
Esempio operazioni condizionali dell'API Web (C#)
Esempio di operazioni condizionali API Web (JavaScript lato client)
Microsoft Dynamics 365
© 2017 Microsoft. Tutti i diritti sono riservati. Copyright