Processamento da API da Groupon – Epílogo
Casos excecionais e raros podem comprometer aplicações de mapeamento de dados com arquiteturas pouco acopladas. Isto é especialmente verdade quando se estão a processar grandes conjuntos de dados disponíveis na Internet e se tem pouca ou nenhuma influência sobre os dados de origem. Neste artigo, descrevemos uma técnica de depuração que permite aos desenvolvedores que trabalham em projetos de mapeamento e transformação de dados identificar e adaptar rapidamente dados inesperados provenientes de uma fonte remota. O problema No verão passado, publicámos uma série de artigos no blogue que descreviam como.. Trabalhar com a API da Groupon para obter um subconjunto de ofertas em todas as cidades onde o Groupon opera e formatar a lista para visualização num navegador web ou dispositivo móvel.
![]()
Concluímos com uma linha de comando para executar um mapeamento de dados no MapForce que chama a API da Groupon mais de 150 vezes – uma vez para cada cidade da Groupon –, depois filtra os dados para extrair as ofertas vendidas na internet, em vez de em locais físicos, e formata os resultados em HTML usando o StyleVision. Todas as manhãs, executamos esta linha de comando num ficheiro por lotes que guarda a saída em HTML num servidor local, para que os nossos colegas possam consultá-la com qualquer navegador e encontrar ofertas interessantes de todo o país. O mapeamento funcionou corretamente durante mais de dois meses, até que um dia falhou com a seguinte mensagem de erro: "O valor de origem "" do tipo dateTime não pôde ser convertido para o tipo de destino dateTime." A explicação específica é que, em algum ponto do mapeamento, onde esperávamos receber um valor do tipo dateTime, recebemos um valor vazio. Numa perspetiva mais abstrata, o erro sugere uma possível falha na lógica da nossa estratégia de mapeamento. Sempre que chamamos a API da Groupon, recebemos um fluxo de dados XML bem formatado, contido num elemento
Ferramentas de Depuração O MapForce oferece ajuda para a depuração. Podemos executar o nosso mapeamento de dados utilizando o motor de execução integrado do MapForce para ver mais detalhes na janela de mensagens.
![]()
As linhas identificadas como "Local relacionado" são hiperligações que remetem aos componentes no mapa onde ocorreu o erro. Ao clicar no resultado do erro, somos redirecionados para uma função "format-dateTime".
![]()
Podemos clicar no aviso de "erro" ou rastrear o conector de valores para identificar o elemento de entrada da função "format-dateTime". De qualquer forma, conseguimos localizar o elemento que causou o erro.
![]()
O elemento problemático está localizado no componente de entrada, que recolhe todos os dados retornados pelas nossas chamadas à API da Groupon antes de qualquer filtragem ou conversão. Quando projetámos o mapeamento, o elemento "endAt" nos nossos dados de exemplo sempre indicava a data e hora de término de cada oferta da Groupon, mas, por alguma razão, parece que recebemos um valor vazio neste campo. Se o erro tivesse ocorrido ao processar um ficheiro de entrada local, poderíamos simplesmente examinar o conteúdo do ficheiro, mas, neste caso, os dados provêm de várias URLs e são armazenados temporariamente até serem mapeados para o componente de saída. Felizmente, podemos aplicar uma solução para modificar facilmente o mapeamento e preservar todos os dados recebidos da API da Groupon. Simplesmente copiamos o componente de entrada e colamos uma cópia no mapeamento. Podemos conectar o elemento de resposta do componente original à cópia, o que simultaneamente mapeia todos os elementos filhos entre os componentes.
![]()
O nosso componente de entrada original está agora conectado a dois componentes de saída. Podemos selecionar qual componente de saída será gerado pelo motor de execução integrado do MapForce, clicando no ícone de "olho" no canto superior direito de qualquer componente de saída. O novo componente de saída simplesmente guarda uma cópia de tudo o que está no componente de entrada. Quando examinamos os dados brutos usando o XMLSpy, confirmamos que encontramos um elemento vazio no local onde esperávamos encontrar uma data e hora:
![]()
A solução
Agora que sabemos que uma oferta pode não ter uma data de término específica, podemos planear essa possibilidade no mapeamento. No tratamento atualizado do elemento "endAt", realizamos um teste condicional antes da função original de formatação de data e hora, e fornecemos um resultado alternativo quando o elemento "endAt" estiver vazio.
![]()
Tivemos de trabalhar rapidamente, pois todos os dados do Groupon têm um prazo de validade. O caso específico acabaria por expirar e desaparecer do fluxo de dados. Esta experiência demonstrou-nos a importância de ter ferramentas de depuração poderosas e de as utilizar de forma criativa, mesmo depois de se pensar que um projeto de mapeamento de dados está a funcionar corretamente! O Altova MapForce é Disponível em versão de teste gratuita – o próximo caso limite que resolver poderá ser o seu próprio.
Nota do Editor: A nossa série original sobre a utilização da API da Groupon para mapeamento de dados foi publicada em três partes. Pode consultar as partes clicando nos links abaixo: A primeira parte, "Processamento da API da Groupon com o Altova MapForce", descreve como criar entradas dinâmicas através da recolha de dados de várias URLs. A segunda parte, "Processamento da API da Groupon com o MapForce – Parte 2", explica como filtramos os dados da API e definimos a saída para extrair apenas os detalhes mais relevantes. A terceira parte, "Processamento da API da Groupon – Parte 3", descreve como formatar a saída como um único documento HTML, otimizado para dispositivos de secretária e dispositivos móveis, e analisa formas de automatizar a execução repetida.