tutorial example ejemplo consume apicontroller c# asp.net-mvc asp.net-web-api asp.net-mvc-routing wcf-web-api

c# - example - Devuelve xml o json desde la API web de MVC según solicitud



web api rest c# (1)

Dado el siguiente webapiconfig;

config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );

y este controlador;

public class ProductsController : ApiController { Product[] _products = new Product[] { new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } }; public IEnumerable<Product> GetAllProducts() { return _products; } }

Utilizando la URL http://localhost/api/Products obtengo una lista de productos en formato XML.

Lo que me gustaría hacer es tener la opción de devolver json o xml en función de la solicitud. Entonces para json, sería;

http://localhost/api/Products.json

y para XML, sería;

http://localhost/api/Products.xml

igualmente;

http://localhost/api/Products.json/1/ http://localhost/api/Products.xml/1/

¿Es esto posible y cómo podría lograr esta funcionalidad?

Una alternativa sería algo así como;

http://localhost/api/json/Products/


Sí, puedes lograr eso con AddUriPathExtensionMapping

Puedes crear rutas como esta:

routes.MapHttpRoute( name: "Api UriPathExtension", routeTemplate: "api/{controller}.{extension}/{id}", defaults: new { id = RouteParameter.Optional, extension = RouteParameter.Optional } ); routes.MapHttpRoute( name: "Api UriPathExtension ID", routeTemplate: "api/{controller}/{id}.{extension}", defaults: new { id = RouteParameter.Optional, extension = RouteParameter.Optional } );

Entonces necesitas extender los formateadores:

config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json"); config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "text/xml");

Asegúrese de agregar una referencia a System.Net.Http.Formatting , ya que estos métodos son métodos de extensión e intellisense no los verá de forma predeterminada.

Recuerde que en este ejemplo, aún debe emitir la solicitud con el tipo de contenido apropiado. Sin embargo, si desea tener estos directamente disponibles a través de la barra de direcciones del navegador puede mapear a "text / html".

Escribí una publicación en un blog sobre todo lo que hace un tiempo, que debería ser útil y darle más detalles. http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue-in-asp-net-web-api/