You are on page 1of 46

13/11/2015 ASP.

NET Web API – Parte 2

Buscar  

fontes  comentários  favorito (6)  marcar como lido  para impressão


anotar

.net Magazine 122 ­ Índice

ASP.NET Web API – Parte 2


Nesta segunda parte do curso veremos na prática
como implementar uma API web completa, com todas
as operações de CRUD, além de explorar os tipos de
retorno possíveis e os verbos do HTTP utilizados.

 
  0   0   Curtir 0

  Gostei (1)    (0)

Demais posts desta série:

ASP.NET Web API – Parte 1

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 1/46
13/11/2015 ASP.NET Web API – Parte 2

Artigo no estilo Curso

Fique por dentro

Este artigo é útil por ensinar ao leitor como implementar serviços baseados na

arquitetura REST para que o mesmo possa ser consumido por inúmeros tipos de

clientes, independentemente de plataforma.

Um serviço baseado em REST poderá ser consumido facilmente utilizando protocolo

HTTP e seus verbos como forma de comunicação entre o cliente e o servidor.

Neste artigo será apresentada a tecnologia da plataforma .NET da Microsoft para

criar e expor serviços facilmente através da arquitetura REST e do protocolo HTTP,

a ASP.NET Web API, que também é baseada na arquitetura ASP.NET MVC, desta

forma seu projeto ficará bem estruturado e manutenível por fazer uso do padrão

MVC.

Durante muito tempo os webservices baseados em SOAP eram praticamente a única

solução para comunicação e implementação entre sistemas distribuídos.

Com passar do tempo, este tipo de serviços veio ganhando várias melhorias, porém o

mesmo ficou inchado e sua implementação baseada em SOAP se tornou complicada e

com custo de implementação bastante elevado, desta forma, o uso deste tipo de

webservice em alguns cenários se tornou completamente inviável, seja pelo custo de

implementação, recursos reduzidos ou mesmo alto consumo de banda por parte de

dispositivos móveis.

O REST veio para ficar, simplificando toda a forma de implementação dos webservices,

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 2/46
13/11/2015 ASP.NET Web API – Parte 2

utilizando para isso a própria estrutura da internet e tendo como pilar fundamental o

protocolo HTTP.

Pensando nisso a Microsoft que disponibilizava tecnologias para webservices como

ASMX e WCF, que são baseados em SOAP, resolveu então criar uma espécie de

extensão do WCF para implementação de serviços baseados em REST, porém o WCF

que foi criado como uma solução que unificava várias formas de comunicação entre

sistemas distribuídos já estava com várias dependências de outras tecnologias na

plataforma .NET, e como a estrutura do ASP.NET MVC tinha ganho mercado e a

simpatia de empresas e desenvolvedores por ser de fácil implementação e por ser

baseado no padrão MVC, então a Microsoft projetou uma nova tecnologia

exclusivamente baseada no ASP.NET MVC e na arquitetura REST, dando início ao

ASP.NET Web API.

Desta forma, é como ter duas tecnologias em uma só, ou seja, podemos fazer uso

normalmente de páginas baseadas no ASP.NET MVC e também no mesmo projeto

expor serviços REST com o ASP.NET Web API.

Sem sombra de dúvida esta foi uma excelente jogada da Microsoft em unir o útil ao

agradável, de forma que tanto empresas quanto desenvolvedores ganham tempo em

construir um serviço baseado em REST e no padrão MVC da plataforma .NET, isso

tudo sendo totalmente Web com uso ASP.NET MVC. Assim você pode hospedar um

serviço REST na nuvem como se tivesse hospedando um website normal ASP.NET em

um servidor IIS.

Outro ponto importante é que as tecnologias que implementam serviços baseados em

REST, como o ASP.NET Web API dispõem dados no formato XML e JSON para troca

de mensagens entre o cliente o servidor, desta forma você pode ter cliente Web que

consome um serviço através da jQuery e Ajax que tem como base o JavaScript.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 3/46
13/11/2015 ASP.NET Web API – Parte 2

Como o JSON já é nativo do próprio JavaScript, isso facilita a implementação de

serviços com a biblioteca jQuery e ASP.NET Web API.

Projeto com ASP.NET Web API

Para demostrar o uso de serviços REST com o ASP.NET Web API neste artigo, iremos

utilizar o Visual Studio 2013 para explicar a estrutura da tecnologia, aspectos

importantes sobre a API e por fim veremos como consumir o serviço através de uma

aplicação WPF.

Crie um novo projeto no Visual Studio, selecione a categoria Web e o template

ASP.NET Web Application com .NET Framework 4.5.1. Logo em seguida informe o

nome para o projeto (neste exemplo foi informado ASPNET_Web_API), escolha um

diretório para salvar o projeto e em seguida click em OK.

Logo será exibida outra tela para seleção do template da nova aplicação ASP.NET,

nesta tela você deve selecionar a opção Web API. Perceba logo abaixo na mesma tela

que é selecionada a referência MVC, por fim você deve clicar em OK para criar o

projeto.

Após o projeto criado podemos notar como ficou a estrutura dos arquivos criados pelo

Visual Studio no Solution Explorer. Aparentemente parece ser uma estrutura comum

para projetos ASP.NET MVC, porém existem algumas diferenças que merecem

destaque. Neste ponto o Visual Studio já criou uma implementação de serviço REST

como exemplo que já pode ser executado normalmente, mas antes disso vejamos

alguns detalhes sobre o projeto.

1. O primeiro ponto importante a destacar é que foram adicionadas algumas

referências às seguintes DLLs descritas a seguir que serão utilizadas pela Web API,

porém, boa parte da biblioteca utilizada na API está presente em System.Web.Http:

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 4/46
13/11/2015 ASP.NET Web API – Parte 2

·System.Net.Http.WebRequest;

· System.Web.Http;

· System.Web.Http.WebHost.

2. Perceba que dentro da pasta “App_Start” foi criado um arquivo chamado

WebApiConfig.cs, é neste arquivo que você irá definir e configurar as rotas do serviço e

métodos expostos pela API. Veja na Listagem 1 a implementação do mesmo com a

definição de uma rota exemplo chamada “DefaultApi”.

Listagem 1. Mapeamento de rotas de serviço no WebApiConfig.cs.

  01 using System;
  02 using System.Collections.Generic;
  03 using System.Linq;
  04 using System.Web.Http;
  05
  06 namespace ASPNET_Web_API
  07 {
  08    public static class WebApiConfig
  09    {
  10        public static void Register(HttpConfiguration config)
  11        {
  12            // Web API configuration and services
  13
  14            // Web API routes
  15            config.MapHttpAttributeRoutes();
  16
  17            config.Routes.MapHttpRoute(
  18                name: "DefaultApi",
  19                routeTemplate: "api/{controller}/{id}",
  20                defaults: new { id = RouteParameter.Optional }
  21            );
  22        }
  23    }
  24 }

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 5/46
13/11/2015 ASP.NET Web API – Parte 2

3. O terceiro detalhe importante é a presença do arquivo ValuesController.cs contido na

pasta Controllers, ou seja, este arquivo representa um controlador de serviço para a

Web API, praticamente da mesma forma como acontece com um Controller do

ASP.NET MVC padrão.

A diferença é que no ASP.NET MVC o controller herda da classe Controller que faz

parte da biblioteca Web.MVC e na Web API herda da classe ApiController que faz

parte da biblioteca Web.HTTP. Veja a implementação do Controller da Web API na

Listagem 2.

Listagem 2. Implementação Controller Web API.

  01 using System;
  02 using System.Collections.Generic;
  03 using System.Linq;04 
  04 using System.Net;
  05 using System.Net.Http;
  06 using System.Web.Http;
  07
  08 namespace ASPNET_Web_API.Controllers
  09 {
  10    public class ValuesController : ApiController
  11    {
  12        // GET api/values
  13        public IEnumerable<string> Get()
  14        {
  15            return new string[] { "value1", "value2" };
  16        }
  17
  18        // GET api/values/5
  19        public string Get(int id)
  20        {
  21            return "value";
  22        }
  23
  24        // POST api/values
  25        public void Post([FromBody]string value)
  26        {
  27        }
  28

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 6/46
13/11/2015 ASP.NET Web API – Parte 2

  29        // PUT api/values/5
  30        public void Put(int id, [FromBody]string value)
  31        {
  32        }
  33
  34        // DELETE api/values/5
  35        public void Delete(int id)
  36        {
  37        }
  38    }
  39 }

Analisando essa listagem existem algumas convenções da implementação da Web API

que merecem destaque, vejamos:

· Linha 10: Conforme já comentado, o controller da API herda de ApiController.

· Linha 13: Aqui temos a implementação de uma rota do serviço que retorna um

IEnumerable de string com alguns valores, porém o que merece destaque é o nome

deste método, ou seja, é “Get()” o nome de um dos verbos do protocolo HTTP.

Como o nome do método é GET, a Web API já sabe que esta rota do serviço só

poderá ser solicitada por uma requisição via GET, caso contrário a mesma não estará

acessível.

Então perceba que nas linhas 19, 25, 30 e 35 existem outros métodos também com

nomes de alguns dos verbos do protocolo HTTP, desta forma os mesmos só

respondem a este tipo de requisição usando a convenção de nomes de verbos do

HTTP.

Para refrescar um pouco a memória a respeito de quando fazer requisições HTTP e

quais os verbos do pr

· GET – Você irá usar este verbo quando precisar de uma representação de um

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 7/46
13/11/2015 ASP.NET Web API – Parte 2

recurso que será disponibilizado por um serviço REST, esta representação pode ser

uma listagem de cliente, um arquivo HTML e ser retornado em formatos como JSON

ou XML. Ou seja, você não deve incluir e nem alterar nada no servidor, apenas solicitar

uma representação do recurso.

· POST – Este você deve usar quando for criar um novo recurso no servidor. Um

exemplo seria um serviço que irá realizar um cadastro de fornecedor em uma base de

dados como MySQL ou SQL Server.

· PUT – Deve ser usado quando desejar realizar a atualização de recurso no servidor.

· DELETE – Usar quando desejar excluir algum recurso no servidor.

Os verbos do protocolo HTTP mais utilizados são GET, POST, PUT e DELETE.

Perceba ainda que fazendo uma analogia com as transações de um SGDB teríamos

algo similar como as operações CRUD: Create (POST), Read (GET), Update (PUT) e

Delete (DELETE).

Agora que você já teve uma breve introdução à Web API, é hora de rodar o serviço de

exemplo criado automaticamente pelo Visual Studio, para isso basta pressionar F5 e

verificar o resultado no navegador conforme apresentado na Figura 1.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 8/46
13/11/2015 ASP.NET Web API – Parte 2

abrir imagem em nova janela

Figura 1. Projeto Web API em execução com ASP.NET MVC.

Quando o projeto estiver em execução no seu browser, ele na realidade irá mostrar

uma página ASP.NET MVC utilizando Bootstrap para exibir uma pequena introdução

sobre a Web API. Então clique no link API logo no menu superior que você será

redirecionado para outra página.

Nesta página você pode conferir a lista de rotas juntamente com tipo de verbo do HTTP

que deve ser usado para requisitar de fato o serviço REST baseado na Web API. Veja

na Figura 2 como acessar a URL com a rota api/Values via GET e obter como

resultado dois valores no formato XML.

abrir imagem em nova janela

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 9/46
13/11/2015 ASP.NET Web API – Parte 2

Figura 2. Requisitando serviço REST através da rota api/Values via GET.

Conforme visto na URL definida nessa figura, existe o apontamento para o serviço

REST com uma rota especifica, neste caso o resultado exibido foi uma listagem de

valores em formato XML onde você pode verificar a implementação do serviço através

da Listagem 2 nas linhas 12 a 16. Aqui o resultado foi em formato XML, porém você

pode recuperar os dados em formato JSON, como veremos mais adiante.

Estruturando o projeto cadastro de fornecedores

Para demostrar melhor o uso da Web API criaremos um projeto para cadastro de

fornecedores envolvendo serviço REST com a Web API, acesso a dados com Entity

framework e SQL Server 2014. Por fim criaremos um projeto cliente WPF para

consumir o serviço. Neste projeto teremos a seguinte estrutura, como mostra a Figura

3. 

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 10/46
13/11/2015 ASP.NET Web API – Parte 2

Figura 3. Estrutura projeto cadastro de fornecedores.

O projeto cadastro de fornecedores, como próprio nome já diz, terá apenas uma tabela,

cujo script de criação para ser executado no SQL Server consta na Listagem 3.

Listagem 3. Script SQL para banco de dados SQL Server 2014.

  01 CREATE TABLE FORNECEDOR (
  02  ID_FORNECEDOR INTEGER  NOT NULL   IDENTITY ,
  03  NOME VARCHAR(100)    ,
  04  CNPJ VARCHAR(18)    ,
  05  ENDERECO VARCHAR(300)    ,
  06  BAIRRO VARCHAR(40)    ,
  07  CIDADE VARCHAR(40)    ,
  08  SITUACAO CHAR(1)    ,
  09  DATA_CADASTRO DATE      ,
  10 PRIMARY KEY(ID_FORNECEDOR));
  11 GO

Com o SQL Server Management Studio aberto, crie um novo banco de dados chamado

“DB_Fornecedor. Em seguida, selecione o banco criado, abra uma nova query e

execute o script dessa listagem para criar tabela fornecedor.

Feito este procedimento, ainda resta popular a tabela com alguns cadastro fictícios a

serem usados como teste nas consultas, para isso crie uma nova query e execute o

script da Listagem 4.

Listagem 4. Script SQL para popular tabelas de fornecedores SQL Server

  INSERT INTO FORNECEDOR(NOME, CNPJ, ENDERECO, BAIRRO, CIDADE, SITUACAO, DATA_CADASTRO) VALU
  INSERT INTO FORNECEDOR(NOME, CNPJ, ENDERECO, BAIRRO, CIDADE, SITUACAO, DATA_CADASTRO) VALU
  INSERT INTO FORNECEDOR(NOME, CNPJ, ENDERECO, BAIRRO, CIDADE, SITUACAO, DATA_CADASTRO) VALU

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 11/46
13/11/2015 ASP.NET Web API – Parte 2

Definido entidades com Entity framework

Nesta segunda etapa do projeto vamos adicionar o Entity Framework para recuperar a

entidade Fornecedor do banco de dados, assim teremos a mesma a disposição no

projeto como uma classe Model.

Para isso devemos clicar com botão direito sobre a pasta Models e em seguida no

menu Add> New Item. Selecione a categoria Data e o template ADO.NET Entity Data

Model e coloque o nome de “ModelFornecedor.edmx” para o arquivo.

Após clicar no botão Add ainda resta criar uma conexão com banco de dados,

selecionar a versão do entity framework, marcar a tabela fornecedor e clicar em finish,

conforme mostra as Figuras 4 e Figura 5.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 12/46
13/11/2015 ASP.NET Web API – Parte 2

Figura 4. Entity framework, conexão com banco de dados.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 13/46
13/11/2015 ASP.NET Web API – Parte 2

Figura 5. Entity Framework, seleção da tabela fornecedor.

Após inserido o Entity Framework no projeto Web API, terá um arquivo chamado

ModelFornecedor.edmx dentro da pasta Models, com ele fica fácil atualizar suas

entidades conforme for alterando ou inserindo novas tabelas no banco de dados.

Criando novo Controller para Fornecedor

De volta ao serviço REST com a Web API, deve ser criado um novo controller para o

fornecedor. Este procedimento é bem fácil, basta clicar com botão direito em cima da

pasta Controllers e então no menu Add> Web API Controller Class e dar o nome para o

controller de FornecedorController.
http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 14/46
13/11/2015 ASP.NET Web API – Parte 2

Lembre­se que o usuário consumidor do serviço visualizará apenas com palavra

Fornecedor, pois o sufixo Controller é apenas para uso do ASP.NET MVC identificar os

controllers.

Esse procedimento irá criar um novo arquivo chamado “FornecedorController.cs”

dentro da pasta Controllers, e para facilitar o ASP.NET já cria alguns métodos padrões

para receber requisições através dos métodos GET, POST, PUT e DELETE do

protocolo HTTP semelhante ao que foi visto na Listagem 2.

Porém serão feitas várias modificações nessa classe, pois precisamos fazer acesso ao

banco de dados através do uso do Entity Framework. Também serão alterados os

nomes dos métodos para autodescrever sua função para uma melhor compreensão

por parte do cliente ao consumir o serviço. Por fim vamos expor o serviço para

consumo.

Na Listagem 5 está o novo código da classe FornecedorController, com todas as

alterações citadas já implementadas.

Listagem 5. Alterações no Controller fornecedor para fornecer serviço com operações

CRUD.

  01 using System;
  02 using System.Collections.Generic;
  03 using System.Linq;
  04 using System.Net;
  05 using System.Net.Http;
  06 using System.Web.Http;
  07 using ASPNET_Web_API.Models;
  08
  09 namespace ASPNET_Web_API.Controllers
  10 {
  11    public class FornecedorController : ApiController
  12    {
  13        private DB_FornecedorEntities ctx = new DB_FornecedorEntities();

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 15/46
13/11/2015 ASP.NET Web API – Parte 2

  14
  15        [HttpGet]
  16        [ActionName("listagem")]
  17        public IEnumerable<FORNECEDOR> Get()
  18        {
  19            return ctx.FORNECEDOR.AsEnumerable();
  20        }
  21
  22        [HttpGet]
  23        [ActionName("busca")]
  24        public FORNECEDOR Get(int id)
  25        {
  26            var objFonededor = ctx.FORNECEDOR.Where(f => f.ID_FORNECEDOR == id).FirstOrD
  27            return objFonededor;
  28        }
  29
  30        [HttpPost]
  31        [ActionName("incluir")]
  32        public void Post(FORNECEDOR objFornecedor)
  33        {
  34            ctx.FORNECEDOR.Add(objFornecedor);
  35            ctx.SaveChanges();
  36        }
  37
  38        [HttpPost]
  39        [ActionName("alterar")]
  40        public void Put(FORNECEDOR objFornecedorAlterar)
  41        {
  42    var buscarFonededor = ctx.FORNECEDOR.Where(f => f.ID_FORNECEDOR == objFornecedorAlte
  43            ctx.Entry(buscarFonededor).CurrentValues.SetValues(objFornecedorAlterar);
  44            ctx.SaveChanges();
  45        }
  46
  47        [HttpGet]
  48        [ActionName("excluir")]
  49        public void Delete(int id)
  50        {
  51            var deletarFonededor = ctx.FORNECEDOR.Where(f => f.ID_FORNECEDOR == id).Firs
  52            ctx.FORNECEDOR.Remove(deletarFonededor);
  53            ctx.SaveChanges();
  54        }
  55    }
  56 }

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 16/46
13/11/2015 ASP.NET Web API – Parte 2

Observando essa listagem é preciso fazer vários comentários, principalmente a

respeito do comportamento da Web API, pois será preciso realizar algumas alterações

no arquivo WebApiConfig.cs, caso contrário não conseguiremos acessar alguns

métodos do serviço.Também é importante citar o uso do Entity framework que fornece

o acesso ao banco de dados, então veja a seguir as ponderações sobre esse código.

· Linha 7: Aqui foi realizada a referência à pasta Models, pois é nesta pasta onde se

encontra o arquivo EDMX do Entity Framework e precisamos do mesmo para realizar o

acesso ao banco de dados.

· Linha 13: Foi criado um objeto chamado de ctx que fornece uma instância do banco

de dados através do DB_FornecedorEntities que criamos anteriormente quando

inserimos o Entity Framework, assim podemos chamar a tabela fornecedor e realizar

manutenção nos dados.

· Linha 15: Foi realizada uma anotação usando [HttpGet], ou seja, esta anotação serve

para informar a Web API que este método só vai estar acessível via requisição HTTP

por GET.

Dependendo do seu contexto pode ser informado mais de um verbo do HTTP para

acesso ao método exposto. Outro ponto importante é que com a anotação [HttpGet]

você pode mudar o nome do método de Get para outro que seja melhor compreendido,

porém aqui manteremos com o mesmo nome para facilitar o entendimento da próxima

anotação.

· Linha 16: Esta linha apresenta outra anotação importante para Web API, ou seja, se

você não quer alterar o nome original do método que fornece a ação ao serviço, que

neste caso é “Get”, então é possível expor para o cliente o método com outro nome

sem precisar alterar o mesmo.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 17/46
13/11/2015 ASP.NET Web API – Parte 2

Para isso você vai usar a anotação ActionName com o nome que você vai dar ao

método, para que o cliente possa consumir o serviço a partir deste nome. Observe:

[ActionName("listagem")], agora para acessar a URI da listagem de fornecedores é

preciso informar a palavra listagem ao final da URL do serviço.

· Linha 19: Nesta linha retornamos todos os clientes da tabela fornecedor através do

ctx.FORNECEDOR.AsEnumerable().

· Linhas 26 e 27: Aqui vamos ter um método chamado apenas de “busca”, isso porque

iremos definir no arquivo de mapeamento que deve ser informado o nome do controller

seguido do nome do método para acessar o recurso, desta forma fica algo parecido

com “fornecedor/busca?id=10” para retornar o fornecedor através da consulta em cima

do contexto que usa a expressão lambda (f => f.ID_FORNECEDOR ==

objFornecedorAlterar.ID_FORNECEDOR)) dentro da cláusula Where seguido da

chamada do método First () para encontrar o fornecedor especifico.

· Linhas 32 a 36: Aqui tem o código necessário para inserir um novo fornecedor na

base de dados, pois o método recebe um objeto complexo do tipo fornecedor e em

seguida chama o método Add de fornecedor passando o objeto que representa o novo

fornecedor a ser salvo no banco de dados, na sequência é só chamar o método

SaveChanges() do Entity Framework para concretizar a transação.

· Linhas 38 a 45: Aqui é apresentada a operação update, perceba que é recebido por

parâmetro um objeto do tipo fornecedor que tem os dados a serem alterados na base

de dados, desta forma primeiro é buscado no banco o fornecedor original a ser

alterado, conforme linha 42.

Na linha 43 é usado o método Entry que recebe o objeto que representa o fornecedor a

ser alterado e em seguida CurrentValues.SetValues passando os dados que precisam

ser alterados no objeto original, por fim é só chamar o método SaveChanges() para
http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 18/46
13/11/2015 ASP.NET Web API – Parte 2

finalizar a alteração no banco de dados.

· Linhas 47 a 54: A última operação é o delete, que irá excluir um fornecedor da base

de dados. Assim sendo é apenas recebido por parâmetro o id do fornecedor a ser

excluído, em seguida buscado o mesmo na base de dados e por fim chamado o

método Remove, conforme linha 52 para excluir permanentemente o fornecedor.

Configurando roteamento para serviço cadastro


de fornecedores

Com as novas mudanças da Listagem 5 agora é preciso fazer algumas alterações no

arquivo de roteamento da Web API chamado WebApiConfig.cs, que está contido dento

da pasta App_Start.

Para isso veja a Figura 6 que apresenta o mesmo antes da modificação e veja na

Listagem 6 como deve ficar o mesmo depois das alterações necessárias.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 19/46
13/11/2015 ASP.NET Web API – Parte 2

Figura 6. Arquivo original WebApiConfig.cs.

Listagem 6. Mudanças arquivo WebApiConfig.cs.

  01 using System;
  02 using System.Collections.Generic;
  03 using System.Linq;
  04 using System.Web.Http;
  05
  06 namespace ASPNET_Web_API
  07 {
  08    public static class WebApiConfi
  09    {
  10        public static void Register(HttpConfiguration config)
  11        {
  12            // Web API configuration and services
  13
  14            // Web API routes
  15            config.MapHttpAttributeRoutes();

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 20/46
13/11/2015 ASP.NET Web API – Parte 2

  16
  17            config.Routes.MapHttpRoute(
  18                name: "ServicoWebAPI",
  19                routeTemplate: "ServicoWebAPI/{controller}/{Action}/{id}",
  20                defaults: new { id = RouteParameter.Optional }
  21            );
  22        }
  23    }
  24 }

Não há mudanças significativas visualmente entre essa figura e essa listagem,

praticamente a alteração ocorreu apenas na linha 19, pois neste exemplo temos

apenas uma rota a configurar, porém perceba que mudou toda a lógica de acesso ao

serviço, sendo preciso informar agora o nome do serviço, seguido pelo nome do

controller, seguido pelo nome do método e por fim o parâmetro que neste caso é

opcional, pois foi definido na linha 20 o mesmo como optional.

Veja na Figura 7 a página help gerada pelo próprio ASP.NET MVC que mostra como

deve ser realizado o acesso a cada um dos métodos do serviço REST de nome

ServicoWebAPI.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 21/46
13/11/2015 ASP.NET Web API – Parte 2

Figura 7. Help ASP.NET MVC mostrando caminhos e verbos de requisição HTTP.

Caso queira acessar a listagem de fornecedores você pode usar a URL

“http://localhost:62511/ServicoWebAPI/Fornecedor/listagem” alterando apenas a porta

gerada pelo seu Visual Studio, dessa forma você vai obter uma listagem de

fornecedores no formato XML conforme apresenta na Listagem 7.

Listagem 7. Listagem de fornecedores no formato XML

  01 This XML file does not appear to have any style information associated with it. The doc
  02 <ArrayOfFORNECEDOR xmlns:i="http://www.w3.org/2001/XMLSchema‐instance" xmlns="http://sc
  03 <FORNECEDOR>
  04 <BAIRRO>Bairro A</BAIRRO>
  05 <CIDADE>Cidade A</CIDADE>
  06 <CNPJ>11.111.111/0001‐01</CNPJ>
  07 <DATA_CADASTRO>2015‐02‐25T00:00:00</DATA_CADASTRO>
  08 <ENDERECO>Rua A</ENDERECO>

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 22/46
13/11/2015 ASP.NET Web API – Parte 2

  09 <ID_FORNECEDOR>10</ID_FORNECEDOR>
  10 <NOME>Fornecedor A</NOME>
  11 <SITUACAO>A</SITUACAO>
  12 </FORNECEDOR>
  13 <FORNECEDOR>
  14 <BAIRRO>Bairro B</BAIRRO>
  15 <CIDADE>Cidade B</CIDADE>
  16 <CNPJ>11.222.111/0001‐01</CNPJ>
  17 <DATA_CADASTRO>2015‐02‐26T00:00:00</DATA_CADASTRO>
  18 <ENDERECO>Rua B</ENDERECO>
  19 <ID_FORNECEDOR>11</ID_FORNECEDOR>
  20 <NOME>Fornecedor B</NOME>
  21 <SITUACAO>A</SITUACAO>
  22 </FORNECEDOR>
  23 <FORNECEDOR>
  24 <BAIRRO>Bairro C</BAIRRO>
  25 <CIDADE>Cidade C</CIDADE>
  26 <CNPJ>11.333.111/0001‐01</CNPJ>
  27 <DATA_CADASTRO>2015‐02‐27T00:00:00</DATA_CADASTRO>
  28 <ENDERECO>Rua C</ENDERECO>
  29 <ID_FORNECEDOR>12</ID_FORNECEDOR>
  30 <NOME>Fornecedor C</NOME>
  31 <SITUACAO>A</SITUACAO>
  32 </FORNECEDOR>
  33 </ArrayOfFORNECEDOR>

Configurando formatadores para receber


parâmetro JSON

A Web API é totalmente flexível quanto ao formato de dados a ser trocado entre

requisições e respostas do cliente ao servidor e vice­versa via protocolo HTTP, ou seja,

até este ponto, conforme vemosnessa listagem, o tipo de retorno de dados foi em

formato XML, pois quando foi realizada a requisição da listagem de fornecedores ao

servidor via navegador Chrome o mesmo informou no header da mensagem que

aceitaria os seguintes formatos de dados como retorno: Accept: text/html,

application/xhtml+xml e application/xml, como mostra a Figura 8 da análise do Fiddler

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 23/46
13/11/2015 ASP.NET Web API – Parte 2

Web Debugger.

Assim sendo, a Web API verificou que poderia retornar o formato XML pois estava na

lista, porém se você precisar retornar apenas JSON como padrão, ai é preciso apenas

incluir uma linha de código dentro do arquivo WebApiConfig.cs.

Veja a Listagem 8 que representa o WebApiConfig, com a remoção do formato XML

como retorno de requisições, desta forma o padrão agora retornado será JSON como

pode ser visto na Figura 9 que realiza uma busca ao fornecedor de id igual a 10.

Figura 8. Header requisição listagem fornecedores com Fiddler Web Debugger.

Você irá encontrar na sessão Links o link para download do programa Fiddler Web

Debugger para que possa monitorar as requisições e repostas via protocolo HTTP.

Listagem 8. Arquivo WebApiConfig com remoção de retorno de dados no formato

XML.

  01 using System;
  02 using System.Collections.Generic;
  03 using System.Linq;
  04 using System.Net.Http.Formatting;
  05 using System.Web.Http;
  06
  07 namespace ASPNET_Web_API
  08 {
http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 24/46
13/11/2015 ASP.NET Web API – Parte 2

  09   public static class WebApiConfig
  10    {
  11        public static void Register(HttpConfiguration config)
  12        {
  13            // Web API configuration and services
  14
  15            // Web API routes
  16            config.MapHttpAttributeRoutes();
  17            
  18            //Removendo retorno formato XML
  19            config.Formatters.Remove(config.Formatters.XmlFormatter);
  20
  21            config.Routes.MapHttpRoute(
  22                name: "ServicoWebAPI",
  23                routeTemplate: "ServicoWebAPI/{controller}/{Action}/{id}",
  24                defaults: new { id = RouteParameter.Optional}                
  25            );
  26        }
  27    }
  28 }

Figura 9. Buscando fornecedor por id e retornando dados no formato JSON.

Foi realizada a remoção do formato de dados XML como retorno das requisições que

passam como resposta padrão este formato, o XML, no caso de requisições realizadas

com Chrome, porém dependendo do contexto em que a Web API irá operar esta pode

não ser a melhor estratégia, sendo necessário retornar dados em outro formato com o

JSON em determinado cenário e XML em outro.

Desta forma você poderia ter um cliente que irá consumir os dados retornados pelo

serviço no formato XML quanto JSON, desta forma a melhor estratégia para esta

situação é deixar o XML como padrão de retorno e se algum cliente precisar dos dados

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 25/46
13/11/2015 ASP.NET Web API – Parte 2

em formato JSON, então você apenas configura o arquivo WebApiConfig para aceitar

um novo formatador para retornar JSON, precisando apenas o cliente informar na URL

um novo parâmetro para devolver o JSON no lugar de XML.

A Listagem 9, logo nas linhas 21 e 22, apresenta a configuração do arquivo

WebApiConfig com a inclusão do novo formatador JSON, desta forma foi passado ao

HttpConfiguration a MediaTypeMappings application/json através do

Formatters.JsonFormatter que agora tem um novo parâmetro chamado “tipo” para o

QueryStringMapping, que recebe "json" como valor e desta forma retorna os dados no

formato JSON.

Veja na Figura 10 uma requisição que busca o fornecedor de id 11 retornando XML

como padrão e logo em seguida a mesma requisição, porém passando o parâmetro

tipo=json para retornar o resultado em formato JSON.

Essa abordagem pode ser interessante para não ser necessário definir o tipo de dado a

ser retornado pelo serviço, ou seja, definir no header da requisição o tipo

application/json ou application/xml.

Listagem 9. Incluindo formatador JSON ao arquivo WebApiConfig.

  01 using System;
  02 using System.Collections.Generic;
  03 using System.Linq;
  04 using System.Net.Http.Formatting;
  05 using System.Web.Http;
  06
  07 namespace ASPNET_Web_API
  08 {
  09    public static class WebApiConfig
  10    {
  11        public static void Register(HttpConfiguration config)
  12        {
  13            // Web API configuration and services
  14

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 26/46
13/11/2015 ASP.NET Web API – Parte 2

  15            // Web API routes
  16            config.MapHttpAttributeRoutes();
  17            
  18            //Removendo retorno formato XML
  19            //config.Formatters.Remove(config.Formatters.XmlFormatter);
  20
  21            config.Formatters.JsonFormatter.MediaTypeMappings.Add(
  22            new QueryStringMapping("tipo", "json", "application/json"));
  23
  24            config.Routes.MapHttpRoute(
  25                name: "ServicoWebAPI",
  26                routeTemplate: "ServicoWebAPI/{controller}/{Action}/{id}",
  27                defaults: new { id = RouteParameter.Optional}                
  28            );
  29        }
  30    }
  31 }

Figura 10. Requisição busca por id fornecedor retornando XML e JSON com uso de

parâmetro.

Projeto WPF para consumir o serviço REST Web


API
http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 27/46
13/11/2015 ASP.NET Web API – Parte 2

O serviço que fornece todas as operações de CRUD para o cadastro de fornecedores

já foi devidamente implementado com a Web API e já está pronto para ser consumido

por um cliente, para demonstrar o consumo do serviço será criado um projeto WPF

onde teremos uma interface com todas as opções para fazer manutenção no cadastro

de fornecedores.

Crie um novo projeto no Visual Studio 2013 nomeando­o de WpfCliente. Selecione a

categoria Windows e o template WPF Application com Framework .NET 4.5.1.

Após o projeto WPF ser criado é preciso instalar a biblioteca ASP.NET Web API Client,

pois precisaremos dela para consumir o serviço REST. Você pode instalar a mesma

clicando com botão direito no projeto e em seguida na opção Manage NuGet

Packages.

Abrirá uma nova janela conforme apresentado na Figura 11, então pesquise por Web

API Client e instale o pacote no projeto, fechando a janela em seguida.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 28/46
13/11/2015 ASP.NET Web API – Parte 2

abrir imagem em nova janela

Figura 11. Instalação biblioteca ASP.NET Web API Client Libraries. 

Com o projeto WPF criado, é hora de definir o layout da aplicação cadastro de

fornecedores com todas as opções para o CRUD, desta forma serão criados vários

campos para permitir o usuário informar os dados do fornecedor e alguns botões para

cadastrar, alterar, excluir, pesquisar e listar.

Este procedimento pode ser definido através do arquivo de marcação

MainWindow.xaml, onde podemos colocar todos os componentes visuais que iram

compor a tela da aplicação conforme código apresentado na Listagem 10.

Listagem 10. Código de marcação XAML para cadastro de fornecedores.

  01 <Window x:Class=”WpfCliente.MainWindow”
  02        xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
  03        xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
  04        Title=”MainWindow” Height=”470” Width=”700”>
  05    <Grid>
  06        <DataGrid x:Name=”gridFornecedores” HorizontalAlignment=”Left” VerticalAlignment
            Width=”692” SelectedCellsChanged=”gridFornecedores_SelectedCellsChanged”/>
  07        <Label Content=”ID:” HorizontalAlignment=”Left” Margin=”10,181,0,0” VerticalAlig
  08        <TextBox x:Name=”txvID” HorizontalAlignment=”Right” Height=”23” Margin=”0,184,27
  09        <Label Content=”NOME:” HorizontalAlignment=”Left” Margin=”10,210,0,0” VerticalAl
  10        <TextBox x:Name=”txvNome” HorizontalAlignment=”Right” Height=”23” Margin=”0,210,
  11        <Label Content=”CNPJ:” HorizontalAlignment=”Left” Margin=”10,236,0,0” VerticalAl
  12        <TextBox x:Name=”txvCNPJ” HorizontalAlignment=”Right” Height=”23” Margin=”0,235,
  13        <Label Content=”ENDERECO:” HorizontalAlignment=”Left” Margin=”10,262,0,0” Vertic
  14        <TextBox x:Name=”txvEndereco” HorizontalAlignment=”Right” Height=”23” Margin=”0,
  15        <Label Content=”BAIRRO::” HorizontalAlignment=”Left” Margin=”10,288,0,0” Vertica
  16        <TextBox x:Name=”txvBairro” HorizontalAlignment=”Right” Height=”23” Margin=”0,28
  17        <Label Content=”CIDADE:” HorizontalAlignment=”Left” Margin=”10,314,0,0” Vertical
  18        <TextBox x:Name=”txvCidade” HorizontalAlignment=”Right” Height=”23” Margin=”0,31
  19        <CheckBox x:Name=”ckbSituacao” HorizontalAlignment=”Left” Margin=”15,345,20,0” V
  20        <Label Content=”DATA CADASTRO:” HorizontalAlignment=”Left” Margin=”10,366,0,0” V
  21        <TextBox x:Name=”txvDataCadastro” HorizontalAlignment=”Right” Height=”23” Margin
            TextWrapping=”Wrap” VerticalAlignment=”Top” Width=”376”/>
  22        <Button x:Name=”btnCadastrar” Content=”Cadastrar” HorizontalAlignment=”Left” Mar

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 29/46
13/11/2015 ASP.NET Web API – Parte 2

            Width=”75” Click=”btnCadastrar_Click”/>
  23        <Button x:Name=”btnAlterar” Content=”Alterar” HorizontalAlignment=”Left” Margin=
            Width=”75” Click=”btnAlterar_Click”/>
  24        <Button x:Name=”btnExcluir” Content=”Excluir” HorizontalAlignment=”Left” Margin=
            Width=”75” Click=”btnExcluir_Click”/>
  25        <Button x:Name=”btnListar” Content=”Listar” HorizontalAlignment=”Left” Margin=”2
            Width=”75” RenderTransformOrigin=”0.023,0.453” Click=”btnListar_Click”/>
  26        <Button x:Name=”btnPesquisaID” Content=”Pesquisa ID” HorizontalAlignment=”Left” 
            Width=”75” Click=”btnPesquisaID_Click”/>
  27    </Grid>
  28 </Window>

Essa listagem contém código XAML puro, um código de marcação para criar layout

modernos com base em XML em aplicações WPF, Silverlight, Windows Phone e

Windows Store. Nessa listagem é importante destacar alguns pontos.

· Linha 6: Foi criado um DataGrid para exibir a listagem de fornecedores cadastrados

no banco de dados, perceba que também foi definido o evento SelectedCellsChanged,

que será disparado quando o usuário selecionar algum registro no DataGrid, desta

forma, após o registro ser selecionado as informações do fornecedor serão

preenchidas automaticamente nos campos do formulário para possibilitar alteração nos

mesmos.

· Linhas 8 a 21: Nestas linhas são definidos vários Labels e TextBoxes que formam os

campos para entrada de dados no formulário, também é definido um checkbox na linha

19 para que possa marcar, informando que o cadastro fornecedor está ativo ou inativo.

· Linhas 22 a 26: Neste intervalo são criados os botões para as operações cadastrar,

alterar, excluir, listar e pesquisar pelo campo ID do fornecedor. É importante destacar

que foi definido o evento Click de cada um dos botões, e é através destes eventos que

iremos fazer a chamada ao serviço REST exposto pela Web API.

Após a implementação da Listagem 10 execute o projeto e tenha uma tela conforme
http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 30/46
13/11/2015 ASP.NET Web API – Parte 2

apresentado na Figura 12.

Figura 12. Tela cadastro de fornecedores.

Codificando operação listagem de fornecedores

Com a tela devidamente criada chegou o momento de dar vida à aplicação, para isso

iremos codificar todos os eventos Click dos botões do layout.

O primeiro passo é abrir o arquivo MainWindow.xaml.cs para iniciar a codificação. Com

arquivo aberto insira o código da Listagem 11 dentro do mesmo, este código define o

evento Click do botão listar e também cria dois métodos que serão usados durante a

codificação das demais operações, ou seja, um método para limpar os campos da tela

e outro responsável por buscar a listagem de fornecedores via serviço Web API.

Listagem 11. Implementação da listagem de fornecedores e limpar campos.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 31/46
13/11/2015 ASP.NET Web API – Parte 2

  01 private void btnListar_Click(object sender, RoutedEventArgs e)
  02 {
  03    listarFonecedor();
  04 }
  05
  06 private void listarFonecedor()
  07 {
  08    HttpClient httpCliente = new HttpClient(); 
  09    httpCliente.BaseAddress = new Uri("http://localhost:62511/");
  10    httpCliente.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("ap
  11
  12    HttpResponseMessage response = httpCliente.GetAsync("servicowebapi/fornecedor/listag
  13
  14    var listaFornecedores = response.Content.ReadAsAsync<IEnumerable<ModelFornecedor>>()
  15    gridFornecedores.ItemsSource = listaFornecedores;
  16 }
  17 
  18 private void limparCampos()
  19 {
  20    txvID.Text = "";
  21    txvNome.Text = "";
  22    txvCNPJ.Text = "";
  23    txvEndereco.Text = "";
  24    txvBairro.Text = "";
  25    txvCidade.Text = "";
  26    ckbSituacao.IsChecked = false;
  27    txvDataCadastro.Text = "";
  28 }
  29 private void gridFornecedores_SelectedCellsChanged(object sender, SelectedCellsChangedE
  30 {
  31 ModelFornecedor objFornecedor = (ModelFornecedor)gridFornecedores.SelectedItem;
  32
  33 if (objFornecedor != null)
  34 {
  35    txvID.Text = objFornecedor.ID_FORNECEDOR.ToString();
  36    txvNome.Text = objFornecedor.NOME;
  37    txvCNPJ.Text = objFornecedor.CNPJ;
  38    txvEndereco.Text = objFornecedor.ENDERECO;
  39    txvBairro.Text = objFornecedor.BAIRRO;
  40    txvCidade.Text = objFornecedor.CIDADE;
  41    ckbSituacao.IsChecked = objFornecedor.SITUACAO == "A" ? true : false;
  42    txvDataCadastro.Text = objFornecedor.DATA_CADASTRO.ToString();   
  43 }
  44 }

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 32/46
13/11/2015 ASP.NET Web API – Parte 2

Nessa listagem temos a implementação e consumo referente ao serviço da Web API

para obter a listagem de fornecedores, e em seguida é preenchido o DataGrid. Veja a

seguir os detalhes da implementação.

· Linhas 1 a 4: Aqui temos o evento click referente ao botão btnListar. Na

implementação do evento é chamado o método listarFonecedor() que realiza uma

requisição ao serviço de listagem de fornecedores.

· Linhas 6 a 15: Neste bloco é implementado o método listarFornecedor.

· Linha 8: É defino um objeto do tipo HttpClient, esta classe fornece todos os recursos

necessários para invocar os serviços da Web API.

· Linha 9: Aqui é setado o BaseAddress que recebe uma URI com protocolo, DNS e

porta do servidor que está dispondo o serviço.

· Linha 10: Nesta linha é passado o cabeçalho da mensagem de requisição HTTP, no

qual informamos que queremos como tipo de retorno de dados o formato

application/json. Para isso é setado o DefaultRequestHeaders chamando o método

Add através do Accept.

· Linha 12: É criado um objeto do tipo HttpResponseMessage que irá conter a resposta

de retorno do servidor com os dados. Perceba que neste objeto é atribuído o resultado

referente à chamada do método assíncrono GetAsync, onde passamos o caminho

completo do serviço listagem de fornecedores para realizar uma requisição via GET,

como o próprio nome do método sugere. Por fim é chamado o result para de fato

completar a requisição.

· Linha 14: É criada uma variável através da inferência de tipo para representar a

listagem de fornecedores, para isso usamos o objeto response chamando o método

ReadAsAsync seguido de Result para obter a lista de fornecedor através de uma
http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 33/46
13/11/2015 ASP.NET Web API – Parte 2

conversão em IEnumerable de ModelFonecedor.

· Linha 15: Aqui é populado o DataGrid gridFornecedores com a listagem de

fornecedores através da propriedade ItemsSource.

· Linhas 18 a 28: Aqui é implementado o método para limpar os campos do formulário,

pois o mesmo será usado durante vários pontos na aplicação.

· Linhas 29 a 44: Neste bloco é definido o código necessário para preencher os

campos com os dados do fornecedor quando selecionado no gridFornecedores através

do disparo do evento SelectedCellsChanged.

Implementando a função de cadastro de


fornecedor

Outra operação importante na aplicação é o cadastro de fornecedores, que será

implementado através do evento Click do botão btnCadastrar. A Listagem 12 tem todo

o código referente à implementação do cadastro de fornecedor.

Listagem 12. Implementação cadastro de fornecedor.

  01 private void btnCadastrar_Click(object sender, RoutedEventArgs e)
  02 {
  03    HttpClient httpCliente = new HttpClient();
  04    httpCliente.BaseAddress = new Uri("http://localhost:62511/");
  05
  06    httpCliente.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("ap
  07    ModelFornecedor fornecedor = new ModelFornecedor();
  08
  09    fornecedor.NOME = txvNome.Text;
  10    fornecedor.CNPJ = txvCNPJ.Text;
  11    fornecedor.ENDERECO = txvEndereco.Text;
  12    fornecedor.BAIRRO = txvBairro.Text;
  13    fornecedor.CIDADE = txvCidade.Text;
  14    fornecedor.SITUACAO = ckbSituacao.IsChecked == true ? "A" : "I";

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 34/46
13/11/2015 ASP.NET Web API – Parte 2

  15    fornecedor.DATA_CADASTRO = DateTime.Now;
  16
  17    var response = httpCliente.PostAsJsonAsync("servicowebapi/fornecedor/incluir", forne
  18
  19    listarFonecedor();
  20    limparCampos();
  21 }

Detalhes da implementação do cadastro de fornecedor:

· Linha 3: Criado o objeto HttpClient para que possamos invocar o serviço.

· Linha 4: Setado o servidor e porta que expõem o serviço;

· Linha 6: Definido o formato de dados de retorno, neste caso o JSON.

· Linha 7: Criado um objeto ModelFornecedor para representar o fornecedor a ser

cadastrado.

· Linhas 9 a 15: Neste intervalo são recuperados os dados informados pelo usuário

nos campos do layout e em seguida setados no objeto ModelFornecedor para serem

submetidos ao servidor.

· Linha 17: É invocado o serviço para cadastro de fornecedor passando o caminho

completo do mesmo seguido do objeto fornecedor, perceba que foi usado o método

assíncrono PostAsJsonAsync da classe HttpClient.

Implementando a função atualizar fornecedor

A implementação referente ao update de cadastro de fornecedor encontra­se na

Listagem 13, mas não necessita de tantas explicações, pois é bem similar à

implementação do cadastro de fornecedor descrito anteriormente.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 35/46
13/11/2015 ASP.NET Web API – Parte 2

A diferença está apenas no fato de submeter um objeto ModelFornecedor com ID do

fornecedor a ser alterado. Em seguida, na linha 20 é realizada uma chamada referente

à URL para atualização de dados via verbo POST com a execução do método

PostAsJsonAsync, desta forma submetemos o objeto fornecedor através do corpo da

mensagem HTTP.

Listagem 13. Implementação update cadastro fornecedor.

  01 private void btnAlterar_Click(object sender, RoutedEventArgs e)
  02 {
  03    if (txvID.Text != String.Empty)
  04    {
  05 HttpClient httpCliente = new HttpClient();
  06 httpCliente.BaseAddress = new Uri("http://localhost:62511/");
  07
  08 httpCliente.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("appli
  09 ModelFornecedor fornecedor = new ModelFornecedor();
  10
  11 fornecedor.ID_FORNECEDOR = int.Parse(txvID.Text.ToString());
  12 fornecedor.NOME = txvNome.Text;
  13 fornecedor.CNPJ = txvCNPJ.Text;
  14 fornecedor.ENDERECO = txvEndereco.Text;
  15 fornecedor.BAIRRO = txvBairro.Text;
  16 fornecedor.CIDADE = txvCidade.Text;
  17 fornecedor.SITUACAO = ckbSituacao.IsChecked == true ? "A" : "I";
  18 fornecedor.DATA_CADASTRO = DateTime.Now;
  19
  20 var response = httpCliente.PostAsJsonAsync("servicowebapi/fornecedor/alterar", forneced
  21
  22 listarFonecedor();
  23 limparCampos();
  24 }
  25    else {
  26 MessageBox.Show("Favor selecionar um cliente.");
  27 }
  28 }

Implementando a função de busca por ID do


http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 36/46
13/11/2015 ASP.NET Web API – Parte 2

fornecedor

A pesquisa por ID do fornecedor é executada sempre que o usuário informar um ID no

TextBox correspondente e clicar no botão btnPesquisaID, disparando o evento click do

botão.

Então fica claro que para submeter uma busca neste sentido sempre será necessário

enviar um parâmetro com ID do fornecedor para que o serviço possa usar este valor na

consulta ao banco de dados com Entity Framework.

Veja na Listagem 14 a implementação de busca por ID através do evento click do

botão PesquisaID.

Listagem 14. Implementação busca por ID fornecedor

  01 private void btnPesquisaID_Click(object sender, RoutedEventArgs e)
  02 {
  03    HttpClient httpCliente = new HttpClient();
  04    httpCliente.BaseAddress = new Uri(“http://localhost:62511/”);
  05    httpCliente.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“ap
  06
  07    string id = txvID.Text;
  08
  09    HttpResponseMessage response = httpCliente.GetAsync(“servicowebapi/fornecedor/busca?
  10
  11    var fornecedor = response.Content.ReadAsAsync<ModelFornecedor>().Result;
  12    List<ModelFornecedor> lista = new List<ModelFornecedor>();
  13    lista.Add(fornecedor);
  14    gridFornecedores.ItemsSource = lista;
  15
  16    limparCampos();
  17 }

A implementação da busca por ID do fornecedor presente nessa listagem merece

algumas considerações, vejamos:

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 37/46
13/11/2015 ASP.NET Web API – Parte 2

· Linha 3: Criado um objeto HttpClient normalmente.

· Linha 4: Criado uma URI com endereço e porta do servidor.

· Linha 5: Definição de retorno de dados em formato JSON.

· Linha 7: Criada uma variável chamada id para armazenar o ID do fornecedor

informado pelo usuário no campo ID. É importante frisar que se poderia colocar uma

condição através de um if para verificar se realmente o usuário informou um id para

pesquisa, caso o mesmo não tenha digitado algo no campo id então poderia ser

apresentada uma mensagem na tela através MessageBox solicitando a entrada de

dados para pesquisa de um fornecedor em especifico.

· Linha 9: Criado um objeto HttpResponseMessage para receber a resposta do

servidor com os dados, porém foi usado o método GetAsync da classe HttpClient para

realizar uma requisição GET, passando como parâmetro o id do fornecedor que tinha

sido recuperado na linha 7.

· Linha 11: Foi definida uma variável que representa o fornecedor pesquisado, porém

para recuperar estes dados foi chamado o método ReadAsAsync da classe

HttpResponseMessage.

· Linhas 12 e 13: Na linha 12 é criado um List de ModelFornecedor, pois precisaremos

de uma lista que implemente uma IEnumerable para popular o DataGrid. Perceba que

na linha 13 foi adicionado na lista o objeto fornecedor retornado pela busca no servidor.

· Linhas 14 e 16: Aqui é de fato populado o DataGrid gridFornecedores atribuindo a

lista na propriedade ItemsSource do mesmo.

Implementando a função de excluir fornecedor

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 38/46
13/11/2015 ASP.NET Web API – Parte 2

A última operação referente à nossa aplicação RESTful é a função de excluir

fornecedor que representa o delete das operações CRUD em uma base de dados.

Você deve inserir o código da Listagem 15 dentro do evento click do botão btnExcluir,

pois é através dele que será invocado o serviço.

Veja que este trecho de código é bem reduzido, pois basta selecionar um fornecedor

no DataGrid submeter a requisição ao servidor passando como parâmetro o id do

fornecedor a ser excluído conforme apresentado na linha 8.

Listagem 15. Implementação função excluir fornecedor.

  01 private void btnExcluir_Click(object sender, RoutedEventArgs e)
  02 {
  03    HttpClient httpCliente = new HttpClient();
  04    httpCliente.BaseAddress = new Uri("http://localhost:62511/");
  05
  06    string id = txvID.Text;
  07
  08    string url = "servicowebapi/fornecedor/excluir?id=" + id;
  09
  10    HttpResponseMessage response = httpCliente.GetAsync(url).Result;
  11    limparCampos();
  12    listarFonecedor();
  13 }

Para finalizar este artigo veja a aplicação em execução na Figura 13.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 39/46
13/11/2015 ASP.NET Web API – Parte 2

Figura 13. Aplicação RESTful cadastro de fornecedores em execução.

Desenvolver uma aplicação RESTful torna­se bastante simples quando fazemos uso

de tecnologias como a ASP.NET Web API, que nos fornece toda uma estrutura bem

definida para a arquitetura da aplicação, inclusive utilizando o modelo já consolidado do

ASP.NET MVC.

Serviços desenvolvidos com esse framework podem ser facilmente consumidos por

diversos tipos de aplicação, como o WPF demonstrado neste artigo. Com o

conhecimento base aqui adquirido sobre REST, HTTP e ASP.NET Web API, agora

você pode buscar se aprofundar no assunto e implementar suas soluções de serviços

para integração de aplicações multiplataforma.

A Web API pode atuar facilmente como uma camada intermediária para permitir a

comunicação entre aplicações web, desktop e mobile, oferecendo uma interface

simples de ser consumida.

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 40/46
13/11/2015 ASP.NET Web API – Parte 2

Além disso, por contar com o uso do padrão MVC, esse framework facilita o

desenvolvimento de aplicações bem estruturadas, seguindo as melhores práticas e

técnicas utilizadas para aplicações web.

Links 

Fiddler Web Debugger

http://www.telerik.com/download/fiddler/fiddler4

ASP.NET Web API ­ MSDN

https://msdn.microsoft.com/pt­br/library/hh833994(v=vs.108).aspx

 
Madson Aguiar Rodrigues

Formação acadêmica em Análise e Desenvolvimento de Sistemas pela UNOPAR, pós­graduação em
Engenharia de Sistemas pela ESAB e especialista em Tecnologias para aplicações Web pela UNOPAR.
Trabalha com desenvolvimento de software há [...]

Publicado em 2015

O que você achou deste post?

 Gostei (1)  (0)

+  Mais conteúdo sobre .net

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 41/46
13/11/2015 ASP.NET Web API – Parte 2

Todos os comentarios (5) Postar dúvida / Comentário
Meus comentarios

Ricardo Facincani  MVP

Prezados, estou tentando rodar o exemplo, porém quando vou rodar mesmo no modelo padrão
do VS2013, apresenta o seguinte erro: 

Mensagem de Erro do Compilador: CS0234: O nome do namespace ou o tipo 'Description' não
existe no namespace 'System.Web.Http'. Precisa de uma referência de assembly? 

Arquivo de Origem: c:\Users\EQG\Documents\Visual Studio
2013\Projects\ASPNET_Web_API\ASPNET_Web_API\Areas\HelpPage\Views\Help\Index.cshtml
Linha: 2 

Observando o arquivo o mesmo faz as seguintes referências: 

@using System.Web.Http 
@using System.Web.Http.Description 
@using System.Collections.ObjectModel 
@using ASPNET_Web_API.Areas.HelpPage.Models 
@model Collection<ApiDescription> 

@{ 
ViewBag.Title = "ASP.NET Web API Help Page"; 

// Group APIs by controller 
ILookup<string, ApiDescription> apiGroups = Model.ToLookup(api =>
api.ActionDescriptor.ControllerDescriptor.ControllerName); 

<header> 
<div class="content­wrapper"> 
<div class="float­left"> 
<h1>@ViewBag.Title</h1> 
</div> 
</div> 
</header> 
<div id="body"> 
<section class="featured"> 
<div class="content­wrapper"> 
<h2>Introduction</h2> 
<p> 
Provide a general description of your APIs here. 
</p> 
</div> 
</section> 
<section class="content­wrapper main­content clear­fix"> 
@foreach (var group in apiGroups) 

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 42/46
13/11/2015 ASP.NET Web API – Parte 2

@Html.DisplayFor(m => group, "ApiGroup") 

</section> 
</div> 

@section Scripts { 
<link type="text/css" href="~/Areas/HelpPage/HelpPage.css" rel="stylesheet" /> 

Alguém pode ajudar a solucionar isso?

[há +1 mês] ­ Responder
 
Ricardo Facincani  MVP

Prezados, desculpe minha ignorância, mas montei o exemplo e não consigo rodar a aplicação de
forma alguma. Além do compilador apresentar o erro informando que não consegue localizar o
WpfCliente.exe no diretório do Debug, apresenta uma série de erros do tipo: 

Erro 2 The type or namespace name 'HttpClient' could not be found (are you missing a using
directive or an assembly reference?) C:\Users\EQG\Documents\Visual Studio
2013\Projects\WpfCliente\WpfCliente\MainWindow.xaml.cs 37 13 WpfCliente 

Erro 20 The type or namespace name 'ModelFornecedor' could not be found (are you missing a
using directive or an assembly reference?) C:\Users\EQG\Documents\Visual Studio
2013\Projects\WpfCliente\WpfCliente\MainWindow.xaml.cs 106 2 WpfCliente 

O que eu poderia ter feito de errado ou deixado de setar? 

[há +1 mês] ­ Responder
 
Ricardo Facincani  MVP

Prezados, já tentei outras coisas, porém estou enfrentando problemas de configuração,
pelo menos é o que acho. 

Erro 1 O recurso 'variável local digitada implicitamente' não pode ser usado porque ele
não é parte da ISO­2 específica linguagem C# C:\Users\EQG\Documents\Visual Studio
2013\Projects\WpfCliente\WpfCliente\MainWindow.xaml.cs 45 13 WpfCliente 

Erro 2 O nome de namespace ou o tipo 'ModelFornecedor' não pôde ser encontrado.
Precisa de uma diretiva using ou de uma referência de assembly?
C:\Users\EQG\Documents\Visual Studio
2013\Projects\WpfCliente\WpfCliente\MainWindow.xaml.cs 45 78 WpfCliente 

Erro 3 O recurso 'método de extensão' não pode ser usado porque ele não é parte da
ISO­2 específica linguagem C# C:\Users\EQG\Documents\Visual Studio
2013\Projects\WpfCliente\WpfCliente\MainWindow.xaml.cs 45 37 WpfCliente 

Erro 4 O nome de namespace ou o tipo 'ModelFornecedor' não pôde ser encontrado.
Precisa de uma diretiva using ou de uma referência de assembly?
C:\Users\EQG\Documents\Visual Studio

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 43/46
13/11/2015 ASP.NET Web API – Parte 2

2013\Projects\WpfCliente\WpfCliente\MainWindow.xaml.cs 63 13 WpfCliente 

Erro 8 O recurso 'variável local digitada implicitamente' não pode ser usado porque ele
não é parte da ISO­2 específica linguagem C# C:\Users\EQG\Documents\Visual Studio
2013\Projects\WpfCliente\WpfCliente\MainWindow.xaml.cs 94 13 WpfCliente 

[há +1 mês] ­ Responder

 
Douglas Claudio
Olá Ricardo, obrigado pelo seu comentário. 

Enviamos sua solicitação ao Madson e estamos no aguardo de um feedback do mesmo. 

Um abraço.

[há +1 mês] ­ Responder

 
[autor] Madson Aguiar Rodrigues  MVP

Olá Ricardo, 

Você pode seguir os passos abaixo para rodar o projeto com sucesso: 

1 ­ Primeiramente crie um banco de dados chamado de "DB_Fornecedor"no SQL Server
2014, logo em seguida execute o script SQL para criar a tabela fornecedor. Para
conseguir o script SQL você pode realizar o download do DBDesigner e abrir o arquivo
DER_CAD_FORNECEDOR.xml presente nos fontes do projeto. 

2 ­ Com banco de dados pronto agora você precisa abrir o arquivo
"ASPNET_Web_API.sln" presente nos fontes do artigo, logo em seguida você deve
realizar a alteração da connection string para acesso a dados com entity framework
presente no arquivo Web.config localizado dentro da solution explorer. Veja a seguir a
connection string para que o entity framework possa encontrar seu banco de dados.
Altere os dados que destaquei em maiúsculo. 

<connectionStrings> 
<add name="DB_FornecedorEntities"
connectionString="metadata=res://*/Models.ModelFornecedor.csdl|res://*/Models.Mode
lFornecedor.ssdl|res://*/Models.ModelFornecedor.msl;provider=System.Data.SqlClient;p
rovider connection string="data
source=.\SQLEXPRESS2014(NOME_DA_INSTANCIA);initial
catalog=DB_Fornecedor(NOME_DO_BANCO);persist security info=True;user
id=sa(USUARIO_DO_BANCO;password=******
(SENHA_DO_SEU_BANCO);MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" /> 
</connectionStrings> 

Execute o projeto e deixe o mesmo rodando, pois a aplicação cliente deve realizar
requisições ao servidor IIS que é executado quando você executa o projeto do serviço. 

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 44/46
13/11/2015 ASP.NET Web API – Parte 2

3 ­ Abra outra instância Visual Studio e localize a aplicação cliente de nome
"WpfCliente.sln" para testar a aplicação. 

Seguindo estes passos você deve rodar o projeto normalmente. 

Obs: Para criar o projeto eu utilizei o Visual Studio 2013 Utimate. 

Um abraço. 

At, 
Madson Aguiar

[há +1 mês] ­ Responder

 
Publicidade

Mais posts
Artigo

Explorando os recursos da plataforma .NET

Artigo

Nancy Framework: Serviços HTTP em .NET

Artigo

Desenvolvimento multiplataforma com Xamarin – Parte 1


http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 45/46
13/11/2015 ASP.NET Web API – Parte 2

Artigo

Integrando aplicações com Web API – Parte 3

Artigo

ASP.NET MVC: Criando um fórum de discussão com


Bootstrap

Artigo

Spring.NET: Como reduzir a abstração em sistemas

Listar mais conteúdo

Anuncie  |  Loja  |  Publique  |  Assine  |  Fale conosco

DevMedia
Curtiu 81 mil curtidas

Você curtiu isso

Hospedagem web por Porta 80 Web Hosting

http://www.devmedia.com.br/asp­net­web­api­parte­2/32626 46/46

You might also like