webapi_customnames_00

O framework ASP.NET Web API permite a implementação de serviços HTTP capazes de serem consumidos por clientes das mais variadas plataformas (browsers baseados em JavaScript, aplicações mobile ou, até mesmo, sistemas desktop). Atualmente na versão 2.2, o ASP.NET Web API vem sendo utilizado extensivamente para a implementação de serviços baseados na arquitetura REST (sigla do inglês “Representational State Transfer”), adotando ainda um modelo similar àquele empregado em aplicações baseadas no ASP.NET MVC (com serviços sendo declarados como Controllers, ao passo que as operações destes últimos correspondem a

Como é do conhecimento daqueles que estão familiarizados com o desenvolvimento nesta tecnologia, as Actions que fazem parte de um Controller costumam ter seus nomes iniciados por “Get”, “Post”, “Put” e “Delete”. O próprio engine do ASP.NET Web API se encarrega de mapear estes métodos em tempo de execução, a fim de invocar os mesmos para o processamento das requisições HTTP correspondentes (GET, POST, PUT e DELETE, por exemplo).

Contudo, nem sempre será possível em um projeto Web API a adoção de nomes que sigam esta padronização. As razões para isto podem ser as mais diversas, como a existência de regras previamente estabelecidas ou, até mesmo, orientações no sentido de manter a identificação original dos métodos (em se tratando da conversão de uma aplicação legada, por exemplo). Independentemente dos motivos que justifiquem tais cenários, é importante destacar que o framework Web API conta com opções capazes de atender a este tipo de demanda.

Para demonstrar como situações assim podem ser contornadas, será utilizado como exemplo um serviço para consulta às informações de produtos de uma empresa hipotética. Este Web Service conta possui uma operação chamada ListarProdutos, conforme é possível notar na Listagem 1.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using TesteWebAPI.Services.Models;

namespace TesteWebAPI.Services.Controllers
{
    public class ProdutosController : ApiController
    {
        public IEnumerable<Produto> ListarProdutos()
        {
            ...
        }
    }
}

Listagem 1: Exemplo de serviço baseado na tecnologia Web API

Realizando um teste de acesso a este serviço a partir do Google Chrome, um erro como o indicado na Imagem 1 será retornado.

webapi_customnames_01

Na Listagem 2 está uma das soluções possíveis para este problema: a Action ListarProdutos foi marcada com o atributo HttpGetAttribute (namespace System.Web.Http), de forma que este método seja utilizado no processamento de requisições HTTP do tipo GET.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using TesteWebAPI.Services.Models;

namespace TesteWebAPI.Services.Controllers
{
    public class ProdutosController : ApiController
    {
        [HttpGet]
        public IEnumerable<Produto> ListarProdutos()
        {
            ...
        }
    }
}

Listagem 2: Action marcada com HttpGetAttribute

Uma outra alternativa a este primeiro ajuste seria o uso do atributo AcceptVerbsAttribute (namespace System.Web.Http). É o que foi demonstrado na Listagem 3, em que AcceptVerbsAttribute recebe como parâmetro uma string, na qual foram especificadas solicitações do tipo GET. Diferentemente de Actions marcadas com HttpGetAttribute, o uso do atributo AcceptVerbsAttribute possibilita que um método seja capaz de atender a diferentes tipos de solicitações HTTP enviadas a um serviço (bastando para isto informar uma lista de strings como parâmetro, indicando nesta última cada tipo de requisição suportada).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using TesteWebAPI.Services.Models;

namespace TesteWebAPI.Services.Controllers
{
    public class ProdutosController : ApiController
    {
        [AcceptVerbs("GET")]
        public IEnumerable<Produto> ListarProdutos()
        {
            ...
        }
    }
}

Listagem 3: Action marcada com AcceptVerbsAttribute

Encerro com isto mais um post. A intenção desta vez foi apresentar formas alternativas para a definição dos nomes de Actions em serviços Web API.

Espero que o conteúdo aqui apresentado possa ser útil no seu dia-a-dia.

Até uma próxima oportunidade!

Links

AcceptVerbsAttribute Class
http://msdn.microsoft.com/en-us/library/system.web.http.acceptverbsattribute(v=vs.118).aspx

ASP.NET Web API
http://www.asp.net/web-api

HttpGetAttribute Class
http://msdn.microsoft.com/en-us/library/system.web.http.httpgetattribute(v=vs.118).aspx

 

Renato Groffe

Atua como consultor em atividades voltadas ao desenvolvimento de softwares há mais de 13 anos. Bacharel em Sistemas de Informação, com especialização em Engenharia de Software. Microsoft Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.NET, Windows Forms), Microsoft Specialist (HTML5 with JavaScript and CSS3, Developing ASP.NET MVC 4 Web Applications), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD), ITIL Foundation V2, Cobit 4.1 Foundation.

Facebook Google+ 

Comentários

comentarios