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;
        }
    }

El uso de la dirección URL http://localhost/api/Products puedo obtener una lista de productos en formato XML.

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

http://localhost/api/Products.json

y para XML, sería;

http://localhost/api/Products.xml

mismo;

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

Es posible esto y cómo puedo conseguir esta funcionalidad?

Una alternativa sería algo así como;

http://localhost/api/json/Products/
InformationsquelleAutor ChrisBint | 2012-10-24

1 Comentario

  1. 38

    Sí, usted puede lograr que 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 usted necesita para ampliar los formateadores:

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

    Asegúrese de agregar la referencia a System.Net.Http.Formatting, ya que estos métodos son métodos de extensión y intellisense no se los ve por defecto.

    Recordar en este ejemplo, usted todavía tiene que emitir el pedido con el correspondiente tipo de contenido. Sin embargo, si usted quiere tener estas disponible directamente a través de la barra de direcciones del navegador puede asignar a «text/html».

    Escribí un post en el blog acerca de todo lo que hace un tiempo – que debe ser útil y de tomar en más detalles http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue-in-asp-net-web-api/

    • Las rutas parecen funcionar, pero la extensión de cosas que no hacer nada. He añadido estas global.asax, es esto un problema?
    • Chris, el uso de {ext} en lugar de {extensión} porque {ext} parece ser codificado para referirse a la asignada formateador.
    • Gran hilo. Como @MCattle dijo, recuerde Siempre: EXT lugar de EXTENSIÓN
    • es posible lograr esto con la toma de otro parámetro como format=xml o format=json
    • cómo utilizar este para aceptar ambos formatos(xml y json) para la solicitud?

Dejar respuesta

Please enter your comment!
Please enter your name here