Programando com ASP.NET Web API TDC 2012 – .NET
May 24, 2015
O que é uma API Web?
Um serviço HTTP
Desenhado para amplo consumo
Usa HTTP como protocolo de aplicação, não como protocolo de transporte
GET /en/html/dummy.php?name=MyName&married=not+single &male=yes HTTP/1.1Host: www.explainth.atUser-Agent: Mozilla/5.0 (Windows;en-GB; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5Accept-Language: en-gb,en;q=0.5Accept-Encoding: gzip,deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-aliveReferer: http://www.explainth.at/en/misc/httpreq.shtml
Por que criar APIs Web?• Adotar completamente o HTTP
Requisitos para criar uma API Web
Modelo de programação HTTP de primeira-classe
Mapear facilmente recursos para URIs e implementar a interface
Suporte rico para formatos e negociação de conteúdo
Separação de responsabilidades transversais
Leve, testável, escalável
Recursos do ASP.NET Web APIDo ASP.NET MVC• ASP.NET Routing• Model binding• Validation• Filters• Link generation• Testability• IoC integration• VS template• Scaffolding
Do WCF Web API• Modern HTTP programming model• HttpClient• Task-based async• Formatting, content negotiation• Server-side query composition• Create custom help pages• Self-host• Tracing
Para implementar uma API Web• Derivar de ApiController• Implementar suas ações (Actions)– Actions são mapeadas para métodos HTTP– Prefixar nomes dos métodos com o método HTTP
desejado; ex.: PostComment– Usar atributos [HttpGet/Post/Put/Delete] se você
preferir um nome diferente
Routing• Mapeia um espaço de URI para seus
ApiControllers– Ex.: api/{controller}/{id}– {controller} + “Controller” = nome da classe
ApiController
• Pode ser ajustado usando valores default e restrições de rota
Rota Web API padrãoroutes.MapHttpRoute(
name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });
Parâmetros de ação• Tipos de dados simples vêm do URI
– Dados da rota, parâmetros da query string
• Tipos complexos vêm do corpo da requisição– Os MediaTypeFormatters configurados são usados para
deserializar o corpo da requisição baseados no content type– JSON, XML e form-url-encoded suportados nativamente
• Pode ser alterado com atributos [FromUrl], [FromBody], [ModelBinder] (custom parameter binding)
Validação• Validação é executada sobre os dados de
cada requisição• Erros de validação são acumulados no
ModelState• Verifique o valor de ModelState.IsValid• Usa DataAnnotations ou lógica
personalizada de validação
Filtros• Filtros cuidam das responsabilidades transversais• Tipos de filtro:
– Filtros de ação rodam antes e depois de invocar uma ação– Filtros de autorização rodam antes do Model Binding e
servem para verificar as permissões (autorizar) o usuário– Filtros de exceção permitem gerar respostas de erro de
maneira centralizada
• Filtros podem ser configurados globalmente, por controlador ou por ação, usando atributos
HTTP DispatcherInvoke Action
Action filters
Model Bind
Select action Exception filters
Route to controller Formatting
Request Response
Authorization filters
Descrição de uma API Web• Use o serviço IApiExplorer para gerar uma
descrição em tempo de execução da sua API• Útil para criar páginas de
ajuda/documentação, clientes de teste e outras ferramentas
IApiExplorerIApiExplorer apiExplorer =
config.Services.GetApiExplorer();
public interface IApiExplorer{
Collection<ApiDescription> ApiDescriptions { get; }
}
Negociação de Conteúdo• Formato da resposta é definido baseado na Negociação de
Conteúdo HTTP• Cabeçalho HTTP “Accept” na requisição indica o formato desejado• Servidor excolhe um formato para a resposta baseado em:
– Cabeçalhos da requisição– Tipo de dados de retorno– MediaTypeFormatters configurados
• JSON e XML suportados nativamente• Pode ser personalizado (ex.: RSS/Atom)
– Diferente do ASP.NET MVC, não é view. MediaTypeFormatter personalizado
Negociação de Conteúdo// Get the IContentNegotiator
IContentNegotiator negotiator = Configuration.Services.GetContentNegotiator();
// Run content negotiation to select a formatter
MediaTypeHeaderValue mediaType;
MediaTypeFormatter formatter = negotiator.Negotiate(
typeof(Contact), Request, Configuration.Formatters, out mediaType);
// Create a response message with an object content using the selected formatter
HttpResponseMessage response = new HttpResponseMessage()
{
Content = new ObjectContent<Contact>(contact, formatter),
RequestMessage = Request
};
• Duas opções de hospedagem– ASP.NET Web Application (IIS)– Self-hosting (ex. Console app, Windows
Service, Azure Worker Role etc.)
• HttpConfiguration é o denominador comum
• Hospedagem em memória para testes fim-a-fim
• Tem um adaptador OWIN para hospedar em qualquer web server compatível com OWIN
Hospedagem
Como eu começo?• ASP.NET Web API vem com o ASP.NET MVC 4• Suportado no .NET 4• Já vem nativamente no Visual Studio 2012• Release Candidate disponível via– Web Platform Installer– NuGet– Visual Studio 2012 RC
ConclusãoASP.NET Web API no MVC 4 simplifica a criação de serviços HTTP que podem atender diversos clientes
ASP.NET Web API é a plataforma .NET ideal para a criação de serviços RESTful
“Brinque” com o ASP.NET MVC 4 Release Candidate
Acompanhe e participe da evolução do projeto no CodePlex