---
# System prepended metadata

title: Criando WEBAPI

---

# Criando WEBAPI 

Abra o **Visual Studio** e clique em New Project;

Selecione a linguagem Visual C# ->ASP .NET Web Application;

Informe o nome WebApi2_Produtos e clique no botão OK;



A seguir selecione o template Web API, sem autenticação nem hospedagem na nuvem e clique em OK;


## Definindo o modelo de domínio e o Repositório de Produtos na pasta Models

Vamos definir o nosso modelo de domínio representando pela classe Produtos e a seguir criar um repositório de produtos.
 
A criação de um repositório em nosso projeto nos ajudará a centralizar a lógica de acesso aos dados e também vai desacoplar a nossa aplicação da fonte de dados ou ferramenta ORM que porventura venhamos a utilizar.

Vamos criar na pasta Models a classe *Produto.cs* que será nosso modelo de domínio.

Clique com o botão direito sobre a pasta Models e a seguir em Add Class. 

Informe o nome Produto.cs e inclua o seguinte código nesta classe:

```
 public class Produto
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public string Categoria { get; set; }
        public decimal Preco { get; set; }
    }
```
A seguir inclua uma interface chamada IProdutoRepositorio.cs na mesma pasta com o seguinte código:

 ```
public interface IProdutoRepositorio
 {
        IEnumerable<Produto> GetAll();
        Produto Get(int id);
        Produto Add(Produto item);
        void Remove(int id);
        bool Update(Produto item);
 }
```
Na interface definimos os métodos que deverá ser implementados.

Agora vamos criar a classe ProdutoRepositorio.cs na mesma pasta que vai implementar essa interface.

```
using System;
using System.Collections.Generic;
namespace WebApi2_Produtos.Models
{
    public class ProdutoRepositorio : IProdutoRepositorio
    {
        private List<Produto> produtos = new List<Produto>();
        private int _nextId = 1;

        public ProdutoRepositorio()
        {
            Add(new Produto { Nome = "Guaraná Antartica", Categoria = "Refrigerantes", Preco = 4.59M });
            Add(new Produto { Nome = "Suco de Laranja Prats", Categoria = "Sucos", Preco = 5.75M });
            Add(new Produto { Nome = "Mostarda Hammer", Categoria = "Condimentos", Preco = 3.90M });
            Add(new Produto { Nome = "Molho de Tomate Cepera", Categoria = "Condimentos", Preco = 2.99M });
            Add(new Produto { Nome = "Suco de Uva Aurora", Categoria = "Sucos", Preco = 6.50M });
            Add(new Produto { Nome = "Pepsi-Cola", Categoria = "Refrigerantes", Preco = 4.25M });
        }

        public Produto Add(Produto item)
        {
            if(item == null)
            {
                throw new ArgumentNullException("item");
            }
            item.Id = _nextId++;
            produtos.Add(item);
            return item;
        }

        public Produto Get(int id)
        {
            return produtos.Find(p => p.Id == id);
        }

        public IEnumerable<Produto> GetAll()
        {
            return produtos;
        }

        public void Remove(int id)
        {
            produtos.RemoveAll(p => p.Id == id);
        }

        public bool Update(Produto item)
        {
            if( item == null)
            {
                throw new ArgumentNullException("item");
            }

            int index = produtos.FindIndex(p => p.Id == item.Id);

            if(index == -1)
            {
                return false;
            }
            produtos.RemoveAt(index);
            produtos.Add(item);
            return true;
        }
    }
}
```

## Definindo a nossa Web API

Nesta classe implementamos uma lista de produtos em memória incluindo alguns produtos e definimos os métodos para obter produtos, atualizar, remover e atualizar os produtos.

Definindo a nossa Web API ProdutosController na pasta Controllers

Uma Web API fornece toda infraestrutura para o desenvolvimento dos serviços, faz a escolha do método a ser executado, converte as mensagens em parâmetros e os tipos adequados, aplica filtros, etc.

Cada requisição por padrão terá como alvo um método dentro desta classe que processa e retorna o resultado.

Clique na pasta Controllers com o botão direito do mouse e a seguir em Add -> Controller;

Selecione o Scaffold : Web API 2 Controller Empty e clique no botão Add;



Digite o nome ProdutosController e clique no botão Add;



A seguir inclua o código abaixo neste controlador:

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebApi2_Produtos.Models;
namespace WebApi2_Produtos.Controllers
{
    public class ProdutosController : ApiController
    {
        static readonly IProdutoRepositorio repositorio = new ProdutoRepositorio();
        public IEnumerable<Produto> GetAllProdutos()
        {
            return repositorio.GetAll();
        }
        public Produto GetProduto(int id)
        {
            Produto item = repositorio.Get(id);
            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return item;
        }
        public IEnumerable<Produto> GetProdutosPorCategoria(string categoria)
        {
            return repositorio.GetAll().Where(
                p => string.Equals(p.Categoria, categoria, StringComparison.OrdinalIgnoreCase));
        }
        public HttpResponseMessage PostProduto(Produto item)
        {
            item = repositorio.Add(item);
            var response = Request.CreateResponse<Produto>(HttpStatusCode.Created, item);
            string uri = Url.Link("DefaultApi", new { id = item.Id });
            response.Headers.Location = new Uri(uri);
            return response;
        }
        public void PutProduto(int id, Produto produto)
        {
            produto.Id = id;
            if (!repositorio.Update(produto))
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
        }
        public void DeleteProduto(int id)
        {
            Produto item = repositorio.Get(id);
            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            repositorio.Remove(id);
        }
    }
}
```
Neste código estamos usando o nosso repositório definido pela classe ProdutoRepositorio para implementar a nossa Web API 2 expondo os seguintes serviços:

* GetAllProdutos - retorna todos os produtos;
* GetProduto - retorna um produto;
* GetProdutosPorCategoria - retorna os produtos por categoria;
* PostProduto - inclui um novo produto;
* PutProduto - altera um produto;
* DeleteProduto - exclui um produto;

Observe que os nomes dos métodos do controlador ProdutosController iniciam com o nome dos verbos HTTP (GET, POST, PUT e DELETE) isso ajuda a ASP .NET a mapear a requisição do cliente para os métodos do controller (convenção).

Feito isso já podemos testar o nosso serviço REST exposto pela Web API.  Lembrando que o roteamento padrão definido no arquivo WebApiConfig da pasta App_Start (mostrado abaixo) indica a rota padrão definida em routeTemplate como :

a literal : api (este literal é usado para evitar conflitos com o mapeamento MVC)
o nome do controlador : produtos
e o id (opcional)
```
 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Web API routes
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            var formatters = GlobalConfiguration.Configuration.Formatters;
            formatters.Remove(formatters.XmlFormatter);
        }
    }
```
O código esta indicado para forçar o envio da resposta no formato JSON.

## Testando

Executando projeto iremos obter exibição da página da aplicação MVC na URL : localhost:53557/

1- Digitando : api/produtos , obtemos todos os produtos:


2- Digitando : api/produtos/4 , obtemos o produto com id igual a 4:

# Consumindo API

Abrir o Visual Studio e criar um projeto MVC.

Iremos consumir a Api criada anteriormente. 

No exemplo acima o endereço é:

http://localhost:63014/api/produtos

E o Help está em:
http://localhost:63014/Help/Api/GET-api-Produtos

## Modelo
Vamos criar na pasta Models a classe *Produto.cs* que será nosso modelo de domínio.

Clique com o botão direito sobre a pasta Models e a seguir em Add Class. 

Informe o nome Produto.cs e inclua o seguinte código nesta classe:

```
 public class Produto
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public string Categoria { get; set; }
        public decimal Preco { get; set; }
    }
```

## Criando o controlador

Criando o controlador ProdutosServicoController

Vamos agora criar o controlador ContatosController onde vamos definir os métodos Action para consumir a Web API.

Clique com o botão direito do mouse sobre a pasta Controllers e selecione a opção Add Controller;

Na janela Add Scaffold escolha a opção MVC 5 Controller - Empty - e clique em Add;

Informe o nome ContatosController e clique em Add.

## Consumindo

Vamos consumir o método GET da WEB API, que permite exibir dados dos produtos, iniciando com o método que exibe todos.

Para isso vamos criar o método Action Index

 ```
public ActionResult Index()
        {
            IEnumerable<Produto> produtos = null;

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:63014/api/");

                //HTTP GET
                var responseTask = client.GetAsync("produtos");
                responseTask.Wait();
                var result = responseTask.Result;

                if (result.IsSuccessStatusCode)
                {
                    var readTask = result.Content.ReadAsAsync<IList<Produto>>();
                    readTask.Wait();
                    produtos = readTask.Result;
                }
                else
                {
                    produtos = Enumerable.Empty<Produto>();
                    ModelState.AddModelError(string.Empty, "Erro no servidor. Contate o Administrador.");
                }
                return View(produtos);
            }
        }
```
Para poder exibir o resultado temos que criar uma view *Index.cshtml*. 
Para isso clique com o botão direito sobre o método Index e selecione Add View, informe o nome Index e o Model List e defina a classe de modelo como Produtos e clique em Adicionar.

## Testando

Antes de executar o projeto vamos ajustar o arquivo _Layoutcshtml e a view Index da pasta /Views/Home.

No primeiro vamos criar um link no arquivo _Layout.cshtml para acessar o controlador Contatos :


```
 <div class="navbar-collapse collapse">
  <ul class="nav navbar-nav">
      <li>@Html.ActionLink("Home", "Index", "Home")</li>
           <li>@Html.ActionLink("Lista de Produtos", "Index", "ProdutosServico")</li>
</ul>
</div>
```





