Executar operações condicionais usando A API
Publicado: janeiro de 2017
Aplicável a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Microsoft Dynamics 365 oferece suporte para um conjunto de operações condicionais baseados em mecanismo padrão de HTTP de controle de versão do recurso conhecido como ETags.
Neste tópico
ETags
Cabeçalhos de correspondência e não correspondência
Recuperações condicionais
Limite de operações de upsert
Aplicar simultaneidade otimista
ETags
O protocolo HTTP define uma marca de entidade, ou ETag para identificação breve de versões específicas de um recurso. ETags são identificadores opacos cujos valores exatos sejam dependentes de implementação. Os valores de ETag ocorrem em duas variedades: validação fraca e forte. Validação forte indica que um recurso único, identificado pelo URI específico, serão idênticos no nível de binário se o valor de ETag correspondente for inalterado. A validação fraca garante que somente representação é semanticamente de recursos equivalentes para o mesmo valor de ETag.
Dynamics 365 gera uma propriedade fracamente validação @odata.etag para cada instância da entidade, e esta propriedade é retornada automaticamente com cada registro da entidade recuperado. Para obter mais informações, consulte Recuperar uma entidade usando a API Web.
Cabeçalhos de correspondência e não correspondência
Os títulos eSem Nenhuma correspondência o uso Sem correspondência de valores de ETag verifique se a versão atual de um recurso corresponda a ela um sobrenome, e qualquer versão antiga ou não correspondem a uma versão. Essas comparações formam a base de suporte condicional a operação. O Dynamics 365 oferece a ETags condicionais recuperações de suporte, à simultaneidade otimista, e as operações de upsert limitadas.
Aviso
Código do cliente não precisa inserir sentido para um valor específico de ETag, nem visível a qualquer relacionamento entre ETags além de igualdade ou desigualdade. Por exemplo, um valor de ETag para uma versão mais recente de um recurso não ser garantido é maior que o valor de ETag para uma versão anterior. Além disso, o algoritmo usado para gerar novos valores de ETag pode ser alterados sem prévio aviso entre versões de um serviço.
Recuperações condicionais
Etags permite otimizar recuperações de registro sempre que você acessa o mesmo registro várias vezes. Se já tiver recuperado um registro, você poderá passar o valor ETag com o cabeçalho If-None-Match para solicitar que dados sejam recuperados apenas se tiverem sido alterados desde a última recuperação. Se os dados tiverem sido alterados, a solicitação retornará o status HTTP (OK) de 200 com os últimos dados no corpo da solicitação. Se os dados não tiverem sido alterados, o código de status HTTP (Not Modified) 304 será retornado para indicar que a entidade não foi modificada. A mensagem de exemplo a seguir devolve dados de uma entidade de conta com o accountid igual a 00000000-0000-0000-0000-000000000001 quando os dados não mudaram desde a última tentativa.
Solicitação
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"
Resposta
HTTP/1.1 304 Not Modified Content-Type: application/json; odata.metadata=minimal OData-Version: 4.0
Limite de operações de upsert
Um upsert criando uma entidade funciona geralmente se não existe; se não, atualizar uma entidade existente. Entretanto, ETags pode ser usado para restringir ainda mais upserts evitar a criação ou para evitar atualizações.
Evitar a criação no upsert
Se estiver atualizando dados e houver alguma possibilidade de que a entidade tenha sido excluída intencionalmente, você não desejará recriar a entidade. Para evitar isso, adicione um cabeçalho If-Match à solicitação com um valor de “*”.
Solicitação
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 }
Resposta
Se a entidade for encontrada, você receberá uma resposta normal com o status 204 (No Content). Se a entidade não for encontrada, você receberá a resposta a seguir com o 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> } } }
Evitar a atualização no upsert
Se você estiver inserindo dados, há alguma possibilidade de que um registro com o mesmo valor de id já exista no sistema e você não quer atualizá-lo. Para evitar isso, adicione um cabeçalho If-None-Match à solicitação com um valor de "*".
Solicitação
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 }
Resposta
Se a entidade não for encontrada, você receberá uma resposta normal com o status 204 (No Content). Se a entidade for encontrada, você receberá a resposta a seguir com o 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> } } }
Aplicar simultaneidade otimista
Você pode usar a simultaneidade otimista para detectar se uma entidade foi alterada desde a última recuperação. Se a entidade que você quer atualizar ou excluir foi alterada no servidor desde que você a recuperou, talvez você não queira concluir a operação de atualização ou de exclusão. Aplicando o padrão mostrado aqui, você pode detectar essa situação, recuperar a versão mais recente da entidade e aplicar os critérios necessários para reavaliar se deve tentar a operação novamente.
Aplicar simultaneidade otimista na exclusão
A solicitação de exclusão a seguir de uma conta com o valor accountid of00000000-0000-0000-0000-000000000001 falha porque o valor ETag enviado com o cabeçalho If-Match é diferente do valor atual. Se o valor foi correspondido, um status 204 (No Content) é esperado.
Solicitação
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
Resposta
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> } } }
Aplicar simultaneidade otimista na atualização
A solicitação de atualização a seguir de uma conta com o valor accountid falha porque o valor 00000000-0000-0000-0000-000000000001 enviado com o cabeçalho ETag é diferente do valor atual If-Match. Se o valor foi correspondido, um status 204 (No Content) é esperado.
Solicitação
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"}
Resposta
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> } } }
Confira Também
Amostra de operações de condição API da Web (C#)
Exemplo de operações condicionais da API Web (JavaScript do lado do cliente)
Executar operações usando A API
Compor solicitações de HTTP e lidar com erros
Consultar dados usando a API da Web
Criar uma entidade usando a API da Web
Recuperar uma entidade usando a API Web
Atualizar e excluir entidades que usam a API Web
Associar e desassociar entidades usando a API Web
Usar funções da API Web
Use ações API da Web
Executar operações em lote usando a API da WEB
Representar outro usuário usando API da Web
Microsoft Dynamics 365
© 2017 Microsoft. Todos os direitos reservados. Direitos autorais