ASP Net Web API Parte 2
ASP Net Web API Parte 2
NET Web API – Parte 2
Buscar
.net Magazine 122 Índice
0 0 Curtir 0
Gostei (1) (0)
Demais posts desta série:
ASP.NET Web API – Parte 1
http://www.devmedia.com.br/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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.
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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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.
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/aspnetwebapiparte2/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/aspnetwebapiparte2/32626 11/46
13/11/2015 ASP.NET Web API – Parte 2
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/aspnetwebapiparte2/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/aspnetwebapiparte2/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.
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/aspnetwebapiparte2/32626 14/46
13/11/2015 ASP.NET Web API – Parte 2
Lembrese 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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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.
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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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>
A Web API é totalmente flexível quanto ao formato de dados a ser trocado entre
requisições e respostas do cliente ao servidor e viceversa 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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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.
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 nomeandoo 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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/32626 30/46
13/11/2015 ASP.NET Web API – Parte 2
apresentado na Figura 12.
Figura 12. Tela cadastro 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/aspnetwebapiparte2/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/aspnetwebapiparte2/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/aspnetwebapiparte2/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.
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/aspnetwebapiparte2/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.
A implementação referente ao update de cadastro de fornecedor encontrase 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/aspnetwebapiparte2/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 }
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/aspnetwebapiparte2/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.
http://www.devmedia.com.br/aspnetwebapiparte2/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/aspnetwebapiparte2/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 tornase 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/aspnetwebapiparte2/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/ptbr/library/hh833994(v=vs.108).aspx
Madson Aguiar Rodrigues
Formação acadêmica em Análise e Desenvolvimento de Sistemas pela UNOPAR, pósgraduaçã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/aspnetwebapiparte2/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="contentwrapper">
<div class="floatleft">
<h1>@ViewBag.Title</h1>
</div>
</div>
</header>
<div id="body">
<section class="featured">
<div class="contentwrapper">
<h2>Introduction</h2>
<p>
Provide a general description of your APIs here.
</p>
</div>
</section>
<section class="contentwrapper maincontent clearfix">
@foreach (var group in apiGroups)
{
http://www.devmedia.com.br/aspnetwebapiparte2/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 ISO2 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
ISO2 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/aspnetwebapiparte2/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 ISO2 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/aspnetwebapiparte2/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
Artigo
Artigo
Artigo
Artigo
Artigo
DevMedia
Curtiu 81 mil curtidas
Você curtiu isso
Hospedagem web por Porta 80 Web Hosting
http://www.devmedia.com.br/aspnetwebapiparte2/32626 46/46