ASP .NET Web API - Consumindo uma Web API em um projeto Console - III |
Neste artigo vou mostrar consumir o serviço REST criado sobre a plataforma .NET usando o framework ASP .NET Web API em um projeto Console. |
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# ->Console Application
Informe o nome Consumindo_WebAPI2_Produtos e clique no botão OK;
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 Console.
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 Console Application
Vamos começar definindo os namespaces usados :
using
System;Vamos 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 na classe Program defina o código abaixo no método Main():
static void Main(string[] args)
{
RunAsync().Wait();
Console.ReadKey();
}
|
Note que estamos chamando um método async chamado RunAsync que será bloqueado até que termine sua execução.
Muitos dos métodos da classe HttpClient são async pois eles realizam operações I/O de rede. No método RunAsync vamos invocar os métodos de forma assíncrona.
Para concluir vamos definir o método RunAsync() conforme o código a seguir:
static async Task RunAsync()
{
using (var client = new HttpClient())
{
client.BaseAddress = new System.Uri("http://localhost:53557/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync("api/produtos/3");
if (response.IsSuccessStatusCode)
{ //GET
Produto produto = await response.Content.ReadAsAsync<Produto>();
Console.WriteLine("{0}\tR${1}\t{2}", produto.Nome, produto.Preco, produto.Categoria);
Console.WriteLine("Produto acessado e exibido. Tecle algo para incluir um novo produto.");
Console.ReadKey();
}
//POST
var cha = new Produto() { Nome = "Chá Verde", Preco = 1.50M, Categoria = "Bebidas" };
response = await client.PostAsJsonAsync("api/produtos", cha);
Console.WriteLine("Produto cha verde incluído. Tecle algo para atualizar o preço do produto.");
Console.ReadKey();
if (response.IsSuccessStatusCode)
{ //PUT
Uri chaUrl = response.Headers.Location;
cha.Preco = 2.55M; // atualiza o preco do produto
response = await client.PutAsJsonAsync(chaUrl, cha);
Console.WriteLine("Produto preço do atualizado. Tecle algo para excluir o produto");
Console.ReadKey();
//DELETE
response = await client.DeleteAsync(chaUrl);
Console.WriteLine("Produto deletado");
Console.ReadKey();
}
}
}
|
Vamos entende o código.
Primeiro criamos uma instância de HttpClient usando uma declaração using de forma que a instância será liberada ao sair do escopo.
1- Definimos o a URI onde nossa Web API esta expondo o serviço REST : http://localhost:53557/ e definimos o header Accept como 'application/json' que diz ao servidor para enviar dados no formato JSON.
client.BaseAddress = new System.Uri("http://localhost:53557/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
2- Estamos enviado uma requisição GET para obter um produto pelo seu código
HttpResponseMessage response = await client.GetAsync("api/produtos/3"); if (response.IsSuccessStatusCode) { //GET Produto produto = await response.Content.ReadAsAsync<Produto>(); Console.WriteLine("{0}\tR${1}\t{2}", produto.Nome, produto.Preco, produto.Categoria); Console.WriteLine("Produto acessado e exibido. Tecle algo para incluir um novo produto."); Console.ReadKey(); } |
O método GetAsync envia uma requisição HTTP GET de forma assíncrona. A palavra chave await suspende a execução até que o método assíncrono termine e quando isso ocorrer ele retorna um HttpResponseMessage que contém um response HTTP.
Se o código do status no response for um código de sucesso, o corpo do response conterá a representação JSON do produto. Chamamos então o método ReadAsAsync pois o corpo do response pode ser grande.
A propriedade IsSucessStatusCode será igual a false se o status for um código de erro.
3- Enviamos uma requisição HTTP POST que contém uma instância de um produto no formato JSON:
//POST var cha = new Produto() { Nome = "Chá Verde", Preco = 1.50M, Categoria = "Bebidas" }; response = await client.PostAsJsonAsync("api/produtos", cha); Console.WriteLine("Produto cha verde incluído. Tecle algo para atualizar o preço do produto."); Console.ReadKey(); |
O método PostAsJsonAsync serializa um objeto para JSON e então envia-o na requisição POST.
4- Enviamos uma requisição HTTP PUT para atualizar um produto
//PUT
Uri chaUrl = response.Headers.Location;
cha.Preco = 2.55M; // atualiza o preco do produto
response = await client.PutAsJsonAsync(chaUrl, cha);
Console.WriteLine("Produto preço do atualizado. Tecle algo para excluir o produto");
Console.ReadKey();
|
O método PutAsJsonAsync funciona de forma igual ao método PostAsJsonAsync, só que enviando um PUT ao invés de um POST.
5- Enviamos uma requisição HTTP DELETE para excluir um produto
//DELETE
response = await client.DeleteAsync(chaUrl);
Console.WriteLine("Produto deletado");
Console.ReadKey();
|
Vamos testar cada uma das funcionalidades 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 Console Application.
1- Exibimos o produto de código igual a 3 e incluímos um novo produto:
Verificando na Web API temos:
2- Agora vamos atualizar o preço do produto chá verde:
Verificando na Web API temos:
3- Excluindo o produto temos:
Verificando na Web API temos:
Temos assim a nossa Web API definida no projeto WebApi2_Produtos sendo consumida em um projeto Console Application.
Na próxima parte veremos como consumir o serviço em uma aplicação WPF.
Pegue o projeto Console completo aqui : Consumir_WebApi2_Produtos.zip (sem as referências)
E os que são de Cristo crucificaram a
carne com as suas paixões e concupiscências.
Gálatas 5:24
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: