Ir para conteúdo
  • Cadastre-se

dev botao

AcbrOpenDelivery: "Invalid class typecast" ao receber no json status Inválido


Ver Solução Respondido por Gabriel Baltazar,
  • Este tópico foi criado há 714 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

 

Como teste, foi utilizado o projeto de Demo: AcbrOpenDelivery_DemoVCL

Após incluir o pedido fake abaixo (via postman) no HubDelivery:

{
  "saleChannelId": "*****",
  "sourceAppId": "*****",
  "type": "DELIVERY",
  "scheduled": false,
  "extraInfo": "Pedido Teste",
  "items": [
    {
      "name": "X-Burger",
      "externalCode": "0101",
      "quantity": 1,
      "unitPrice": 10,
      "specialInstructions": "Remover mostarda 2022-10-19",
      "options": [
        {
          "name": "Coca-Cola",
          "externalCode": "COC",
          "quantity": 1,
          "unitPrice": 0,
          "specialInstructions": ""
        }
      ]
    }
  ]

 

Listar esse pedido com o botão Polling e depois pego o seu "Order ID", na aba Orders (Pedidos) é clicado no botão "Get Order details" com o o "Order ID" informado.

Depois que puxou os detalhes, é aguardado um tempo para que passe do tempo limite, e não possa mais confirmar remotamente...

É tentado clicar em "Confirm", logicamente para confirmar o pedido.

É retornado uma mensagem de erro em json:
         '[{"code":501,"message":"Invalid Status"}]'

Até aqui, tudo certo pois o status não pode mais ser modificado para confirmado, pois excedeu o tempo.

Só que no código é gerado a exceção:
   "Invalid class typecast"

Esse erro ocorre na função: "TACBrJSONObject.Parse" que redireciona para a
"TACBrJSONObject.CreateJsonObject", que ao receber o texto do json,
esta tentando transformar o json acima, em um TJsonObject (Simples),
mas ele é um JsonArray.

E ai que ocorre o erro, pois não é possível transformar.

Isso ocorre ao tentar executar:
   Result := TJsonObject.Parse(AJsonString) as TJsonObject

Finalizando no bloco da exception.

Fato observado, é que ao retornar algo que NÃO seja um JsonArray, então Não ocorrerá o erro, por exemplo,
se for retornado:
    {"code":501,"message":"Invalid Status"}
    < observe que não é um json array, e sim um json simples >
Nesse caso, NÃO é gerado uma exceção e o código executa sem erros.

No entanto, conforme documentação da opendelivery, é sempre retornado um JsonArray para erro 501.

=>>> Em resumo: precisamos de uma correção no código para tratar esse retorno.

Observação: esta ativa a diretiva "USE_JSONDATAOBJECTS_UNIT"

Captura de tela 2022-11-10 162905.png

  • Solution
Postado

Analisando o cenário, percebemos que o HubDelivery está retornando o erro num formato diferente do padrão OpenDelivery, onde no OpenDelivery especifica um JSONObject como retorno de erro e o HubDelivery está retornando um JSONArray diferente do formato da especificação. Já acionamos o HubDelivery e foi aberta uma issue com eles para adequar a resposta de acordo com a especificação do OpenDelivery.

Enquanto isso para conseguirmos um tratamento mais amigável, colocamos no componente um Evento OnHTTPError para que possa tratar esse tipo de erro de forma customizada e amigável.

Por favor atualize os fontes e teste novamente esse cenário, o  exemplo também está atualizado com esse evento.

 

Att.

  • Curtir 1
  • 4 semanas depois ...
  • Administradores
Postado

Boa tarde, td bem?

Em 16/11/2022 at 11:08, Gabriel Baltazar disse:

Enquanto isso para conseguirmos um tratamento mais amigável, colocamos no componente um Evento OnHTTPError para que possa tratar esse tipo de erro de forma customizada e amigável.

Por favor atualize os fontes e teste novamente esse cenário, o  exemplo também está atualizado com esse evento.

Chegou a fazer este teste indicado pelo Gabriel?

At.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Consultores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Este tópico foi criado há 714 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.