20 de março de 2023

Como utilizar a API Via CEP para preencher o endereço no cadastro de uma aplicação APEX

Neste artigo vamos fazer a integração de uma aplicação APEX com a API ViaCEP, da Empresa de Correios e Telégrafos do Brasil, para que, quando digitarmos o CEP do endereço no campo de uma tela de cadastro, essa integração buscará os dados na base de dados dos Correios e irá preencher os dados do endereço no cadastro da aplicação APEX.

Inicialmente, vamos considerar uma situação que temos uma página P99 -  Cadastro de Cliente, e na seção endereço existem os seguintes campos:

  • P99_CEP
  • P99_UF
  • P99_LOCALIDADE

Vamos construir uma Ação Dinâmica que seja executada quando o campo CEP for alterado.

No ambiente desenvolvimento, acessamos o item P99_CEP e criamos uma Ação Dinâmica com as seguintes propriedades:

Quando

  • Nome: preenche_dados
  • Evento: Change (será executado toda vez que o valor no campo for alterado)

Ação True

  • Execute JavaScript Code
  • Itens a Submeter: P99_LOCALIDADE;P99_UF

 

O código PL/SQL é o mostrado abaixo:

DECLARE
 v_jason_api clob;
 v_cep varchar2(10)

BEGIN
 apex_web_service.g_request_headers.delete();

 v_cep := :P99_CEP;

 v_json_api := apex_web_service.make_rest_request(
p_url => 'https://viacep.com.br/ws/'||v_cep||'/json/,
p_http_method => 'GET'
 );

 for cur in (
select 
localidade, 
uf
from json_table (
v_json_api format json '$'columns(
  localidade varchar2(100) path '$.localidade',
  uf varchar2(2) path '$.uf'
)
        )

 )loop
:P99_UF := cur.uf;
:P99_LOCALIDADE := cur.localidade;
 end loop;

exception
 when others then
apex_error.add_error (
p_message => 'Erro ao requisitar o CEP - '|| sqlerrm,
p_display_location => apex_error.c_inline_in_notification);

END;


Passamos agora a detalhar o que o código acima faz.

Inicialmente são declaradas as variáveis v_jason_api, do tipo clob, e v_cep, do tipo varchar2.

A execução começa com a função apex_web_service.g_request_headers.delete(), que limpa os cabeçalhos HTTP da sessão.

Em seguida, a variável v_cep recebe o valor informado no campo P99_CEP.

Então é executada uma função v_json_api do tipo request utilizando a url https://viacep.com.br/ws/ concatenada com a variável v_cep, que foi previamente preenchida com o valor informado no campo P99_CEP, sendo utilizado o método GET. É essa função que acessa a API ViaCEP dos Correios.

Prosseguindo, é feito um select na base de dados jason_table, buscando os campos UF e Localidade, e posteriormente gravando os mesmos nas variáveis cur.uf e cur.localidade, respectivamente.

Em seguida é iniciado um LOOP para preencher os campos/itens P99_UF e P99_LOCALIDADE com os valores coletados nas variáveis cur.uf e cur.localidade.

Observação: no caso de buscas onde é retornado apenas um único registro, como é o caso do CEP, não seria necessário o LOOP, no entanto foi colocado o mesmo apenas para efeito de exemplificação, pois nos casos em que a busca retorna mais de um registro, o LOOP é imprescindível para alimentar os registros da tabela de destino.

Por fim, é implementada uma exception que mostra uma mensagem de erro caso haja algum problema na execução da requisição.

E assim, ao digitar um numero de cep no campo P99_CEP, a ação dinâmica acima descrita busca o cep na API ViaCEP e preenche os campos P99_UF e P99_LOCALIDADE com os seus respectivos valores.

É claro que podemos alterar a código de forma a incluir mais campos na pesquisa, como Logradouro e Bairro.

Nenhum comentário:

Postar um comentário