27ª Reunião Lisboa - 24/03/2012 http://netponto.org Uma Introdução à ASP.NET Web API Pedro Félix
Patrocinador "GOLD"
Pedro Félix Professor no ISEL e membro do CCISEL Docente no PROMPT - http://prompt.cc.isel.ipl.pt/ Programa Avançado em Métodos de Programação e Tecnologia Consultor independente Rupeal SAPO – Service Delivery Broker Membro do Web API Advisory Board
Sumário • Enquadramento e objectivos • Modelo de programação • Arquitectura de processamento • Extensibilidade
ASP.NET Web API • Application Programming Interfaces • Expostas na Web • Usando o HTTP como protocolo aplicacional • Accessíveis por variados tipos de cliente – E.g. dispositivos móveis
ASP.NET Web API Fonte: http://blog.programmableweb.com/2012/02/06/5000-apis-facebook-google-and-twitter-are-changing-the-web/
ASP.NET Web API Fonte: http://www.hanselman.com/blog/VisualStudio11BetaInContext.aspx
ASP.NET Web API: Evolução • 2010 – WCF Web API - Extensão ao WCF – Preview 6 – Modelo de classes para o HTTP • Feveiro de 2012 – ASP.NET Web Api Beta – Modelo baseado em controladores – Modelo de classes para o HTTP – Próximos milestones: RC, RTM
Bases arquitecturais da Web • Identificação – URI http://netponto.org/reuniao/27a-reuniao-presencial-da-comunidade-netponto-em-lisboa/ • Interacção – HTTP, ... • Representações e formatos – text/html, application/xml, application/json, imag e/png, audio/mpeg, application/atom+xml, …
Modelo de Programação
Distribuição - pacotes NuGet
Dependências System.Json System.Net.Http.* System.Web.Http.*
Modelo de programação HttpConfiguration e HttpRoute var config = new HttpSelfHostConfiguration("http://localhost:8080"); config.Routes.MapHttpRoute( "default", "{controller}/{id}", new {controller = "home", id = RouteParameter.Optional}); HttpServer, HttpSelfHostServer, ... var server = new HttpSelfHostServer(config); server.OpenAsync().Wait();
Modelo de programação ApiController e actions public class HomeController : ApiController { public HttpResponseMessage Get() { ... } }
Modelo de programação • Controller representa uma família de recursos • Actions estão associadas a métodos HTTP – Get() - GET sobre /resource – Get(int id) - GET sobre /resource/123 – Post(...) - POST sobre /resource/ • No MVC, as actions estão associadas a subconjuntos de recursos – Detail(int id) – GET sobre /resource/detail/123 – Delete(int id) – POST sobre /resource/delete/123
Modelo de programação ApiController public abstract class ApiController : IHttpController, IDisposable { public HttpConfiguration Configuration { get; set; } public HttpRequestMessage Request { get; set; } public UrlHelper Url { get; } ... } public interface IHttpController { Task<HttpResponseMessage> ExecuteAsync( HttpControllerContext controllerContext, CancellationToken cancellationToken); }
Modelo de programação HttpRequestMessage e HttpResponseMessage var userAgent = Request.Headers.UserAgent.Count != 0 ? Request.Headers.UserAgent.First().Product.Name : "stranger"; return new HttpResponseMessage() { Content = new StringContent("Hello there, "+userAgent) };
Modelo de programação • HttpConfiguration – HttpRouteCollection • HttpServer – HttpSelfHostServer, ... • ApiController – Acções associadas a métodos HTTP (GET, POST, PUT, DELETE, ...) • HttpRequestMessage e HttpResponseMessage
HTTP: modelo de classes
Handler: Request  Response
Handler Pipeline HttpRequestMessage InnerHander DelegatingHandler HttpMessageHandler HttpResponseMessage
Handler Pipeline Handler Handler Handler Handler
HttpClient Código-fonte disponível em: https://github.com/pmhsfelix/presentation-netponto-webapi
HttpClient
HttpClient e handlers
HttpClient e handlers InnerHander DelegatingHandler HttpClient HttpClientHandler (e.g. Caching)
Arquitectura de processamento
Web/ASP.NET Hosting
ASP.NET Web Hosting Código-fonte disponível em: https://github.com/pmhsfelix/presentation-netponto-webapi
Self-hosting
Memory hosting var config = new HttpConfiguration(); config.Routes.MapHttpRoute( "default", "{controller}/{id}", new { controller = "home", id = RouteParameter.Optional }); var server = new HttpServer(config); var client = new HttpClient(server); var resp = client .GetAsync("http://does.not.matter/hello") .Result;
Media type formatting media-type CLR Type Stream
Media Type Formatter Código-fonte disponível em: https://github.com/pmhsfelix/presentation-netponto-webapi
Arquitectura de processamento
Handler Pipeline Handler Handler Handler Handler
Message Handler Código-fonte disponível em: https://github.com/pmhsfelix/presentation-netponto-webapi
Arquitectura de processamento
Controller Factory Código-fonte disponível em: https://github.com/pmhsfelix/presentation-netponto-webapi
Filtros
WCF e ASP.NET Web API • WCF – Baseado nos modelos do SOAP e do WSDL – Independência do transporte – HTTP é uma opção – HTTP é apenas uma opção de transporte • ASP.NET Web API programming model – Baseado no modelo da Web (URIs, HTTP, formatos) – HTTP usado como protocolo aplicacional
MVC e Web API • MVC – Ênfase na produção de HTML – Modelo antigo de classes para o HTTP – HttpContext – Actions • Web API – Independência do formato – Novo modelo de classes para o HTTP – Métodos HTTP (GET, POST, PUT, ...) • Não existe razão para a diferença!
Notas finais • Relevância actual das Web API • HTTP como protocolo aplicacional • Múltiplos formatos – HTML é apenas mais um • Modelo de classes para o HTTP no .NET 4.5 – Cliente e servidor – Pedidos e respostas, handling, formatters • Modelo no servidor baseado em controllers
E o ReST? Representational State Transfer
Referências Pedro Félix’s shared memory – http://pfelix.wordpress.com/ Código fonte – https://github.com/pmhsfelix/presentation-netponto-webapi – https://github.com/pmhsfelix/WebApi.Explorations.ServiceBusRelayHost GitHub WebApiContrib – https://github.com/webapicontrib Getting Started with ASP.NET Web API – http://www.asp.net/web-api
Questões?
Próximas reuniões presenciais • 24/03/2012 – Março • 14/04/2012 – Abril (Porto) • 21/04/2012 – Abril • 26/05/2012 – Maio Reserva estes dias na agenda! :)
Patrocinador "GOLD"
Obrigado! Pedro Félix pmhsfelix@gmail.com http://pfelix.wordpress.com http://twitter.com/pmhsfelix http://github.com/pmhsfelix http://prompt.cc.isel.ipl.pt/

Uma Introdução a ASP.NET Web API