.NET- A classe HttpClient - II (Consumindo uma Web API)


 Neste artigo vou apresentar os conceitos básicos relacionados com a API HttpClient que foi introduzida na versão 4.5 da plataforma .NET e mostrar como consumir uma Web API.

 

Continuando o artigo anterior vou mostrar como chamar uma Web API a partir de uma aplicação Console usando a classe HttpClient.
 

Uma Web API pode ser vista como um conjunto de serviços expostos via web com o objetivo de integrar sua aplicação a diversos tipos de clientes que queiram usar os serviços. Esses serviços são usados como requisições HTTP e retornam uma resposta em um formato específico como XML, REST, etc. Essa resposta pode ser uma informação de  um repositório de dados, o retorno de uma operação, etc. O cliente pode ser uma página web, uma aplicação desktop, uma aplicação mobile, etc.

Como exemplos de Web API podemos citar as Web APIs do Facebook e Twitter.

A ASP.NET Web API é um framework para a construção de web APIs NET em cima do .NET Framework permitindo que sua aplicação seja acessada por diversos clientes em diversas plataformas e neste artigo você vai usar a ASP.NET Web API para criar uma web API que retorna uma lista de produtos.

Como exemplo vamos criar uma aplicação console que consome uma Web API que expõe os seguintes serviços:

 

Ação método HTTP URI Relativa
Obtém um produto pelo ID GET /api/produtos/id
Cria um novo Produto POST /api/produtos
Atualiza um produto PUT /api/produtos/id
Deleta um produto DELETE /api/produtos/id

 

Nota :  Esta Web API foi criada no artigo : ASP.NET MVC - Criando e Usando uma Web API

 

Recursos usados :

Criando o projeto no VS Community

Abra o VS Community 2015  e clique em New Project;

A seguir selecione Visual C# -> Console Application;

Informe o nome HttpClient_Consome_WebAPI;

A partir do menu Tools clique em Library Package Manager e a seguir  em Manage Nuget Packages for Solution;

Localize o pacote  Microsoft.AspNet.WebApi.Client  e instale-o no projeto:

 

Agora a partir do menu Project clique em Add Class e informe o nome Produto e define o código abaixo nesta classe:

    public class Produto
    {
        public string Nome { get; set; }
        public double Preco { get; set; }
        public string Categoria { get; set; }
    }

Defina os seguintes namespaces para iniciar na classe Program.cs :

using System;
using
System.Net.Http;
using
System.Net.Http.Headers;
using
System.Threading.Tasks;

No método Main() define o código abaixo:

   static void Main()
   {
            RunAsync().Wait();
   }

A seguir crie o método ExecutarAsync() onde iremos realizar as operações usando a classe HttpCllient com o código a seguir:

    static async Task ExecutarAsync()
        {
            using (var cliente = new HttpClient())
            {
                cliente.BaseAddress = new Uri("http://localhost:9000/");
                cliente.DefaultRequestHeaders.Accept.Clear();
                cliente.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                // HTTP GET
                HttpResponseMessage response = await cliente.GetAsync("api/produtos/1");
                if (response.IsSuccessStatusCode)
                {
                    Produto produto = await response.Content.ReadAsAsync<Produto>();

                    Console.WriteLine("{0}\t${1}\t{2}", produto.Nome, produto.Preco, produto.Categoria);
                }
                // HTTP POST - define o produto
                var produto_ipad = new Produto() {  Nome = "IPad", Preco = 1999, Categoria = "Tablet" };
                response = await cliente.PostAsJsonAsync("api/produtos", produto_ipad);
                if (response.IsSuccessStatusCode)
                {
                    Uri produtoUrl = response.Headers.Location;
                    // HTTP PUT
                    produto_ipad.Preco = 1800;   // atualiza o preco do produto
                    response = await cliente.PutAsJsonAsync(produtoUrl, produto_ipad);
                    // HTTP DELETE - deleta o produto
                    response = await cliente.DeleteAsync(produtoUrl);
                }
            }
        }

Vamos entender o código :

             using (var cliente = new HttpClient())
             {
            
   cliente.BaseAddress = new Uri("http://localhost:53214/");
                cliente.DefaultRequestHeaders.Accept.Clear();
                cliente.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

Nota:  o endereço do servidor da WebAPI ( http://localhost:53214/" ) pode variar. Verifique a porta quando levantar o servidor e altere no código se necessário.

A instrução using cria uma instância HttpClient e a libera após ela sair do escopo.

No interior do código using definimos a base URi para o request HTTP e atribuímos cabeçalho Accept para 'application/json' o que indica que o servidor irá enviar os dados no formato JSON.

Obtendo um recurso com HTTP GET

               // HTTP GET
                HttpResponseMessage response = await cliente.GetAsync("api/produtos/1");
                if (response.IsSuccessStatusCode)
                {
                    Produto produto = await response.Content.ReadAsAsync<Produto>();

                    Console.WriteLine("{0}\t${1}\t{2}", produto.Nome, produto.Preco, produto.Categoria);
                }

O código acima envia um GET para o produto.

O método GetAsync() envia uma requisição HTTP GET. O método é assíncrono pois ele realizar uma operação de I/O.

A palavra chave await suspende a execução até que o método assíncrono esteja terminado. Quando o método terminar, ele retorna um HttpReponseMessage que contém a resposta HTTP.

Se código de status na resposta for de sucesso o então teremos a representação JSON do produto.

Chamamos então ReadAsAsycn para desserializar o retorno JSON para uma instância do produto.  Este método é assíncrono pois pode haver muitos dados.

Observe que o tratamento de erro no HttpClient não lança uma exceção quando a reposta HTTP contém um erro; ao invés disso a propriedade IsSuccessStatutsCode é definida como false se houver erro.

1- Incluindo um Produto - HTTP POST

Para incluir um produto usamos o código abaixo que envia uma requisição POST que contém uma instância no formato JSON:

                 // HTTP POST - define o produto
                var produto_ipad = new Produto() {  Nome = "IPad", Preco = 1999, Categoria = "Tablet" };
                response = await cliente.PostAsJsonAsync("api/produtos", produto_ipad);

O método PostAsJsonAsycn serializa um objeto para JSON e então envia o JSON na requisição POST. (Para enviar XML use PostAsXmlAsync, e para outro formato use PostAsycn)

2- Atualizando um Produto - HTTP PUT / DELETE

O código a seguir envia uma requisição PUT para atualizar um produto:
                if (response.IsSuccessStatusCode)
                {
                    Uri produtoUrl = response.Headers.Location;
                    // HTTP PUT
                    produto_ipad.Preco = 1800;   // atualiza o preco do produto
                    response = await cliente.PutAsJsonAsync(produtoUrl, produto_ipad);
                    // HTTP DELETE - deleta o produto
                    response = await cliente.DeleteAsync(produtoUrl);
                }
O método PutAsJsonAsync funciona igual ao método PostAsJsonAsycn exceto que ele envia
 uma requisição PUT e não POST.

2- Atualizando um Produto - HTTP PUT / DELETE

O código abaixo envia uma requisição DELETE para excluir um produto:          
               if (response.IsSuccessStatusCode)
                {
                    Uri produtoUrl = response.Headers.Location;
                    // HTTP PUT
                    produto_ipad.Preco = 1800;   // atualiza o preco do produto
                    response = await cliente.PutAsJsonAsync(produtoUrl, produto_ipad);
                    // HTTP DELETE - deleta o produto
                    response = await cliente.DeleteAsync(produtoUrl);
                }

Da mesma forma que GET, a requisição DELETE não possui um corpo, logo você não precisa especificar um formato JSON ou XML.

E assim, vimos como é simples usar a API HttpClient para consumir uma Web API.

Aquele que diz: Eu conheço-o (Jesus), e não guarda os seus mandamentos, é mentiroso, e nele não está a verdade.
1 João 2:4

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 ?

Referências:


José Carlos Macoratti