Consultar uma API de CEP usando SQL Server

Veja como consumir uma API de CEP com o SQL Server

Neste artigo, você vai ver como consumir uma API que retorna dados em formato JSON utilizando o SQL Server. Como exemplo, vamos consultar o CEP de uma API pública. Você pode adaptar este exemplo para outros tipos de consulta.

Para consultar o CEP vamos utilizar a API da ViaCEP. Vamos conferir primeiro qual o retorno que é devolvido pela API. No seu navegador, acesse o seguinte endereço:

http://viacep.com.br/ws/01531001/json

Perceba que antes do "/json" se encontra o CEP que desejamo pesquisar, sem o traço.

O retorno desta consulta é o seguinte:

{

  "cep": "01531-001",

  "logradouro": "Avenida da Aclimação",

  "complemento": "lado ímpar",

  "bairro": "Aclimação",

  "localidade": "São Paulo",

  "uf": "SP",

  "unidade": "",

  "ibge": "3550308",

  "gia": "1004"

}


A consulta a API será feita utilizando uma procedure. Como a consulta é online, pode haver uma pequena demora no retorno dos resultados. 

Apenas para fins de controle, vamos criar uma tabela para armazenar o retorno recebido da API.

CREATE TABLE [dbo].[log_api_cep](

[log_id] [int] IDENTITY(1,1) NOT NULL,

[log_cep] [varchar](50) NULL,

[log_resposta] [varchar](500) NULL,

[log_data] [datetime] NULL,

 CONSTRAINT [PK_log_cep] PRIMARY KEY CLUSTERED 

(

[log_id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

Para que a procedure funcione, é necessário ativar no seu SQL Server algo chamado Ole Automation, este recurso pode não estar ativado por padrão.

A procedure vai receber apenas os números do CEP, ativar o Ole Automation e fazer a conexão com a API.

O código inicial fica da seguinte forma:

CREATE PROCEDURE [dbo].[consultaCEP] (

    @CEP VARCHAR(8)

)

AS BEGIN




    DECLARE 

        @obj INT,

        @Url VARCHAR(255),

        @resposta VARCHAR(8000),

EXECUTE sp_configure 'show advanced options', 1;

    RECONFIGURE WITH OVERRIDE;

    EXEC sp_configure 'Ole Automation Procedures', 1;

    RECONFIGURE WITH OVERRIDE;

    

    SET @Url = 'http://viacep.com.br/ws/' + @CEP + '/json'

 

    EXEC sys.sp_OACreate 'MSXML2.ServerXMLHTTP', @obj OUT

    EXEC sys.sp_OAMethod @obj, 'open', NULL, 'GET', @Url, FALSE

    EXEC sys.sp_OAMethod @obj, 'send'

    EXEC sys.sp_OAGetProperty @obj, 'responseText', @resposta OUT

END

 

No código acima, ativamos o Ole Automation utilizando as procedures "sp_configure", e depois fizemos a conexão para a URL da API através de um objeto "MSXML2.ServerXMLHTTP". A conexão foi feita através do método GET, e o resultado da conexão foi armazenado numa variável chamada "@obj". O retorno da API, recebido no "responseText", que está disponível na variável "@obj", foi atribuído a uma variável chamada "@resposta".

Essa variável "@resposta" será utilizada para alimentar o log e para devolver os resultados para o usuário.

Para fazer o log, basta fazer um insert na tabela de log_api_cep

INSERT into log_api_cep(log_cep, log_resposta, log_data) values (@CEP, @resposta, convert(datetime, getdate(), 103))

Para fazer o parse do JSON e extrair as informações vamos utilizar a função JSON_VALUE. Esta função recebe como parâmetro dois valores, o primeiro é o JSON que deve ser utilizado, o segundo é a propriedade que deve ser extraída. 

O código final de nossa procedure ficará assim:

 

CREATE PROCEDURE [dbo].[consultaCEP] (

    @CEP VARCHAR(8)

)

AS BEGIN

    DECLARE 

        @obj INT,

        @Url VARCHAR(255),

        @resposta VARCHAR(8000),

 

EXECUTE sp_configure 'show advanced options', 1;

    RECONFIGURE WITH OVERRIDE;

    EXEC sp_configure 'Ole Automation Procedures', 1;

    RECONFIGURE WITH OVERRIDE;

    

    SET @Url = 'http://viacep.com.br/ws/' + @CEP + '/json'

 

    EXEC sys.sp_OACreate 'MSXML2.ServerXMLHTTP', @obj OUT

    EXEC sys.sp_OAMethod @obj, 'open', NULL, 'GET', @Url, FALSE

    EXEC sys.sp_OAMethod @obj, 'send'

    EXEC sys.sp_OAGetProperty @obj, 'responseText', @resposta OUT




INSERT into log_api_cep(log_cep, log_resposta, log_data) values (@CEP, @resposta, convert(datetime, getdate(), 103))



EXEC sys.sp_OADestroy @obj



    SELECT

        JSON_VALUE(@resposta, '$.cep') AS CEP,

        JSON_VALUE(@resposta, '$.logradouro') AS Logradouro,

        JSON_VALUE(@resposta, '$.bairro') AS Bairro,

        JSON_VALUE(@resposta, '$.localidade') AS Cidade,

        JSON_VALUE(@resposta, '$.uf') AS Estado

END

 

Exemplo de como utilizar esta procedure:

EXEC dbo.consultaCEP '01531001'

Não esqueça de conferir o log

select * from log_api_cep

Como bônus, vamos aprender como trabalhar com o log. Você percebeu que todo o retorno no formato JSON ficou armazendo dentro de um campo varchar chamado log_resposta. Para extrair os dados deste campo, vamos novamente  usar a função JSON_VALUE

Nossa consulta ao log vai ficar da seguinte forma:

select

 log_cep, 

 JSON_VALUE(log_resposta, '$.logradouro') as logradouro,

 JSON_VALUE(log_resposta, '$.bairro') as bairro,

 JSON_VALUE(log_resposta, '$.localidade') as cidade,

 JSON_VALUE(log_resposta, '$.uf') as estado

from log_api_cep

 

 

Quer conferir mais dicas sobre banco de dados? Clique aqui e veja mais dicas!