web-dev-qa-db-ja.com

リクエストに基づいてMVC Web APIからxmlまたはjsonを返します

次のwebapiconfigがあるとします。

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/
26
ChrisBint

はい、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、これらのメソッドは拡張メソッドであり、インテリセンスはデフォルトではそれらを認識しません。

この例では、適切なcontent-typeを使用してリクエストを発行する必要があることを忘れないでください。ただし、ブラウザのアドレスバーから直接利用できるようにする場合は、「text/html」にマッピングできます。

私はしばらく前にブログ記事を書きました-これは役に立つでしょう、そしてあなたをより詳細に説明するでしょう http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue- in-asp-net-web-api /

38
Filip W