[json] Chrome을 사용하여 XML 대신 JSON을 반환하도록 ASP.NET 웹 API를 얻으려면 어떻게해야합니까?

Chrome 에서 최신 ASP.NET 웹 API를 사용하여 XML 을 볼 수 있습니다. 브라우저에서 볼 수 있도록 JSON 을 요청 하도록 XML을 어떻게 변경할 수 있습니까? 요청 헤더의 일부일 뿐이라고 생각합니다. 맞습니까?



답변

App_Start / WebApiConfig.csMVC 웹 API 프로젝트 에서 클래스에 다음을 추가합니다 .

config.Formatters.JsonFormatter.SupportedMediaTypes
    .Add(new MediaTypeHeaderValue("text/html") );

따라서 대부분의 쿼리에서 JSON을 얻을 수 있지만 XML을 보낼 때 얻을 수 있습니다 text/xml.

당신이 반응을해야하는 경우 Content-Typeapplication/json확인하시기 바랍니다 아래 토드의 답변을 .

NameSpace사용하고 System.Net.Http.Headers있습니다.


답변

이 작업을 수행하면 WebApiConfig기본적으로 JSON이 제공되지만 text/xml요청 Accept헤더 로 전달하면 여전히 XML을 반환 할 수 있습니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

MVC 프로젝트 유형을 사용하지 않아서이 클래스가 시작되지 않은 경우이를 통합하는 방법에 대한 자세한 내용 은이 답변 을 참조하십시오.


답변

RequestHeaderMapping을 사용 Content-Type = application/json하면 응답 헤더를 설정하기 때문에 Firefox (JSONView 추가 기능이있는)에서 응답을 JSON으로 형식화 할 수 있습니다.

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings
.Add(new System.Net.Http.Formatting.RequestHeaderMapping("Accept", 
                              "text/html",
                              StringComparison.InvariantCultureIgnoreCase,
                              true, 
                              "application/json"));


답변

나는 Felipe Leusin의 접근 방식이 가장 좋습니다. 실제로 XML을 원하는 클라이언트의 컨텐츠 협상을 방해하지 않고 브라우저가 JSON을 얻도록하십시오. 나를 위해 유일하게 누락 된 부분은 응답 헤더에 여전히 content-type : text / html이 포함되어 있다는 것입니다. 왜 문제가 되었습니까? 콘텐츠 형식을 검사 하는 JSON 형식 기 Chrome 확장 프로그램을 사용하고 있기 때문에 익숙한 서식을 얻지 못합니다. 텍스트 / HTML 요청을 수락하고 application / json 응답을 반환하는 간단한 사용자 정의 포맷터로 수정했습니다.

public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
    public BrowserJsonFormatter() {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        this.SerializerSettings.Formatting = Formatting.Indented;
    }

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
}

다음과 같이 등록하십시오 :

config.Formatters.Add(new BrowserJsonFormatter());


답변

MVC4 빠른 팁 # 3 – ASP.Net 웹 API에서 XML 포맷터 제거

에서하는 Global.asax줄을 추가 :

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

이렇게 :

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
    GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}


답변

에서 WebApiConfig.cs ,의 끝에 추가 등록 기능 :

// Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);

소스 .


답변

에서 Global.asax에 나는 아래의 코드를 사용하고 있습니다. JSON을 얻는 내 URI는http://www.digantakumar.com/api/values?json=true

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new  QueryStringMapping("json", "true", "application/json"));
}