25

다음 webapiconfig가 제공됩니다.요청에 따라 MVC 웹 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

와 함께 당신은 다음과 같은 경로를 만들 수 있습니다 얻을 수 있습니다

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

가 있는지 확인

:

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

그런 다음 당신이 포매터를 확장해야 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}가 매핑 된 포맷터를 참조하기 위해 하드 코딩 된 것으로 보이는 경우 Chris는 {extension} 대신 {ext}를 사용합니다. – MCattle

+0

위대한 스레드. @MCattle이 말한 것처럼 항상 기억하십시오 : EXTENSION –

관련 문제