ASP .NET - Consumindo uma Web API em um projeto Windows Forms - II |
Neste artigo vou mostrar consumir o serviço REST criado sobre a plataforma .NET, no artigo anterior, usando o framework ASP .NET Web API em um projeto Windows Forms. |
Na primeira parte deste artigo criamos nossa Web API usando o framework ASP .NET Web API com o nome WebApi2_Produtos e já temos o serviço REST que expõe os serviços para realizar o acesso e as operações CRUD com produtos.
É neste momento que os serviços
REST fazem a diferença em relação ao protocolo
SOAP. Consumir um serviço SOAP é mais
complexo e precisa de todo um suporte de ferramentas visto que temos que
formatar as mensagens de envio e interpretar as mensagens de erro
No caso da plataforma .NET a Microsoft facilitou bastante a nossa vida
fornecendo recursos que facilitam o consumo de serviços REST (leia-se Web API).
Para consumirmos serviços REST em aplicações .NET, primeiro temos que usar os
recursos do assembly System.Net.Http.dll. Neste assembly temos o
namespace System.Net.Http, que possui tipos para consumir serviços
baseados exclusivamente no protocolo HTTP.
Para fazer isso basta referenciar o pacote “Microsoft.AspNet.WebApi.Client“
(via nuget) no projeto cliente que vai consumir a Web API.
Do lado do cliente a classe principal é a HttpClient que é responsável
por gerenciar toda a comunicação com um determinado serviço.
A classe HttpClient expõe os métodos para consumo dos serviços de forma
assíncrona , e métodos nomeados aos principais verbos HTTP que trabalham com as
classes HttpRequestMessage e HttpResponseMessage. (isso dá ao
cliente o controle sobre a mensagem enviada e da resposta que é retornada)
Vamos então mostrar consumir essa Web API em uma aplicação Console.
Recursos usados:
Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.
Criando o projeto Windows Forms no VS 2015 Community
Abra o VS Community 2015 e clique em New Project;
Selecione a linguagem Visual C# ->Windows Forms Application
Informe o nome Consumindo_WebAPI_Produtos e clique no botão OK;
No formulário form1.cs inclua os seguinte controles a partir da ToolBox:
Disponha os controles conforme o leiaute abaixo:
Note que na propriedade Text da caixa de texto txtURI definimos o endereço onde nossa Web API esta atendendo :
http://localhost:53557/api/produtos
Para saber isso dê uma espiada no projeto da Web API.
Referenciando o pacote Microsoft.AspNet.WebApi.Client no projeto via Nuget
Para poder acessar a Web API vamos precisar referenciar o pacote “Microsoft.AspNet.WebApi.Client" em nosso projeto Windows Forms.
No menu Tools clique em Nuget Package Manager -> Manage Nuget Packages for Solution;
Localize o pacote e instale no projeto:
Definindo o código do projeto Windows Forms
Vamos começar definindo os namespaces usados :
using
System;A seguir vamos definir as variáveis globais ao formulário que iremos usar:
string URI = "";Precisamos definir uma classe Produto com as mesmas propriedades da classe Produto definida no projeto Web API:
public class Produto
{
public int Id { get; set; }
public string Nome { get; set; }
public string Categoria { get; set; }
public decimal Preco { get; set; }
}
|
Agora vamos definir os métodos que irão acessar a Web API e realizar as operações desejadas:
1- GetAllProdutos - retorna todos os produtos
private async void GetAllProdutos()
{
URI = txtURI.Text;
using (var client = new HttpClient())
{
using (var response = await client.GetAsync(URI))
{
if (response.IsSuccessStatusCode)
{
var ProdutoJsonString = await response.Content.ReadAsStringAsync();
dgvDados.DataSource = JsonConvert.DeserializeObject<Produto[]>(ProdutoJsonString).ToList();
}
else
{
MessageBox.Show("Não foi possível obter o produto : " + response.StatusCode);
}
}
}
}
|
2- GetProdutoById- retorna um produto pelo seu id
private async void GetProdutoById(int codProduto)
{
using (var client = new HttpClient())
{
BindingSource bsDados = new BindingSource();
URI = txtURI.Text +"/"+ codProduto.ToString();
HttpResponseMessage response = await client.GetAsync(URI);
if (response.IsSuccessStatusCode)
{
var ProdutoJsonString = await response.Content.ReadAsStringAsync();
bsDados.DataSource = JsonConvert.DeserializeObject<Produto>(ProdutoJsonString);
dgvDados.DataSource = bsDados;
}
else
{
MessageBox.Show("Falha ao obter o produto : " + response.StatusCode);
}
}
}
|
3- AddProduto- inclui um novo produto
A seguir
private async void AddProduto()
{
URI = txtURI.Text;
Produto prod = new Produto();
prod.Nome = "NoteBook Lenovo";
prod.Categoria = "Notebooks";
prod.Preco = 1200.00M;
using (var client = new HttpClient())
{
var serializedProduto = JsonConvert.SerializeObject(prod);
var content = new StringContent(serializedProduto, Encoding.UTF8, "application/json");
var result = await client.PostAsync(URI, content);
}
GetAllProdutos();
}
|
4- AddProduto- atualiza um produto
private async void UpdateProduto(int codProduto)
{
URI = txtURI.Text;
Produto prod = new Produto();
prod.Id = codProduto;
prod.Nome = "NoteBook Apple";
prod.Categoria = "Notebooks";
prod.Preco = 9900.00M; // atualizando o preço do produto
using (var client = new HttpClient())
{
HttpResponseMessage responseMessage = await client.PutAsJsonAsync(URI + "/" + prod.Id, prod);
if (responseMessage.IsSuccessStatusCode)
{
MessageBox.Show("Produto atualizado");
}
else
{
MessageBox.Show("Falha ao atualizar o produto : " + responseMessage.StatusCode);
}
}
GetAllProdutos();
}
|
5- DeleteProduto- deleta um produto
private async void DeleteProduto(int codProduto)
{
URI = txtURI.Text;
int ProdutoID = codProduto;
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(URI);
HttpResponseMessage responseMessage = await
client.DeleteAsync(String.Format("{0}/{1}", URI, ProdutoID));
if (responseMessage.IsSuccessStatusCode)
{
MessageBox.Show("Produto excluído com sucesso");
}
else
{
MessageBox.Show("Falha ao excluir o produto : " + responseMessage.StatusCode);
}
}
GetAllProdutos();
}
|
Agora vamos definir em cada evento Click dos botões o código que chama esses métodos para realizar a operação desejada.
Antes vamos definir o método InputBox() que abre uma caixa de diálogo solicitando ao usuário o código do produto.
1- InputBox() - Permite o usuário informar o código do produto para localizar o produto pelo id, atualizar e excluir produto:
private void InputBox()
{
/* usando a função VB.Net para exibir um prompt para o usuário informar a senha */
string Prompt = "Informe o código do Produto.";
string Titulo = "www.macoratti.net";
string Resultado = Microsoft.VisualBasic.Interaction.InputBox(Prompt, Titulo, "9", 600, 350);
/* verifica se o resultado é uma string vazia o que indica que foi cancelado. */
if (Resultado != "")
{
codigoProduto = Convert.ToInt32(Resultado);
}
else
{
codigoProduto = -1;
}
}
|
A seguir o código associado a cada um dos botões de comando:
1- Botão - Retornar Produtos
private void btnObterProdutos_Click(object sender, EventArgs e)
{
GetAllProdutos();
}
|
2- Botão - Obter Produto por id
private void btnProdutosPorId_Click(object sender, EventArgs e)
{
InputBox();
if(codigoProduto !=-1)
{
GetProdutoById(codigoProduto);
}
}
|
3- Botão - Incluir Produto
private void btnIncluirProduto_Click(object sender, EventArgs e)
{
AddProduto();
}
|
4- Botão - Atualizar Produto
private void btnAtualizaProduto_Click(object sender, EventArgs e)
{
InputBox();
if (codigoProduto != -1)
{
UpdateProduto(codigoProduto);
}
}
|
5- Botão - Deletar Produto
private void btnDeletarProduto_Click(object sender, EventArgs e)
{
InputBox();
if (codigoProduto != -1)
{
DeleteProduto(codigoProduto);
}
}
|
Agora é só alegria...
Vamos testar cada uma das funcionalidades e realizar a manutenção de produtos consumindo nossa Web API que esta atendendo na URI: localhost:53557/.
Você deve abrir o projeto Web API e executá-lo de forma que o serviço fique disponível na URI indicada.
Após isso execute o projeto Windows Forms.
1- Retornando Produtos via Web API e exibindo no DataGridView
2- Retornando um produto pelo seu Id
3- Incluindo um novo Produto
4- Atualizando o Produto incluído alterando o seu preço
Consultando a Web API
5- Excluindo o produto
Temos assim a nossa Web API definida no projeto WebApi2_Produtos sendo consumida em um projeto Windows forms.
Pegue o projeto Windows Forms completo aqui : Consumindo_WebApi_Produtos.zip (sem as referências)
Meus filhinhos, não amemos de palavra,
nem de língua, mas por obra e em verdade.
E nisto conhecemos que somos da verdade, e diante dele asseguraremos nossos
corações;
Sabendo que, se o nosso coração nos condena, maior é Deus do que o nosso
coração, e conhece todas as coisas.
1 João 3:18-20
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências: