5. Representational state transfer (REST)
• REST (representational state transfer) es un estilo de
arquitectura de software para el intercambio de
contenido en ambientes Web
• Fue introducido en el año 2000 por Roy Fielding, uno
de los autores de HTTP
– “Architectural Styles and the Design of Network-based
Software Architectures”
• En general el termino es utilizado para describir
cualquier interfaz simple que sirva para transmitir
información sobre HTTP sin una capa de mensajería
adicional como SOAP, XML-RPC, Session tracking o
HTTP Cookies
15. Características de ASP.NET Web API
• De ASP.NET MVC
• Link generation
• Testability
• IoC integration
• VS template
• Scaffolding
• De WCF Web API
• Server-side query composition
• Create custom help pages
• Self-host
• Tracing
16. Para implementar Web API . . .
• Derivar ApiController
• Implementar las acciones
– Las acciones mapean a métodos HTTP
– Prefijar los nombres de los métodos como el verbo HTTP deseado –
PostComment
– Usar [Get/Post/Put/Delete] si se prefiere un nombre diferente
17. Ruta default en Web API
• routes.MapHttpRoute(
– name: "DefaultApi",
– routeTemplate: "api/{controller}/{id}",
– defaults: new { id = RouteParameter.Optional }
– );
20. Media Types Formatters
• En Web API los Media Types determinan como
se serializan y deserializan el HTTP Body
• Para crear un media formatter se debe derivar
de:
– MediaTypeFormatter: Asincrónico
– BufferedMediaTypeFormatter: Sincrónico
21. Content Negotiation
• HTTP specification (RFC 2616) lo define como
“the process of selecting the best
representation for a given response when
there are multiple representations available.”
• Utilizando
– Accept:
– Accept-Charset
– Accept-Encoding
– Accept-Language
22. Content Negotiation
• El HTTP Dispatcher llama a la implementación de
IContentNegociator
– Este objeto es el encargado de determinar la mejor
representación posible
• Se llama al método Negotiate
– Type del objeto a serializar
– Colección de media formatters
– HTTP Request
• Devuelve el formatter a usar y el media type
– Si no se encuentra ningún formatter valido devuelve
null, y el cliente recibe un error HTTP 406
24. Validation
• La validación se corre en el modelo en cada
Request
– Igual que en ASP.NET MVC
• Los errores de validación se acumulan en el
ModelState
• Se chequean con ModelState.IsValid
• Se pueden utilizar DataAnnotations o lógica
custom de validación
25. OData queries
• Soporte para sintaxis de OData URL query
– $top, $skip, $orderby, $filter
• Se habilita con el atributo [Queryable] y
retornando IQueryable<T> desde la acción
26. Web API Description
• Se puede usar IApiExplorer para obtener una
descripción de las Web API en runtime
• Útil para construir paginas de ayuda, clientes
de test, y herramientas
29. Haciendo llamadas asincrónicas fácilmente
Task<string> Op123Async(string s) {
var tcs = new TaskCompletionSource<string>();
var state = 0;
Action resume = delegate {
switch (state) {
case 0: Task<string> t1 = Op1Async(s);
state = 1; t1.ContinueWith(resume);
break;
case 1: Task<string> t2 = Op2Async(t1.Result);
...}
async Task<string> Op123Async(string s) {
string s1 = await Op1Async(s);
string s2 = await Op2Async(s1);
string s3 = await Op3Async(s2);
return s3;
}
30. Asynchronous Support
• Porque async en el server?
– Porque nos permite usar de manera mas eficiente los recurso del
Server
• Y como funciona?
– Al momento de invocar a un resource remoto, el controller le cede el
control permitiendole reutilizar el thread mientras espera la
respuesta.
– Cuando la llamada remota se completa, el controller es re-
scheduleado para completar su ejecución.
– Menor # de threads corriendo -> aumenta la escalabilidad
• El uso de async en el servicio no se expone a browsers/clientes
– http://myserver.com/products -> la misma URL puede ser
implementada en ASP.NET usando un controller sincrónico o
asincronico.
31. Async tradicional en MVC
public class Products : AsyncController {
public void IndexAsync() {
WebClient wc1 = new WebClient();
AsyncManager.OutstandingOperations.Increment();
wc1.DownloadStringCompleted += (sender, e) => {
AsyncManager.Parameters[“result"] = e.Result;
AsyncManager.OutstandingOperations.Decrement();
};
wc1.DownloadStringAsync(new Uri("http://www.bing.com/"));
}
public ActionResult IndexCompleted(string result) {
return View();
}
}
32. Async en MVC con .NET 4.5
public class Products : Controller {
public async Task<ActionResult> IndexAsync() {
WebClient web = new WebClient();
string result = await web.DownloadStringTaskAsync("www.bing.com/");
return View();
}
}