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