Amostra de operações de condição de API da Web
Publicado: janeiro de 2017
Aplicável a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Esse grupo de exemplos demonstra como realizar operações que são condicionalmente baseadas na versão do registro da entidade contida no servidor do Dynamics 365 e/ou atualmente mantida pelo cliente. Para obter mais informações, consulte Executar operações condicionais usando A API. Este exemplo foi implementado como um projeto separado para as seguintes linguagens:
Amostra de operações de condição API da Web (C#)
Exemplo de operações condicionais da API Web (JavaScript do lado do cliente)
A API da Web do Dynamics 365 segue as convenções do protocolo OData v4.0, que usa ETags para implementar controle de versão de recurso. As operações condicionais de API da Web dependem desse mecanismo de versões.
Este tópico explica a estrutura e o conteúdo dos exemplos em nível superior e linguisticamente neutro. Detalha as solicitações e respostas de HTTP e a saída do programa associado, quando aplicável. Revise os tópicos vinculados de exemplo acima para obter implementações específicas por idioma e detalhes relacionados sobre como realizar as operações descritas neste tópico.
Demonstrações
Este exemplo é dividido em três seções principais, listadas na seguinte tabela. Cada seção contém um conjunto de operações de API da Web relacionadas que são discutidas mais detalhadamente na seção conceitual associada do tópico Executar operações condicionais usando A API.
Seção de código |
Tópicos conceituais associados |
---|---|
GET condicional |
|
Simultaneidade otimista ao excluir e atualizar |
|
Controle de operações de upsert |
As seções a seguir contêm uma breve discussão das operações executadas do Dynamics 365 usando a API da Web, juntamente com as mensagens HTTP correspondentes e saídas de console associadas, que são as mesmas de cada implementação de idioma. Para facilitar, os cabeçalhos HTTP pertinentes foram omitidos. Os URIs dos registros podem variar com base no endereço da organização e na ID do registro atribuído pelo servidor do Dynamics 365.
Dados de exemplo
O exemplo cria o seguinte registro antes de as seções do código principal serem executadas.
Tipo de entidade |
Propriedades atribuídas por cliente |
Propriedades atribuídas por servidor |
---|---|---|
Nome: Contoso Ltd. |
ID: 14e151db-9b4f-e611-80e0-00155da84c08 |
GET condicional
Esta seção do programa demonstra como realizar recuperações condicionais para otimizar a largura de banda de rede e o processamento de servidor ainda mantendo o estado de registro mais atual no cliente.Para obter mais informações:Recuperações condicionais
Tente recuperar a conta Contoso Ltd. apenas se ela não corresponder à versão atual, identificada pelo valor de ETag inicial que foi retornado na criação do registro da conta. Essa condição é representada pelo cabeçalho If-None-Match.
Solicitação 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
Resposta HTTP
HTTP/1.1 304 Not Modified
Saída do console
Instance retrieved using ETag: W/"628448" Expected outcome: Entity was not modified so nothing was returned.
Como o valor de resposta, 304 Not Modified, indica que o registro atual é o mais atual, o servidor não retorna o registro solicitado no corpo da resposta.
Atualize a conta modificando sua propriedade primária de número de telefone.
Solicitação 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" }
Resposta HTTP
HTTP/1.1 204 No Content
Saída do console
Account telephone number updated.
Tente novamente a mesma operação GET condicional, voltando a usar o valor de ETag original. Desta vez, a operação retorna os dados solicitados porque a versão no servidor é diferente (e mais recente) em comparação à versão identificada na solicitação. Como em todas as recuperações de registro, a resposta inclui um cabeçalho de ETag que identifica a versão atual.
Solicitação 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
Resposta 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" }
Saída do 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" }
Simultaneidade otimista ao excluir e atualizar
Esta seção do programa demonstra como realizar operações de exclusão e atualização condicionais. O uso mais comum dessas operações é implementar uma abordagem de simultaneidade otimista para processamento de registros em um ambiente de vários usuários.Para obter mais informações:Aplicar simultaneidade otimista
Tente excluir a conta original se e apenas se ela corresponder à versão original (valor de ETag). Essa condição é representada pelo cabeçalho If-Match. Essa operação falha porque o registro da conta foi atualizado na seção anterior e, como resultado, sua versão foi atualizada no servidor.
Solicitação 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
Resposta 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.", . . . } }
Saída do 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'.
Tente atualizar a conta se e apenas se ela corresponder ao valor de ETag original. Novamente, essa condição é representada pelo cabeçalho If-Match, e a operação falha pela mesma razão.
Solicitação 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 }
Resposta 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.", . . . } }
Saída do 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'.
Tente atualizar novamente, mas, em vez disso, use o valor de ETag atual obtido na última recuperação de registro na seção anterior.
Solicitação 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 }
Resposta HTTP
HTTP/1.1 204 No Content
Saída do console
Account successfully updated using ETag: W/"628460", status code: '204'.
Confirme a atualização realizada recuperando e fornecendo o estado de conta atual. Ela usa uma solicitação GET básica
Solicitação 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
Resposta 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" }
Saída do 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" }
Controle de operações de upsert
Esta seção do programa demonstra como realizar operações PATCH condicionais, limitando operações de upsert que serão realizadas como apenas atualização ou apenas inserção.Para obter mais informações:Limite de operações de upsert
Tente inserir, sem atualizar, as propriedades de telefone primárias e as propriedades de receita dessa conta. O cabeçalho If-None-Match com o valor de * representa essa condição de upsert. Essa operação falha porque esse registro de conta ainda existe no servidor (a menos que ele tenha sido excluído atualmente por outro usuário ou processo).
Solicitação 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 }
Resposta 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.", . . . } }
Saída do console
Expected Error: A record with matching key values already exists. Account not updated using ETag 'W/"628448", status code: '412'.
Tente realizar a mesma operação de atualização sem criação. Para isso, o cabeçalho condicional If-Match é usado com um valor de *. Essa operação ocorre porque o registro existe no servidor.
Solicitação 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 }
Resposta HTTP
HTTP/1.1 204 No Content
Saída do console
Account updated using If-Match '*'
Recupere e forneça o estado de conta atual com uma solicitação básica GET. Observe que o valor de ETag retornado foi alterado para refletir a versão nova e atualizada do registro da conta.
Solicitação 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
Resposta 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" }
Saída do 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" }
Exclua a conta com um DELETE básico.
Solicitação 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
Resposta HTTP
HTTP/1.1 204 No Content
Saída do console
Account was deleted.
Assim como na etapa 2, tente atualizar a conta se ela existir. Novamente, essa condição é representada pelo cabeçalho If-Match com um valor de *. Essa operação falha porque esse registro foi simplesmente excluído. No entanto, se esse cabeçalho If-Match estava ausente, logo a operação de upsert básica resultante deve criar um novo registro com êxito.
Solicitação 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 }
Resposta 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", . . . } }
Saída do 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'.
Não há necessidade de limpar os dados de exemplo porque um registro de conta já foi excluído na etapa 4.
Confira Também
Use a API da Web do Microsoft Dynamics 365
Executar operações condicionais usando A API
Amostra de operações de condição API da Web (C#)
Exemplo de operações condicionais da API Web (JavaScript do lado do cliente)
Microsoft Dynamics 365
© 2017 Microsoft. Todos os direitos reservados. Direitos autorais