25

次のwebapiconfigが指定されています。リクエストに基づいてMVC Web APIからxmlまたはjsonを返します

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

とこのコントローラ。

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

URL http://localhost/api/Productsを使用して、XML形式の製品リストを取得します。

私がしたいのは、リクエストに基づいてjsonまたはxmlを返すオプションがあることです。だから、jsonの場合、それはそうだろう。

http://localhost/api/Products.json 

とXMLの場合は、次のようになります。

http://localhost/api/Products.xml 

同様に;

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

これは可能ですか?この機能はどのように達成できますか?

代替手段は次のようなものです。

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

答えて

37

はいあなたはAddUriPathExtensionMapping

であなたは、このようなルートを作成できることを達成することができます:

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

次にあなたがフォーマッタを拡張する必要があります。

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

はするようにしてくださいSystem.Net.Http.Formattingへの参照を追加してください。これらのメソッドは拡張メソッドであり、intel lisenseはデフォルトでそれらを見ません。

この例では、依然として適切なコンテンツタイプの要求を発行する必要があります。ただし、ブラウザのアドレスバーから直接利用できるようにしたい場合は、 "text/html"にマップすることができます。

私はしばらく前にすべてについてのブログ記事を書いた - 役に立つと詳細http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue-in-asp-net-web-api/

+0

にルートをあなたを取るべきでは動作するようですが、拡張子のものは何もしません。私はこれらをglobal.asaxに追加しました。これは問題ですか? – ChrisBint

+5

クリスは、{ext}がマップされたフォーマッタを参照するようにハードコードされているように見えるので、{extension}の代わりに{ext}を使用します。 – MCattle

+0

すばらしいスレッド。 @MCattleと同様、EXTENSION –

関連する問題