5 Web Api
5 Web Api
[email protected]
WEB API (Restful) Página 2
LISTA DE FIGURAS
LISTA DE CÓDIGOS-FONTE
Você está preparado para integrar as suas soluções com outros sistemas?
serviço. Para que a interação ocorra, basta que eles se comuniquem utilizando
mensagens enviadas sobre o protocolo HTTP, comumente com os dados serializados
nos formatos XML ou JSON.
Claro que o processo foi descrito de forma muito sucinta, não imagine que a
codificação da consulta ao saldo da conta corrente estará dentro do código do Web
Service. Com certeza, o WS utilizará outros componentes de software que são
responsáveis pela consulta de forma corporativa em uma base no mainframe do
banco. Estes componentes retornarão o saldo para que o Web Service apenas crie a
mensagem e atenda o cliente que consumiu o serviço.
A utilização dos serviços no padrão REST passou de uma tendência para uma
realidade. Nos últimos anos o crescimento aconteceu de forma exponencial, e um dos
grandes colaboradores desse crescimento é a quantidade de serviços usados em
aplicativos móveis. Eles precisam ter a complexidade cada vez mais simplificada e
também a quantidade dos dados trafegados cada vez mais reduzida.
Assim, o framework ASP.NET Web API é uma plataforma ideal e indicada para
a construção das aplicações no padrão REST.
Em outras palavras, uma API REST não depende de XML para trafegar
informações e ignora detalhes de implementação e sintaxe do protocolo. Os formatos
mais comuns de um API são JSON, texto e XML, dando ao desenvolvedor o poder de
escolha do melhor formato de acordo com sua necessidade. Grandes empresas,
como Facebook, Google, Netflix e LinkedIn, passaram a usá-la e disponibilizam APIs
a serem usadas por parceiros e usuários dos serviços.
5.3 Fundamentos
5.5 URL
Exemplo de URL:
• fiap.com.br
• google.com.br
• facebook.com
5.6 URN
Exemplo de URN:
• index.html
• contato.aspx
• home.php
5.7 URI
Exemplo de URI:
• https://www.facebook.com/zuck
• https://www.fiap.com.br/online/graduacao/bacharelado/sistemas-de-
informacao/
• https://www.google.com.br/search?rlz=1C1HIJA_enBR723BR723&ei=fUyP
WqryIce5wgTT7pHQAg&q=fiap&oq=fiap&gs_l=psy-
ab.3..35i39k1j0i131k1j0l3j0i67k1j0l4.1769.2212.0.2379.4.4.0.0.0.0.810.332
.4.4.0....0...1.1.64.psy-ab..0.4.329...0i131i67k1.0.G8Vp2Tigdhk
Todas essas definições podem ter deixado você confuso, então, vamos explicar
de uma maneira mais simples:
Os verbos HTTP são os métodos de requisição usados para indicar a ação que
será executada quando chamamos um recurso de uma API Rest. Segue a lista dos
mais conhecidos e utilizados:
• GET
• POST
• DELETE
• PUT
O Status Code de uma requisição é parte importante de uma WebAPI, pois com
ele é possível reconhecer facilmente o que aconteceu com a requisição. O código é
um padrão numérico que apresenta o resultado da ação. Seguem alguns exemplos:
• 200 - OK
• 201 - Created
• O pedido foi cumprido e resultou em um novo recurso que está sendo criado.
• 401 - Unauthorized
• 403 - Forbidden
Para iniciar a criação de um novo serviço ASP.NET WEB API, iremos seguir o
mesmo modelo de negócio dos capítulos anteriores, a Fiap Smart City, nossa cidade
“virtual”, cada vez mais tecnológica, proporcionando à população melhores condições
e sustentabilidade.
No Visual Studio 2017, selecione o menu File > New > Project (a tecla de
atalho Crtl + Shift + N). Selecione também a linguagem Visual C# > Web na parte
esquerda da janela. No centro, vamos selecionar ainda o tipo de projeto ASP.NET
Web Application (.NET Framework). Na parte inferior, temos caixas de texto para
definir o nome do projeto, o local no sistema dos arquivos e o nome da solução. Para
nosso exemplo, vamos usar como nome do projeto e da solução
FiapSmartCityWebAPI.
A figura “Template Web API” apresenta todas as opções que devem ser
selecionadas e as que não será preciso selecioná-las para a criação correta do
projeto. Veja:
Observe na figura:
5.12 Modelos
Com o nosso projeto criado, iremos seguir a mesma estrutura que foi explicada
no Capítulo ASP.NET MVC.
using System;
using System.Collections.Generic;
using System.Linq;
namespace FiapSmartCityWebAPI.Models
{
public class TipoProduto
{
public int IdTipo { get; set; }
public String DescricaoTipo { get; set; }
public bool Comercializado { get; set; }
public TipoProduto()
{
this.Produtos = new List<Produto>();
}
Produtos.Remove(produto);
}
using System;
namespace FiapSmartCityWebAPI.Models
{
public class Produto
{
public int IdProduto { get; set; }
public String NomeProduto { get; set; }
public String Caracteristicas { get; set; }
public double PrecoMedio { get; set; }
public String Logotipo { get; set; }
public bool Ativo { get; set; }
public Produto() { }
this.NomeProduto = NomeProduto;
this.Caracteristicas = Caracteristicas;
this.PrecoMedio = PrecoMedio;
this.Logotipo = Logotipo;
this.Ativo = Ativo;
this.IdTipoProduto = IdTipoProduto;
}
}
Código-fonte 5.2 – Modelo Produto
Fonte: Elaborado pelo autor (2018)
5.13 Funcionalidades
5.14 DAL
using FiapSmartCityWebAPI.Models;
using System.Collections.Generic;
namespace FiapSmartCityWebAPI.DAL
{
public class TipoProdutoDAL
{
// Lista criada para armezenar uma lista de Tipo de
produto simulando o banco de dados
private static Dictionary<long, TipoProduto>
bancoTipoProduto = new Dictionary<long, TipoProduto>();
private static int contadorBanco = 2;
5.15 Controllers
using FiapSmartCityWebAPI.DAL;
using FiapSmartCityWebAPI.Models;
using System.Web.Http;
namespace FiapSmartCityWebAPI.Controllers
{
}
}
Código-fonte 5.4 – Controller Requisição Get
Fonte: Elaborado pelo autor (2018)
O navegador irá exibir uma tela de erro informando que “O servidor Web está
configurado para não listar o conteúdo deste diretório” e apesar de apresentar uma
mensagem de erro, isso não significa que nosso teste não foi bem-sucedido.
namespace FiapSmartCityWebAPI.Controllers
{
public class TipoProdutoController : ApiController
{
public TipoProduto Get(int id)
{
try
{
TipoProdutoDAL dal = new TipoProdutoDAL();
TipoProduto TipoProduto = dal.Busca(id);
return TipoProduto;
}
// Capturando um exceção de Chave não encontrada
catch (KeyNotFoundException)
{
throw;
}
}
}
}
Código-fonte 5.5 – Classe Controller Requisição GET com Try Catch
Fonte: Elaborado pelo autor (2018)
o Catch, já que nenhum dos dois trata respostas de sucesso ou falha. Porém, nada
está perdido, pois veremos sobre interface uniforme no próximo tópico.
using FiapSmartCityWebAPI.DAL;
using FiapSmartCityWebAPI.Models;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace FiapSmartCityWebAPI.Controllers
{
public class TipoProdutoController : ApiController
{
public IHttpActionResult Get(int id)
{
try
{
TipoProdutoDAL dal = new TipoProdutoDAL();
TipoProduto TipoProduto = dal.Busca(id);
return Ok(TipoProduto);
}
catch (KeyNotFoundException)
{
return NotFound();
}
}
}
}
Código-fonte 5.6 – Controller implementar o retorno uniforme
Fonte: Elaborado pelo autor (2018)
implementar um método Get () sem nenhum parâmetro e seu objeto será o retorno de
uma lista de tipo, veja o código-fonte abaixo:
using FiapSmartCityWebAPI.DAL;
using FiapSmartCityWebAPI.Models;
using System;
using System.Collections.Generic;
using System.Web.Http;
namespace FiapSmartCityWebAPI.Controllers
{
public class TipoProdutoController : ApiController
{
// Método responsável por listar os Tipos de Produtos
public IHttpActionResult Get()
{
return Ok( new TipoProdutoDAL().Listar());
}
Agora conseguimos ver todas as informações que nossa ASP.NET Web API
está nos fornecendo, mensagem de erro personalizada, HTTP Status Code: 404 Not
Found, conforme configuramos, e formato da resposta em XML, devido à
configuração do Accept: application/xml.
No Postman, temos que passar no corpo (Body) o XML com os novos dados.
Neste caso, iremos cadastrar um novo TipoProduto e dois Produtos que estarão
relacionados ao mesmo.
<TipoProduto xmlns:i="http://www.w3.org/2001/XMLSchema-
instance"
xmlns="http://schemas.datacontract.org/2004/07/FiapSmartCityW
ebAPI.Models">
<Comercializado>true</Comercializado>
<DescricaoTipo>Fitro de Agua</DescricaoTipo>
<IdTipo>2</IdTipo>
<Produtos>
<Produto>
<Ativo>true</Ativo>
<Caracteristicas>
Possui o sistema de filtragem mais básico, com minerais
</Caracteristicas>
<IdProduto>801</IdProduto>
<IdTipoProduto>1</IdTipoProduto>
<Logotipo>
data:image/jpeg;base64
</Logotipo>
<NomeProduto>Filtro de barro</NomeProduto>
<PrecoMedio>200</PrecoMedio>
</Produto>
<Produto>
<Ativo>true</Ativo>
<Caracteristicas>
O sistema de entrega de galões já esteve muito em alta
</Caracteristicas>
<IdProduto>802</IdProduto>
<IdTipoProduto>1</IdTipoProduto>
<Logotipo>
data:image/jpeg;base64
</Logotipo>
<NomeProduto>Galão</NomeProduto>
<PrecoMedio>20</PrecoMedio>
</Produto>
</Produtos>
</TipoProduto>
Código-fonte 5.9 – XML de dados TipoProduto e Produto
Fonte: Elaborado pelo autor (2018)
A requisição DELETE, como o próprio nome diz, irá deletar algum recurso por
meio de sua chave ou id.
Veja:
<TipoProduto xmlns:i="http://www.w3.org/2001/XMLSchema-
instance"
xmlns="http://schemas.datacontract.org/2004/07/FiapSmartCityW
ebAPI.Models">
<Comercializado>false</Comercializado>
<DescricaoTipo>Fitro d'agua alterado</DescricaoTipo>
<IdTipo>2</IdTipo>
</TipoProduto>
Código-fonte 5.12 – XML de alteração do TipoProduto
Fonte: Elaborado pelo autor (2018)
Como sabemos, segundo o HTTP Status Code 200 OK, nossa requisição foi
executada com sucesso, mas vamos validar executando o método GET. Veja na
imagem abaixo:
Por padrão, uma ASP.NET WebAPI retorna suas respostas com a formatação
dos dados JSON, assim como muitas das API disponíveis para uso no mercado. O
padrão JSON se comporta melhor em alguns cenários, por exemplo, nas requisições
POST e PUT, onde temos que inserir os dados que são cadastrados ou alterados no
corpo da requisição, em muitos casos, esses dados apresentam entidades com muitos
atributos.
Para esse exemplo, vamos precisar de uma aplicação do tipo Console C#. O
nome da nossa aplicação será FiapSmartCityClient e terá como objetivo a inserção
dos novos tipos de produtos e a consulta dos tipos cadastrados. Assim, vamos fazer
a execução das APIS no método POST e GET, e para as duas execuções vamos
trabalhar apenas com dados no formato JSON.
using System;
namespace FiapSmartCityClient
{
class Program
{
static void Main(string[] args)
{
get();
Console.Read();
}
System.Net.Http.HttpResponseMessage resposta =
client.GetAsync("http://localhost:58576/api/T
ipoProduto").Result;
}
}
}
Código-fonte 5.13 – Cliente para requisição GET
Fonte: Elaborado pelo autor (2018)
using System;
using System.Net.Http;
using System.Text;
namespace FiapSmartCityClient
{
class Program
{
static void Main(string[] args)
{
post();
Console.Read();
}
}
}
}
}
Código-fonte 5.14 – Cliente para requisição POST
Fonte: Elaborado pelo autor (2018)
Mas qual é a relação entre Parse e WebAPI? Seguindo o texto, será fácil de
entender a relação e também a simplicidade que irá proporcionar algumas
transformações em nosso client de API.
5.26 Desserialização
os dados da WebAPI, desserializar para uma lista de TipoProduto e, por fim, interagir
sobre a lista e imprimir os resultados. Segue:
using FiapSmartCityClient.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace FiapSmartCityClient
{
class Program
{
static void Main(string[] args)
{
get();
Console.Read();
}
Console.WriteLine("Comercializado:" +
item.Comercializado);
Console.WriteLine(" ========== ");
Console.WriteLine("");
}
}
}
}
Código-fonte 5.15 – Desserialização JSON em C#
Fonte: Elaborado pelo autor (2018)
5.27 Serialização
using FiapSmartCityClient.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
namespace FiapSmartCityClient
{
class Program
{
static void Main(string[] args)
{
//get();
post();
Console.Read();
}
}
}
}
Código-fonte 5.16 – Serialização JSON em C#
Fonte: Elaborado pelo autor (2018)
Note no código-fonte que não temos mais uma variável do tipo string com o
conteúdo JSON a ser enviado, agora temos uma instância da classe TipoProduto que
será convertida e postada no corpo da requisição POST.
REFERÊNCIAS
______. ASP.NET MVC5 Crie aplicações web na plataforma Microsoft. São Paulo:
Casa do Código, 2010.
SIÉCOLA, P. Web Services REST com ASP.NET Web API e Windows Azure. São
Paulo: Casa do Código, 2010.
WASSON, M. Getting started with ASP.NET Web API 2 (C#). Disponível em:
<https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-
aspnet-web-api/tutorial-your-first-web-api>. Acesso em: 10 fev. 2018.