25

Dato il seguente webapiconfig;Restituisce xml o json da MVC web api in base alla richiesta

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

e questo controllore;

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

Utilizzando l'URL http://localhost/api/Products ottengo una lista dei prodotti in formato XML.

Quello che mi piacerebbe fare è avere la possibilità di restituire json o xml in base alla richiesta. Quindi, per JSON, lo sarebbe;

http://localhost/api/Products.json 

e per XML, sarebbe;

http://localhost/api/Products.xml 

allo stesso modo;

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

È possibile e come ottengo questa funzionalità?

Un'alternativa sarebbe qualcosa di simile;

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

risposta

37

Sì, è possibile ottenere che con AddUriPathExtensionMapping

È possibile creare percorsi in questo modo:

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

allora avete bisogno di estendere i formattatori:

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

fare in modo di aggiungi riferimento a System.Net.Http.Formatting, poiché questi metodi sono metodi di estensione e intel la lisense non le vedrà di default.

Ricordare in questo esempio, è ancora necessario emettere la richiesta con il tipo di contenuto appropriato. Tuttavia, se vuoi che siano disponibili direttamente tramite la barra degli indirizzi del browser, puoi mappare a "text/html".

ho scritto un post sul blog di tutto quello che qualche tempo fa - che dovrebbe essere utile e vi porterà in maggiori dettagli http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue-in-asp-net-web-api/

+0

I percorsi sembrano funzionare, ma la roba estensione non fare nulla. Ho aggiunto questi a global.asax, questo è un problema? – ChrisBint

+5

Chris, usare {ext} invece di {extension}, perché {ext} sembra essere hardcoded per fare riferimento al formattatore mappato. – MCattle

+0

Gran thread. Come ha detto @MCattle, Ricorda sempre: EXT invece di EXTENSION –