Olá pessoal,
Boa tarde!
Neste post estarei demonstrando pra vocês como realizar requisições POST e GET (na verdade, pode ser qualquer tipo) em um banco de dados SQL Server utilizando o SQL CLR.
Se você não sabe o que é CLR ou tem dúvidas sobre como utilizar, como publicar, etc, veja este post aqui.
Eu já havia feito alguns posts aqui no blog demonstrando como fazer isso utilizando OLE Automation, mas como o CLR é uma alternativa muito mais segura e flexível, resolvi demonstrar como fazer isso utilizando o CLR (C#).
Código-fonte da procedure stpWs_Requisicao:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
using System; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Net; using System.IO; using System.Text; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void stpWs_Requisicao(SqlString Ds_Url, SqlString Ds_Metodo, SqlString Ds_Parametros, SqlString Ds_Codificacao, out SqlString Ds_Retorno_OUTPUT) { var parametros = (Ds_Parametros.IsNull) ? "" : Ds_Parametros.Value; var metodo = (Ds_Metodo.IsNull) ? "GET" : Ds_Metodo.Value.ToUpper(); var url = Ds_Url.Value; var feedData = string.Empty; var encoding = (Ds_Codificacao.IsNull) ? "UTF-8" : Ds_Codificacao.Value; try { var request = (HttpWebRequest) WebRequest.Create(url); request.Method = metodo; request.ContentType = "application/x-www-form-urlencoded"; if (metodo == "POST" && parametros.Length > 0) { var data = parametros; var dataStream = Encoding.UTF8.GetBytes(data); request.ContentLength = dataStream.Length; var newStream = request.GetRequestStream(); newStream.Write(dataStream, 0, dataStream.Length); newStream.Close(); } var response = (HttpWebResponse) request.GetResponse(); var stream = response.GetResponseStream(); var streamReader = new StreamReader(stream, Encoding.GetEncoding(encoding)); feedData = streamReader.ReadToEnd(); response.Close(); stream?.Dispose(); streamReader.Dispose(); } catch (Exception ex) { if (SqlContext.Pipe != null) SqlContext.Pipe.Send(ex.Message); } Ds_Retorno_OUTPUT = feedData; } } |
Exemplo de utilização
Uma vez que a procedure já tenha sido criada e o assembly tenha sido publicado no seu servidor, basta utilizar a SP para realizar suas requisições normalmente, como os exemplos abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
DECLARE @Url VARCHAR(MAX) = 'http://viacep.com.br/ws/29090090/xml', @Retorno VARCHAR(MAX) EXEC CLR.dbo.stpWs_Requisicao @Ds_Url = @Url, -- nvarchar(max) @Ds_Metodo = N'GET', -- nvarchar(max) @Ds_Parametros = N'', -- nvarchar(max) @Ds_Codificacao = N'ISO-8859-1', -- nvarchar(max) @Ds_Retorno_OUTPUT = @Retorno OUT -- nvarchar(max) SELECT CAST(@Retorno AS xml) |
Próximos passos
Agora que vocês já aprenderam a realizar as requisições a partir do próprio banco de dados, vocês podem implementar as SP’s abaixo no seu banco de dados, desta vez, utilizando o poder do CLR:
- Consumindo a API do Google Maps utilizando OLE Automation no SQL Server
- Consultando o Rastreamnto de Objetos dos Correios pelo SQL Server
- Consumindo a API do Google Maps para Obter Informações de um Endereço ou CEP no SQL Server
A alteração é bem simples, basta trocar estas instruções:
1 2 3 4 5 6 7 8 |
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 EXEC sys.sp_OADestroy @obj SET @xml = @resposta COLLATE SQL_Latin1_General_CP1251_CS_AS |
por essa:
1 2 3 4 5 6 7 8 9 |
EXEC CLR.dbo.stpWs_Requisicao @Ds_Url = @Url, -- nvarchar(max) @Ds_Metodo = N'GET', -- nvarchar(max) @Ds_Parametros = N'', -- nvarchar(max) @Ds_Codificacao = N'ISO-8859-1', -- nvarchar(max) @Ds_Retorno_OUTPUT = @Retorno OUT -- nvarchar(max) SET @XML = CAST(@Retorno AS XML) |
Bem mais simples, não ?
Um abraço e até o próximo post!
sql server clr integração integration post get requisições requests database banco de dados c# csharp sqlclr
sql server clr integração integration post get requisições requests database banco de dados c# csharp sqlclr
Muito bom, Dirceu! ??
Bom dia.
Estou testando o código, porém meu @Ds_Retorno_OUTPUT=null e meu @return_value =0.
Sabe o que pode estar dando errado?. Estou precisando muito desse codigo para usar o banco como gatilho para fazer requisiçoes em um webservice, visto ser o unico meio que encontrei para integrar um sistema de automação com uma api web.