Consumo de uma API, com recebimento de dados no formato JSON, dentro de um Projeto Personalizado do VsScripter

Objetivo

O objetivo deste documento é auxiliar o usuário a criar um “script” para consumo de API Rest, que fornece dados de cotação de moeda, gravando-os em uma tabela personalizada, chamada “U_COTACAOMOEDAS”.

Criando a tabela personalizada “U_COTACAOMOEDAS”

Será necessário utilizar o Person para criar a tabela “U_COTACAOMOEDAS”. Caso exista alguma dúvida sobre o funcionamento do Person, a documentação a seguir deverá ser consultada.   

Estrutura da tabela

Abaixo é descrita a estrutura da tabela personalizada, a qual receberá os dados da cotação

Nome da tabela: U_COTACAOMOEDAS

Descrição: Tabela para cotação cotação de moedas 

Coluna

MOEDABASE

Descrição completa/reduzida

Moeda Base

Dica para usuário

Moeda a ser convertida

Tipo da coluna

Texto

Tamanho máximo

10 caracteres 

 

 

Coluna

MOEDADESEJADA

Descrição completa/reduzida

Moeda desejada

Dica para usuário

Moeda desejada para o cálculo da moeda base

Tipo da coluna

Texto

Tamanho máximo

10 caracteres 

 

 

Coluna

NOMECONVERSAO

Descrição completa/reduzida

Descrição

Dica para usuário

Descrição da conversão

Tipo da coluna

Texto

Tamanho máximo

50 caracteres 

 

 

Coluna

VALORMAXIMO

Descrição completa/reduzida

Valor máximo

Dica para usuário

Valor máximo da moeda na data

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

VALORMINIMO

Descrição completa/reduzida

Valor mínimo

Dica para usuário

Valor mínimo da moeda na data

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

PCTVARIACAO

Descrição completa/reduzida

Porcentagem de Variação / Variação

Dica para usuário

Porcentagem de Variação

Tipo da coluna

Número

Quantidade casas inteiras / decimal

3 / 4

 

 

Coluna

PRECOCOMPRA

Descrição completa/reduzida

Preço de compra

Dica para usuário

Preço pago na compra da moeda

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

PRECOVENDA

Descrição completa/reduzida

Preço de venda

Dica para usuário

Preço de venda da moeda

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

VARIACAO

Descrição completa/reduzida

Variação

Dica para usuário

Valor da variação de preços

Tipo da coluna

Número

Quantidade casas inteiras / decimal

4 / 4

 

 

Coluna

DATACOTACAO

Descrição completa/reduzida

Data da cotação

Dica para usuário

Data na qual a cotação foi feita

Tipo da coluna

Data e hora

Após criação da tabela, a mesma deverá ficar parecida com a figura abaixo:

Criando o “script” por meio do Gerenciador de Projetos

Para iniciar o editor do VsScripter, no Gerenciador de Projetos, clique no botão Novo Projeto. O nome do projeto será solicitado, conforme imagem abaixo:

Utilize o nome “CotacaoMoedas” para o projeto e clique no botão OK.

Inicialmente, a tela de edição do VsScripter será mostrada apenas com a “unit” uPrinc, conforme abaixo: 

Entendendo o código do “script”

Copie ou digite o código abaixo na “unit” uPrinc: 

uses // dá acesso ao conteúdo "unit" uPesquisaCotacao uPesquisaCotacao; var // reserva espaço na memória para um objeto com o nome form que // herdará todas as características do formulário TfrmPesquisaCotacao form : TfrmPesquisaCotacao; begin // início do ciclo de vida do "script" try // cria, efetivamente, um objeto com o nome form que herdará todas as // características do formulário TfrmPesquisaCotacao form := TfrmPesquisaCotacao.Create(nil); // monitora o status do objeto "form". Assim, quando as operações // finalizarem e o ModalResult do formulário for mrOk, o ciclo de vida // do "script" será finalizado. Qualquer ação que seja pretendida após o // final do "script", como mensagens ao operador, devem ser colocadas // entre o begin e o end logo abaixo if form.ShowModal = mrOk then begin end; // final do ciclo de vida do "script" finally // libera o objeto "form" da memória, destruindo todos os dados e objetos // criados nele. form.Free; end; end;

Criando o formulário “frmPesquisaCotacao”

Para criar um novo formulário, acessar o menu “File” e em seguida o submenu “New Form”, ou clicando no botão “New form”, que é representado por um formulário em branco com uma estrela amarela na parte superior esquerda. 

O novo formulário precisará de dois componentes, listados abaixo: 

Componente

Novo nome (Name)

Caption / Text

TButton

btnProcessar

&Pesquisar

TComboBox

cboEscolherCotacao

Escolha a conversão desejada

Os componentes visuais ficam na “Tool Palette”, a direita. Selecionar um componente por vez, clicando, segurando o botão do mouse e arrastando o componente para o formulário. Assim, repetir para todos os componentes.

As propriedades “Name”, “Caption” e “Text” são propriedades que podem ser alteradas na barra a esquerda, chamada “Object Inspector. Essas alterações devem ser feitas uma por uma, em cada componente. Ou seja, selecionar um componente e alterar suas propriedades “Name”, “Caption” e “Text”, um componente por vez.

A propriedade “Caption” pertence ao componente “TButton”. No caso do componente “TComboBox”, a propriedade “Text” é que deve ser mudada.

Além disso, os itens do “TComboBox”, na propriedade “Items” são: USD-BRL, EUR-BRL, USD-BRLT e BTC-BRL. Eles devem ser digitados um por linha, ou seja, pressionando o Enter ao final de cada um e não deve ser colocado vírgula após cada item.

 O “layout” do formulário deve ficar parecido com o abaixo, embora o usuário seja livre para fazer da sua maneira:

Para salvar os trabalhos feitos até agora, pressionar o ícone que presenta dois “disquetes” pretos ou a combinação “CTRL+SHIFT+S”.

O novo formulário “frmPesquisaCotacao” é a parte gráfica do projeto do “script”. Quando for solicitado um nome de sua “unit”, que é a parte dos códigos do “script” em si, salvar com o nome “uPesquisaCotacao”.

Com a tecla “F12” é possível mudar entre os modos de “Design” (“layout” gráfico e colocação de componentes) e “Code” que é parte e programação.

Pressionar “F12” para mudar para o modo de programação do “script”. O código abaixo deve ser copiado/digitado na área de programação:

Código da “unit” uPesquisaCotacao: 

{$FORM TfrmPesquisaCotacao, uPesquisaCotacao.sfm} uses Classes, Graphics, Controls, Forms, Dialogs, Db, DbClient; uses uVsHttpRequest, IdSSLOpenSSL, uLkJson, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, VsMask, System; var http: TVsHttp; SSL1 : TIdSSLIOHandlerSocketOpenSSL; cUrl : String; obj : TlkJSONobject; Function buscarMoedas(moedas: String):String; begin http := TVsHttp.Create; cUrl := Format('https://economia.awesomeapi.com.br/%s', [moedas]); //somente necessário para https SSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil); IdSSLOpenSSL.UnLoadOpenSSLLibrary(); try //essas opções vai de cada servidor SSL1.SSLOptions.Method := sslvTLSv1_2; SSL1.SSLOptions.SSLVersions := [sslvTLSv1_2];//, sslvTLSv1, sslvSSLv23, sslvTLSv1_1, sslvTLSv1_2]; //associando o SSL ao componente de conexão http.SetIOHandler(SSL1); //primeira consulta get simples Result := http.get(cUrl); // Se precisar analisar o retorno, remover comentário do comando abaixo // showMessage(Result); finally SSL1.free; http.free; end; end; function trocaPonto(valor: String):String var x: Integer; nStr: String; begin nStr := ''; for x:=1 to length(valor) do begin if copy(valor, x, 1) <> '.' then nStr := nStr + copy(valor, x, 1) else nStr := nStr + ','; end; Result := nStr; end; function GravaCotacao(jsonO: TlkJSONobject):Boolean; var cdsMoeda: TClientDataSet; begin try // cria o objeto cdsMoeda do tipo TClientDataSet cdsMoeda := TClientDataSet.Create(nil); // preparando o objeto cdsMoeda para receber um TDataSetProvider com nome formado por // dsp+NOMETABELA e abertura automática dmConexao3c.GetDspEdicao(cdsMoeda, 'U_COTACAOMOEDAS', true); // abre o cdsMoeda cdsMoeda.open; // coloca o cdsMoeda em modo de inserção de dados cdsMoeda.Append; // busca um valor válido e ordenado que será o índice da tabela, armazenado em // U_COTACAOMOEDAS_ID cdsMoeda.FieldByName('U_COTACAOMOEDAS_ID').value := dmConexao3c.QueryPegaCampo('SEL_PADRAO_COM_WHERE', 'MAX(U_COTACAOMOEDAS_ID)', ['?', '1:s', 'U_COTACAOMOEDAS', '?', '2:s', '0=0'], [ftString, ftString], [20, 100])+1; // atribui ao campo MOEDABASE o valor da chave code cdsMoeda.FieldByName('MOEDABASE').value := jsonO.Field['code'].value; // atribui ao campo MOEDADESEJADA o valor da chave codein cdsMoeda.FieldByName('MOEDADESEJADA').value := jsonO.Field['codein'].value; // atribui ao campo NOMECOVERSAO o valor da chave name cdsMoeda.FieldByName('NOMECONVERSAO').value := jsonO.Field['name'].value; // atribui ao campo VALORMAXIMO o valor da chave high cdsMoeda.FieldByName('VALORMAXIMO').value := trocaPonto(jsonO.Field['high'].value); // atribui ao campo VALORMINIMO o valor da chave low cdsMoeda.FieldByName('VALORMINIMO').value := trocaPonto(jsonO.Field['low'].value); // atribui ao campo PCTVARIACAO o valor da chave pctChange cdsMoeda.FieldByName('PCTVARIACAO').value := trocaPonto(jsonO.Field['pctChange'].value); // atribui ao campo PRECOCOMPRA o valor da chave bid cdsMoeda.FieldByName('PRECOCOMPRA').value := trocaPonto(jsonO.Field['bid'].value); // atribui ao campo PRECOVENDA o valor da chave ask cdsMoeda.FieldByName('PRECOVENDA').value := trocaPonto(jsonO.Field['ask'].value); // atribui ao campo VARIACAO o valor da chave varBid cdsMoeda.FieldByName('VARIACAO').value := trocaPonto(jsonO.Field['varBid'].value); // atribui ao campo DATACOTACAO o valor da chave create_date cdsMoeda.FieldByName('DATACOTACAO').Value := DateTimeToStr(jsonO.Field['create_date'].Value); // Indica ao cds que os dados podem ser gravados cdsMoeda.post; // indica ao servidor de aplicações para aplicar as alterações feitas dmConexao3c.CDSApplyUpdates([cdsMoeda]); finally // destruindo os objetos em memória cdsMoeda.free; showMessage(Format('Cotação: %s'+#13#13+ 'Valor mínimo: R$ %s'+#13#13+ 'Valor máximo: R$ %s'+#13#13+ 'Data: %s', [jsonO.Field['name'].value, trocaPonto(jsonO.Field['bid'].value), trocaPonto(jsonO.Field['ask'].value), DateTimeToStr(jsonO.Field['create_date'].Value)])); end; end; procedure btnPesquisarClick(Sender: TObject); var obj : TlkJSONobject; json : WideString; jsonL : TlkJSONlist; jsonO : TlkJSONobject; i : Integer; cdsMoeda: TClientDataSet; begin try // recebe o json relativo à conversão das moedas. json := UTF8Encode((buscarMoedas(cboEscolherCotacao.Items[cboEscolherCotacao.ItemIndex]))); // se json não estiver vazio e não conter '#erro' em seu conteúdo. if ((Length(json) > 0) and (Pos('#erro', lowercase(json)) = 0)) then begin // transforma o conteúdo de json em uma lista JSON jsonL := TlkJSON.ParseText(Json) as TlkJSONlist; // verifica se a lista foi criada com sucesso if assigned(jsonL) then begin // cria um 'loop' para processar todos os itens da lista Json for i:=0 to jsonL.count-1 do begin // cria um objeto json, equivalente a um registro jsonO := jsonL.child[i] as TlkJSONobject; GravaCotacao(jsonO); end; end else // se a lista JSON não for criada ShowMessage('Não carregou a conversão de moedas.'); end else // se existir alguma mensagem de erro, ela é mostrada ao usuário if Pos('#erro', lowercase(json)) > 0 then ShowMessage(Format('Erro retornado: %s', [UTF8Encode(json)])); finally // finaliza os objetos criados e retorna a constante mrOk para indicar que o // processo finalizou. jsonL.Free; ModalResult := mrOk; end; end;

Salvar novamente o projeto do “VsScripter” e fechar seu editor.

Testando o “script” de cotação de moedas

Para testar o “script”, é necessário executá-lo por meio do botão Executar, a partir do Gerenciador de Projetos:

Após efetuar a troca do usuário, o projeto Cotação de Moedas aparecerá no menu Projetos Personalizados, conforme imagem abaixo:

Escolher uma das cotações disponíveis, por meio do campo “Escolha a conversão desejada” e pressionar o botão “Pesquisar”. Em alguns segundos, será mostrado o nome da cotação, os valores mínimo e máximo e a data da cotação, além desses dados serem gravados automaticamente na tabela U_COTACAOMOEDAS, conforme figura abaixo: