web-dev-qa-db-fra.com

Renvoyer xml ou json depuis l'API Web MVC en fonction de la demande

Étant donné le webapiconfig suivant;

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

et ce contrôleur;

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

Utilisation de l'URL http://localhost/api/Products Je reçois une liste de produits au format XML.

Ce que je voudrais faire, c'est avoir la possibilité de renvoyer json ou xml en fonction de la demande. Donc pour json, ce serait;

http://localhost/api/Products.json

et pour XML, ce serait;

http://localhost/api/Products.xml

également;

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

Est-ce possible et comment pourrais-je atteindre cette fonctionnalité?

Une alternative serait quelque chose comme;

http://localhost/api/json/Products/
26
ChrisBint

Oui, vous pouvez y arriver avec AddUriPathExtensionMapping

Vous pouvez créer des itinéraires comme celui-ci:

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

Ensuite, vous devez étendre les formateurs:

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

MAssurez-vous d'ajouter une référence à System.Net.Http.Formatting, car ces méthodes sont des méthodes d'extension et intellisense ne les verra pas par défaut.

N'oubliez pas que dans cet exemple, vous devez toujours émettre la demande avec le type de contenu approprié. Cependant, si vous souhaitez les avoir directement disponibles via la barre d'adresse du navigateur, vous pouvez mapper sur "text/html".

J'ai écrit un article sur tout cela il y a quelque temps - ce qui devrait être utile et vous apporter plus de détails http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue- in-asp-net-web-api /

38
Filip W