Recentemente escrevi um post aqui no site apresentando o modelo de comunicação REST. Assim, se você está chegando neste artigo e pela primeira vez está ouvindo o termo REST, recomendo fortemente que leia o post ao qual me refiro antes de prosseguir com a leitura deste.
No post de hoje, utilizaremos WebMatrix e ASP.NET Razor para enviar uma solicitação para um serviço em formato REST e, com base nos dados retornados, os armazenaremos em um banco de dados. Muito embora este processo seja relativamente simples, lhe dará alguma ideia sobre como criar aplicações mais robustas e com arquitetura melhorada utilizando WebMatrix e Razor (este, por sinal, oferece mais poder aos desenvolvedores do que muitos deles imaginam).
Como funciona o serviço de cotação de moedas
O webservice que utilizaremos para construção do exemplo deste post é muito simples. É um serviço que, ao ser chamado, retorna a cotação de moedas para o dia em diferentes formatos. Para a chamada do serviço, apenas uma variável pode ser passada, a saber, “formato”, que recebe a especificação do tipo de retorno. Assim, para efetuar a chamada do serviço, basta fazermos:
[html]
http://cotacao.republicavirtual.com.br/web_cotacao.php?formato=”tipo_de_retorno”
[/html]
Os tipos de retorno suportados serviço são:
- XML
Chamada: http://cotacao.republicavirtual.com.br/web_cotacao.php?formato=xml
[xml]
<!–?xml version=”1.0″ encoding=”iso-8859-1″?–>2,1260
2,1280
2,2200
2,3000
1,2410
1,2410
2,6384
2,6408[/xml] - Query String
Chamada: http://cotacao.republicavirtual.com.br/web_cotacao.php?formato=query_string
[html]
&dolar_comercial_compra=2%2C1260&dolar_comercial_venda=2%2C1280&dolar_paralelo_compra=2%2C2200
&dolar_paralelo_venda=2%2C3000&euro_dolar_compra=1%2C2410&euro_dolar_venda=1%2C2410
&euro_real_compra=2%2C6384&euro_real_venda=2%2C6408
[/html] - JavaScript (para utilização com AJAX)
Chamada: http://cotacao.republicavirtual.com.br/web_cotacao.php?formato=javascript
[javascript]
var resultadoCEP = {
‘dolar_comercial_compra’ : ‘2,1260’,
‘dolar_comercial_venda’ : ‘2,1280’,
‘dolar_paralelo_compra’ : ‘2,2200’,
‘dolar_paralelo_venda’ : ‘2,3000’,
‘euro_dolar_compra’ : ‘1,2410’,
‘euro_dolar_venda’ : ‘1,2410’,
‘euro_real_compra’ : ‘2,6384’,
‘euro_real_venda’ : ‘2,6408’
}
[/javascript]
Você pode utilizar o formato de retorno que achar mais conveniente para sua aplicação. Neste exemplo, solicitaremos a resposta via XML.
Criando o banco de dados da aplicação
O que iremos construir aqui é um “histórico de cotações” (original não?), logo, precisamos armazenar além das cotações, a data corrente. Assim, dentro da área de bancos de dados de seu projeto no WebMatrix, crie um banco de dados e adicione uma tabela chamada “tbHistorico” com a estrutura apresentada pela Figura 1.
Figura 1: Estrutura do banco de dados de nossa aplicação
Implementando a comunicação com o serviço
Já conhecemos as regras de comunicação com o serviço de cotação de moedas e já possuímos a estrutura de armazenamento das informações. A próxima etapa consiste na implementação da comunicação com o serviço. Assim, no workspace de codificação do WebMatrix, na solution explorer, adicione um novo diretório com o nome “App_Code” e dentro deste, um novo arquivo CSHTML (sugestivamente nomeei-o como “CotacaoAtual.cshtml”). Remova o código adicionado automaticamente pelo WebMatrix e adicione o trecho apresentado pela Listagem 1 internamente ao bloco “@functions{}”.
[csharp]
//Informando a URI de conexão com o serviço
private static string uri = “http://cotacao.republicavirtual.com.br/web_cotacao.php?formato={0}”;
//Função que trabalha com a resposta do serviço
public static string RetornaCotacaoServico(string sFormato)
{
string URIFinal = string.Format(uri, sFormato);
string RespostaServico = string.Empty;
//Obtendo a resposta do serviço
System.Net.WebClient DadosCliente = new System.Net.WebClient();
RespostaServico = DadosCliente.DownloadString(URIFinal);
return RespostaServico;
}
[/csharp]
Listagem 1: Conectando-se ao serviço e obtendo a resposta
O código é extremamente simples, mas talvez, alguns comentários possam ajudar. Primeiramente, estamos definindo a URI de conexão ao serviço e especificando o padrão aceito pelo mesmo (linha 2). Em seguida, o que fazermos é criar um método (que neste contexto trabalha de forma mais semelhante as tradicionais funções do paradigma estruturado) que, recebe o parâmetro aceito pelo serviço e, com base nele, baixa as informações do mesmo (variável “RespostaServico”, linhas 11 e 12).
O que faremos a seguir, é criar o objeto “Cotacao”. Este objeto será utilizado para “materializar” a resposta do serviço (que em nosso exemplo, é um XML). Assim, adicione o trecho de código apresentado pela Listagem 2 ao arquivo “CotacaoAtual.cshtml”.
[cshtml]
//Classe que modela o objeto cotação
public class Cotacao
{
public double _DolarComercialCompra { get; set; }
public double _DolarComercialVenda { get; set; }
public double _DolarParaleloCompra { get; set; }
public double _DolarParaleloVenda { get; set; }
public double _EuroDolarCompra { get; set; }
public double _EuroDolarVenda { get; set; }
public double _EuroRealCompra { get; set; }
public double _EuroRealVenda { get; set; }
public DateTime _DataCotacao { get; set; }
}
[/cshtml]
Listagem 2: Classe de mapeamento da resposta do serviço
O código da Listagem 2 apresenta a classe “Cotacao”. Basicamente, utilizaremos este objeto como um “mapeador” do serviço para gravação no banco de dados (a última das tarefas que realizaremos).
Agora que possuímos este “modelo”, o que deveremos fazer a seguir é, criar um método/função que, receba a string com a resposta do serviço como parâmetro, transforme-a em um XML real e, utilizando LINQ to XML, realize o pseudo mapeamento dos “nodes” para o objeto, para posterior gravação no banco de dados. A Listagem 3 apresenta o método que executa estas ações. Você deve adicionar este código também ao arquivo “CotacaoAtual.cshtml”.
[csahrp]
//Método que recebe a string com XML e devolve o objeto cotação formatado
public static Cotacao RetornaObjetoCotacaoComBaseNoXML(string sXML)
{
//Transformando a string em XML
System.Xml.Linq.XDocument XMLMontado = System.Xml.Linq.XDocument.Parse(sXML);
Cotacao objCotacao = new Cotacao();
//Utilizando LINQ to XML
var DCC = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“dolar_comercial_compra”);
var DCV = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“dolar_comercial_venda”);
var DPC = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“dolar_paralelo_compra”);
var DPV = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“dolar_paralelo_venda”);
var EDC = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“euro_dolar_compra”);
var EDV = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“euro_dolar_venda”);
var ERC = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“euro_real_compra”);
var ERV = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“euro_real_venda”);
//Montando o objeto Cotacao
objCotacao._DolarComercialCompra = Convert.ToDouble(DCC.FirstOrDefault().Value);
objCotacao._DolarComercialVenda = Convert.ToDouble(DCV.FirstOrDefault().Value);
objCotacao._DolarParaleloCompra = Convert.ToDouble(DPC.FirstOrDefault().Value);
objCotacao._DolarParaleloVenda = Convert.ToDouble(DPV.FirstOrDefault().Value);
objCotacao._EuroDolarCompra = Convert.ToDouble(EDC.FirstOrDefault().Value);
objCotacao._EuroDolarVenda = Convert.ToDouble(EDV.FirstOrDefault().Value);
objCotacao._EuroRealCompra = Convert.ToDouble(ERC.FirstOrDefault().Value);
objCotacao._EuroRealVenda = Convert.ToDouble(ERV.FirstOrDefault().Value);
objCotacao._DataCotacao = DateTime.Today;
return objCotacao;
}
[/csharp]
Listagem 3: Criando o objeto cotação
Finalmente, a Listagem 4 apresenta o arquivo “CotacaoAtual.cshtml” completo.
[cshtml]
@functions{
//Informando a URI de conexão com o serviço
private static string uri = “http://cotacao.republicavirtual.com.br/web_cotacao.php?formato={0}”;
//Função que trabalha com a resposta do serviço
public static string RetornaCotacaoServico(string sFormato)
{
string URIFinal = string.Format(uri, sFormato);
string RespostaServico = string.Empty;
//Obtendo a resposta do serviço
System.Net.WebClient DadosCliente = new System.Net.WebClient();
RespostaServico = DadosCliente.DownloadString(URIFinal);
return RespostaServico;
}
//Método que recebe a string com XML e devolve o objeto cotação formatado
public static Cotacao RetornaObjetoCotacaoComBaseNoXML(string sXML)
{
//Transformando a string em XML
System.Xml.Linq.XDocument XMLMontado = System.Xml.Linq.XDocument.Parse(sXML);
Cotacao objCotacao = new Cotacao();
//Utilizando LINQ to XML
var DCC = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“dolar_comercial_compra”);
var DCV = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“dolar_comercial_venda”);
var DPC = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“dolar_paralelo_compra”);
var DPV = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“dolar_paralelo_venda”);
var EDC = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“euro_dolar_compra”);
var EDV = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“euro_dolar_venda”);
var ERC = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“euro_real_compra”);
var ERV = from info in XMLMontado.Descendants(“webservicecotacao”) select info.Element(“euro_real_venda”);
//Montando o objeto Cotacao
objCotacao._DolarComercialCompra = Convert.ToDouble(DCC.FirstOrDefault().Value);
objCotacao._DolarComercialVenda = Convert.ToDouble(DCV.FirstOrDefault().Value);
objCotacao._DolarParaleloCompra = Convert.ToDouble(DPC.FirstOrDefault().Value);
objCotacao._DolarParaleloVenda = Convert.ToDouble(DPV.FirstOrDefault().Value);
objCotacao._EuroDolarCompra = Convert.ToDouble(EDC.FirstOrDefault().Value);
objCotacao._EuroDolarVenda = Convert.ToDouble(EDV.FirstOrDefault().Value);
objCotacao._EuroRealCompra = Convert.ToDouble(ERC.FirstOrDefault().Value);
objCotacao._EuroRealVenda = Convert.ToDouble(ERV.FirstOrDefault().Value);
objCotacao._DataCotacao = DateTime.Today;
return objCotacao;
}
//Classe que modela o objeto cotação
public class Cotacao
{
public double _DolarComercialCompra { get; set; }
public double _DolarComercialVenda { get; set; }
public double _DolarParaleloCompra { get; set; }
public double _DolarParaleloVenda { get; set; }
public double _EuroDolarCompra { get; set; }
public double _EuroDolarVenda { get; set; }
public double _EuroRealCompra { get; set; }
public double _EuroRealVenda { get; set; }
public DateTime _DataCotacao { get; set; }
}
}
[/cshtml]
Listagem 4: Arquivo de conexão com o webservice
Nos resta agora criar a página que exibirá os dados resutantes do serviço e gravará estas informações no banco de dados. A Listagem 3 apresenta esta chamada.
[html]
@{
var banco = Database.Open(“HistoricoCotacoesREST”);
var ValoresHoje = CotacaoAtual.RetornaObjetoCotacaoComBaseNoXML(CotacaoAtual.RetornaCotacaoServico(“xml”));
if(IsPost)
{
if(ModelState.IsValid)
{
var Resultado = banco.Query(“INSERT INTO tbCotacoes(DolarComercialCompra, DolarComercialVenda, DolarParaleloCompra, DolarParaleloVenda, EuroDolarCompra, EuroDolarVenda, EuroRealCompra, EuroRealVenda, DataCotacao) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8)”, ValoresHoje._DolarComercialCompra, ValoresHoje._DolarComercialVenda, ValoresHoje._DolarParaleloCompra, ValoresHoje._DolarParaleloVenda, ValoresHoje._EuroDolarCompra, ValoresHoje._EuroDolarVenda, ValoresHoje._EuroRealCompra, ValoresHoje._EuroRealVenda, ValoresHoje._DataCotacao);
Response.Write(“Sucesso no cadastro”);
}
}
}
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”utf-8″ />
<title>Cotações para @DateTime.Now</title>
</head>
<body>
<h1>
Cotações em @DateTime.Today
</h1>
<p>
<ul>
<li>
Dólar comercial (compra): @ValoresHoje._DolarComercialCompra
</li>
<li>
Dólar comercial (venda): @ValoresHoje._DolarComercialVenda
</li>
<li>
Dólar paralelo (compra): @ValoresHoje._DolarParaleloCompra
</li>
<li>
Dólar paralelo (venda): @ValoresHoje._DolarComercialCompra
</li>
<li>
Euro Dólar (compra): @ValoresHoje._EuroDolarCompra
</li>
<li>
Euro Dólar (venda): @ValoresHoje._EuroDolarVenda
</li>
<li>
Euro Real (compra): @ValoresHoje._EuroRealCompra
</li>
<li>
Euro Real (venda): @ValoresHoje._EuroRealVenda
</li>
</ul>
</p>
<hr size=”1″ />
<div id=”opcoes” style=”margin-top:20px;”>
<h3>O que deseja fazer?</h3>
<p><form method=”post”>
<input type=”submit” id=”btnSalvar” value=”Adicionar ao histórico” />
<input type=”button” id=”btnVerHistorico” value=”Visualizar historico” /></form>
</p>
</div>
<div id=”status” runat=”server”>
</div>
</body>
</html>
[/html]
Listagem 5: Página de exibição dos dados
O que ocorre é que, ao clicar sobre o botão “btnSalvar”, os dados do objeto são salvos em nossa base de dados. O trecho de código que realiza esta tarefa, pode ser visualizado entre as linhas 1 e 13. As Figuras 2 e 3 apresentam o sistema em funcionamento e a gravação dos dados realizada com sucesso.
Figura 2: Aplicação em execução
Figura 3: Dados gravados com sucesso
Bom pessoal, por hoje é isso. Espero que este post possa o ajudar com suas aplicações com WebMatrix utilizando serviços.
Não se esqueça de deixar seus comentários. Abraço a todos!
Facebook
Twitter
Instagram
LinkedIn
RSS