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


1220

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


8
여기에 JSON 만 기본 동작으로 되 돌리는 것에 대한 토론이 있습니다. github.com/aspnet/Mvc/issues/1765
Natan

답변:


1737

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있습니다.


115
이것은 놀랍게도 간과 된 대답이며, 원래의 질문이 완전히 명확하지는 않았지만 이는 JSON을 웹 브라우저에 대한 기본 응답 (직접 수락 : 텍스트 / html)으로 직접 만듭니다. 잘 했어.
gregmac

16
최고의 답변 +1. 브라우저에 JSON이 표시되지 않기 때문에 XML을 완전히 제거하기로 결정한 수많은 ppl이 있다고 생각합니다.
데릭 훈 지커

3
이 작업을 수행 할 때 HTML 중단 태그가있는 타사에서 제공 한 데이터가 캐리지 리턴으로 끝나는 것을 알았습니다. 그런 다음 JSON이 유효하지 않습니다. 이것이 당신에게 영향을 미치는 경우 허용 된 답변을 사용하는 것이 좋습니다.
Stonetip

23
응답의 Content-Type헤더는 여전히입니다 text/html.
Mr.

78
이것은 끔찍하다. 응답 컨텐츠 유형 헤더는 application / json이어야합니다. 이 "솔루션"은 텍스트 / html로 만듭니다.
meffect

501

이 작업을 수행하면 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 프로젝트 유형을 사용하지 않아서이 클래스가 시작되지 않은 경우이를 통합하는 방법에 대한 자세한 내용 은이 답변 을 참조하십시오.


51
참고로, 원래의 행동은 정확합니다. Chrome application/xml은 우선 순위가 0.9이고 */*우선 순위가 0.8 인 요청입니다. 제거함으로써 application/xml당신은 반환 XML로 클라이언트 요청하는 경우 그 구체적를 웹 API의 기능을 제거합니다. 예를 들어 "Accept : application / xml"을 보내면 여전히 JSON을받습니다.
porges

11
나인가요, 아니면 첫 문장이 틀렸습니까? 코드는 단순히 기본값을 변경하는 것이 아니라 XML을 완전히 제거하는 것으로 보입니다.
NickG

6
@NickG : 여기서 간과되고 IMHO가 훨씬 더 나은 옵션 (응용 프로그램 / xml 유지) 인 솔루션은이 페이지 하단의 Felipe Leusin이 제안한 솔루션입니다. config.Formatters.XmlFormatter.SupportedMediaTypes.Add (new MediaTypeHeaderValue ( "text / html")) 사용;
Cohen

1
그렇다면 웹 설정을 통해 어떻게해야합니까? 기본적으로 json과 요청시 XML을 얻습니까?
Kyle

4
@Felipse Leusin의 답변은 실제로 짧고 더 좋습니다.
Ken Smith

313

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

6
이것은 가장 간결하고 간단한 솔루션이며 Fiddler는 josn으로 반환되는 콘텐츠 유형을 감지합니다.
Steve Johnson

4
좋은! 이것을 코드에서 어디에 넣을 것을 제안 하시겠습니까?
Tim Abell

9
WebApiConfig.cs
Animesh

9
나를 위해 일했다. 사용하는 System.Net.Http.Formatting
bbsimonbb

1
내 편의를 위해 연결 :이 대답은 내가 일반적으로 수행하는 다른 설정 단계 인 stackoverflow.com/a/28337589/398630 과 잘 어울립니다 .
BrainSlugs83

308

나는 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());

24
this.SerializerSettings.Formatting = Formatting.Indented;브라우저 확장없이 예쁘게 인쇄 하려면 생성자에 추가 하십시오.
Alastair Maw

10
왜 전선을 통해 예쁘게 인쇄하고 싶습니까?
meffect

8
@ dmit77의 답변 이 이것보다 더 낫지 않습니까?
H.Wolper

8
@eddiegroves 당신은 전선을 통해 예쁘게 인쇄하고 싶지 않습니다. 서버가 유선을 통해 최소량의 비트를 전송하기를 원합니다 (예 : 공백 없음). 그런 다음 브라우저가 애드온 등을 사용하여 멋지게 형식화하기를 원합니다. 자바 스크립트는 일반적으로 JSON을 파싱해야하는데, 불필요한 포맷팅을 도입하여 느리게 만드는 이유
20:53

13
찾고있는 Google 직원 : 추가하는 것을 잊지 마세요 using System.Net.Http.Formattingusing Newtonsoft.Json
Berriel

186

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

9
작동-XML 대신 JSON을 기본값으로 사용하는 것이 훨씬 좋습니다.
whitneyland

5
하지만 여전히 xml을 반환 할 수 있습니까?
Thomas 주식

99
나는 그것을 테스트했지만 당신은 할 수 없습니다. 그래서 이것은 XML 지원을 제거하고 있습니다. 그렇습니다. Google 직원 여러분
Thomas Stock

3
당신이 내 대답은 아래를 읽어보십시오,이 XML은 여전히 당신이 원하는 경우에 반환하지만 브라우저에 JSON과 사이트 응답을 할 수있게된다
글렌 슬라

3
@GlennSlaven 예, 정답은 정답입니다.
radu florescu

114

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

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

소스 .


XmlFormatter는 MVC4의 새로운 기능입니까?
Glenn Slaven

1
MVC5에서, 이것은 GlobalConfiguration.Configuration로 설정을 대체하여 수행 할 수 있습니다
스티븐

4
JSON 만 지원하고 어떤 상황에서도 XML을 방출 할 수없는 프로젝트의 경우이 방법이 가장 좋습니다.
Luc C

1
config.Formatters.Add (config.Formatters.JsonFormatter);
Cas Bloem

3
끔찍 해요 -이것은 클라이언트가 구체적으로 Content-Type 헤더에서 XML을 요청하더라도 항상 JSON을 반환합니다.
BrainSlugs8383

94

에서 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"));
}

2
대단해 당신의 방법은 매개 변수를 기대합니까? 같은 ? 로컬 호스트 : 61044 / API / 값 / GETDATE JSON = 사실, 날짜 = 2012-08-01
LT.Nolo

어떤 종류의 데이터 웹 API 형식이 기본적으로 반환되는지. json 또는 webapi입니까? 고마워
토마스

54

WebAPI의 내용 협상을 살펴보십시오. 이 ( 1 부2 부 ) 놀랍도록 상세하고 철저한 블로그 게시물은 그 작동 방식을 설명합니다.

요컨대, 당신이 옳고, Accept또는 Content-Type요청 헤더 를 설정해야합니다 . 액션이 특정 형식을 반환하도록 코딩되어 있지 않은 경우을 설정할 수 있습니다 Accept: application/json.


6
"그래서 브라우저에서 볼 수 있습니다"
Spongman

1
@Spongman, 예 가능합니다. 그러나 REST Client와 같은 확장 기능을 사용하십시오. 대부분의 브라우저에는 이와 같은 확장 기능이 있습니다. 브라우저에서 직접 URL 입력은 1입니다. 너무 제한적입니다 (헤더를 제어하지 않고 데이터를 게시 할 수 없음 등). 2. 올바르지 않음-브라우저가 웹 API를 사용하려고 의도 한대로 사용하지 않습니다. 웹 브라우저를 올바르게 테스트하지 않아도됩니다. 다시 말해, 훌륭한 REST 클라이언트 애드온이이를 해결합니다.
Ivaylo Slavov

45

질문은 Chrome에만 해당되므로 Postman 확장 프로그램 을 통해 요청 컨텐츠 유형을 설정할 수 있습니다.

우편 집배원


Firefox에서는 about : config로 이동하여 accept.default를 검색하고 network.http.accept.default구성 내용을로 변경하십시오 text/html,application/xhtml+xml,application/json;q=0.9,application/xml;q=0.8,*/*;q=0.7.
Bjartur Thorlacius

또는 text/html,application/xhtml+xml;q=1.0,*/*;q=0.7Bitbucket과 같은 버그가 많은 호스트가 실수로 HTML 대신 브라우저 JSON을 제공하지 않도록하십시오.
Bjartur Thorlacius

URL이 죽었습니다. 새로운 것은 chrome.google.com/webstore/detail/postman/… 입니다.
팔콘 모모 트

35

빠른 옵션 중 하나는 MediaTypeMapping 전문화를 사용하는 것입니다. 다음은 Application_Start 이벤트에서 QueryStringMapping을 사용하는 예입니다.

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

이 경우 URL에 쿼리 문자열? a = b가 포함될 때마다 Json 응답이 브라우저에 표시됩니다.


2
이것은 매우 유용했습니다. path.to/item.json를 사용하려면 QueryStringMapping 대신 UriPathExtensionMapping을 사용할 수도 있습니다.
nuzzolilo

32

이 코드는 json을 기본으로 설정하고 XML 형식도 사용할 수 있도록합니다. 그냥을 추가하겠습니다 xml=true.

GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", "application/xml"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

모두 감사합니다!


1
이것은 가장 융통성있는 답변입니다. 요즘에는 기본 구성이어야합니다. 이 답변에 추가하려면 브라우저를 포함하여 JSON이 기본값입니다. XML을 보려면 쿼리 문자열을 추가하십시오.? xml = true
raider33

여러 가지 전략을 시도했습니다. XML과 JSON 모두에 대한 간단한 테스트를 수행했으며 즉시 사용 가능
pat capozzi

23

브라우저를 사용하여 API를 테스트하지 마십시오.

대신 CURL 또는 Fiddler와 같은 요청을 지정할 수있는 HTTP 클라이언트를 사용하십시오.

이 문제의 문제점은 API가 아닌 클라이언트에 있습니다. 브라우저 요청에 따라 웹 API가 올바르게 작동합니다.


30
왜 브라우저를 사용하지 않습니까? 그것은 명백한 도구입니다.
Anders Lindén

4
여기서 요점은 정확하고 중요하다고 생각합니다. 문제가 클라이언트에 의해 발생한 경우 응용 프로그램의 일부 (MVC WebAPI 인프라)를 덮어 쓰면 안됩니다. Api의 실제 사용 사례는 올바른 헤더를 제공하여 올바르게 사용하는 것인데, 이는 응용 프로그램의 책임입니다. 나는 브라우저를 완전히 버리는 것에 동의하지 않습니다-테스트를 ​​위해 거의 모든 브라우저를위한 많은 도구가 있습니다 (최소한의 클라이언트와 유사한 확장으로 시작).
Ivaylo Slavov

6
이것은 아마도 주석이어야합니다.
bonh

17

위의 답변의 대부분은 완벽하게 이해됩니다. 데이터가 XML 형식으로 포맷되는 것을 볼 수 있기 때문에 XML 포맷터가 적용된다는 것을 의미하므로 HttpConfiguration 매개 변수에서 XMLFormatter를 제거하면 JSON 형식을 볼 수 있습니다.

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

JSON이 기본 형식이므로


12

헤더에 "Chrome"이 포함 된 Accept: application/xml경우 전역 작업 필터를 사용하여 제거했습니다 User-Agent.

internal class RemoveXmlForGoogleChromeFilter : IActionFilter
{
    public bool AllowMultiple
    {
        get { return false; }
    }

    public async Task<HttpResponseMessage> ExecuteActionFilterAsync(
        HttpActionContext actionContext,
        CancellationToken cancellationToken,
        Func<Task<HttpResponseMessage>> continuation)
    {
        var userAgent = actionContext.Request.Headers.UserAgent.ToString();
        if (userAgent.Contains("Chrome"))
        {
            var acceptHeaders = actionContext.Request.Headers.Accept;
            var header =
                acceptHeaders.SingleOrDefault(
                    x => x.MediaType.Contains("application/xml"));
            acceptHeaders.Remove(header);
        }

        return await continuation();
    }
}

작동하는 것 같습니다.


11

REST 서비스와 함께 작동하는 Chrome 앱 'Advanced REST Client'가 우수하다는 것을 알았습니다. Content-Type을 다음과 같이 설정할 수 있습니다 application/json. Advanced REST client


10

올바른 형식 반환은 미디어 유형 포맷터에 의해 수행됩니다. 다른 사람들이 언급했듯이 WebApiConfig수업 에서이 작업을 수행 할 수 있습니다 .

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...

        // Configure Web API to return JSON
        config.Formatters.JsonFormatter
        .SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

        ...
    }
}

자세한 내용은 다음을 확인하십시오.

조치가 XML을 리턴하고 (기본적으로) JSON을 리턴하는 특정 메소드 만 필요한 경우 및를 사용 ActionFilterAttribute하여 해당 특정 조치에 적용 할 수 있습니다 .

필터 속성 :

public class JsonOutputAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        ObjectContent content = actionExecutedContext.Response.Content as ObjectContent;
        var value = content.Value;
        Type targetType = actionExecutedContext.Response.Content.GetType().GetGenericArguments()[0];

        var httpResponseMsg = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            RequestMessage = actionExecutedContext.Request,
            Content = new ObjectContent(targetType, value, new JsonMediaTypeFormatter(), (string)null)
        };

        actionExecutedContext.Response = httpResponseMsg;
        base.OnActionExecuted(actionExecutedContext);
    }
}

행동에 적용 :

[JsonOutput]
public IEnumerable<Person> GetPersons()
{
    return _repository.AllPersons(); // the returned output will be in JSON
}

Attribute액션 장식 에서 단어 를 생략하고 [JsonOutput]대신 사용할 수 있습니다 [JsonOutputAttribute].



6

최신 버전의 ASP.net WebApi 2에 따라

아래 WebApiConfig.cs에서 작동합니다.

config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
config.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

6

왜 답에이 모든 복잡성이 있는지는 분명하지 않습니다. 물론 QueryStrings, 헤더 및 옵션을 사용하여이를 수행 할 수있는 방법이 많이 있지만 최선의 방법은 간단합니다. 일반 URL (예 :)을 요청 http://yourstartup.com/api/cars하면 JSON이 표시됩니다. 적절한 응답 헤더로 JSON을 얻습니다.

Content-Type: application/json

이 같은 질문에 대한 답변을 찾을 때이 스레드를 발견 했으며이 승인 된 답변이 정확하게 작동하지 않기 때문에 계속 진행해야했습니다. 나는 내가 생각하기에 너무 간단하다고 생각되는 답을 찾았습니다.

기본 WebAPI 포맷터 설정

여기에도 팁을 추가하겠습니다.

WebApiConfig.cs

namespace com.yourstartup
{
  using ...;
  using System.Net.Http.Formatting;
  ...
  config.Formatters.Clear(); //because there are defaults of XML..
  config.Formatters.Add(new JsonMediaTypeFormatter());
}

기본값 (적어도 내가보고있는 기본값)의 출처에 대한 질문이 있습니다. 그들은 .NET 기본값입니까, 아니면 다른 곳에서 (내 프로젝트의 다른 사람에 의해) 만들어 졌습니까? 어쨌든, 이것이 도움이되기를 바랍니다.


5

다음은 jayson.centeno 및 기타 답변과 비슷한 솔루션 이지만에서 제공되는 확장 기능을 사용 System.Net.Http.Formatting합니다.

public static void Register(HttpConfiguration config)
{
    // add support for the 'format' query param
    // cref: http://blogs.msdn.com/b/hongyes/archive/2012/09/02/support-format-in-asp-net-web-api.aspx
    config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
    config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");

    // ... additional configuration
 }

이 솔루션은 WebApi의 초기 릴리스에서 OData에 대해 $ format을 지원하는 데 주로 사용되었지만 비 OData 구현에도 적용되며 Content-Type: application/json; charset=utf-8응답에 헤더를 반환합니다 .

그것은 브라우저로 테스트 할 때 당신의 압정 &$format=json또는 &$format=xmlURI의 끝까지 수 있습니다 . 자신의 헤더를 설정할 수있는 브라우저가 아닌 클라이언트를 사용할 때 예상되는 다른 동작을 방해하지 않습니다.


5

아래와 같이 사용할 수 있습니다 :

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

JSON 메시지 만 전달하기 위해 WebAPI 앱을 만드는 경우이 답변을 고려하십시오.
allen1

4

WebApiConfig 클래스 에이 두 줄의 코드를 추가하십시오.

public static class WebApiConfig
{
     public static void Register(HttpConfiguration config)
     {
          //add this two line 
          config.Formatters.Clear();
          config.Formatters.Add(new JsonMediaTypeFormatter());


          ............................
      }
}

3

다음 App_Start/WebApiConfig.cs과 같이 변경하십시오 .

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
        //Below formatter is used for returning the Json result.
        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
        //Default route
        config.Routes.MapHttpRoute(
           name: "ApiControllerOnly",
           routeTemplate: "api/{controller}"
       );
    }

포맷터를 제거하는 것은 일반적으로 좋은 생각이 아니며 기능을 제거하는 것입니다.
naspinski

실제로이 경우에는 잘 작동하며 다른 사람들도 이와 같은 방법을 제안합니다. myview.rahulnivi.net/building-spa-angular-mvc-5 book 에서 배웠습니다 !
vaheeds

2

에서 MSDN 건물 ASP.NET 및 AngularJS와 가진 단일 페이지 응용 프로그램 (41 분 약에).

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // ... possible routing etc.

        // Setup to return json and camelcase it!
        var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        formatter.SerializerSettings.ContractResolver =
            new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
    }

최신이어야하며 시도해 보았습니다.


2

이 질문을 한 다음 시간이 지났지 만 다른 옵션은 아래와 같이 MessageHandler를 사용하여 요청을 처리하는 동안 서버의 Accept 헤더를 대체하는 것입니다.

public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        var someOtherCondition = false;
        var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
        if (someOtherCondition && accHeader.Contains("application/xml"))
        {
            request.Headers.Remove("Accept");
            request.Headers.Add("Accept", "application/json");
        }
        return await base.SendAsync(request, cancellationToken);
    }
}

경우 someOtherCondition에만 때때로 우리는 기본 콘텐츠 협상을 무시할까요 조건의 경우에 대한 것 등이를, 브라우저 종류를 포함하여 아무 것도 할 수 있습니다. 그렇지 않으면 다른 답변에 따라 구성에서 불필요한 포맷터를 제거하기 만하면됩니다.

물론 등록해야합니다. 전역 적으로이 작업을 수행 할 수 있습니다.

  public static void Register(HttpConfiguration config) {
      config.MessageHandlers.Add(new ForceableContentTypeDelegationHandler());
  }

또는 경로별로 경로로 :

config.Routes.MapHttpRoute(
   name: "SpecialContentRoute",
   routeTemplate: "api/someUrlThatNeedsSpecialTreatment/{id}",
   defaults: new { controller = "SpecialTreatment" id = RouteParameter.Optional },
   constraints: null,
   handler: new ForceableContentTypeDelegationHandler()
);

그리고 이것은 메시지 처리기이므로 파이프 라인의 요청 및 응답 끝에서 모두와 매우 비슷하게 실행됩니다 HttpModule. 따라서 사용자 정의 헤더를 사용하여 재정의를 쉽게 확인할 수 있습니다.

public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        var wasForced = false;
        var someOtherCondition = false;
        var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
        if (someOtherCondition && accHeader.Contains("application/xml"))
        {
            request.Headers.Remove("Accept");
            request.Headers.Add("Accept", "application/json");
            wasForced = true;
        }

        var response =  await base.SendAsync(request, cancellationToken);
        if (wasForced){
          response.Headers.Add("X-ForcedContent", "We overrode your content prefs, sorry");
        }
        return response;
    }
}

2

내 응용 프로그램에서 사용하는 가장 쉬운 방법은 다음과 같습니다. 코드의 3 개 라인 아래에 주어진 추가 App_Start\\WebApiConfig.csRegister기능

    var formatters = GlobalConfiguration.Configuration.Formatters;

    formatters.Remove(formatters.XmlFormatter);

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));

Asp.net 웹 API는 반환 객체를 JSON으로 자동 직렬화 application/json하고 헤더에 추가되면 브라우저 또는 수신자가 JSON 결과를 반환한다는 것을 이해할 수 있습니다.


1

WebApiConfig는 json 또는 xml로 출력할지 여부를 구성 할 수있는 장소입니다. 기본적으로 xml입니다. 레지스터 함수에서 HttpConfiguration Formatters를 사용하여 출력을 포맷 할 수 있습니다. System.Net.Http.Headers => MediaTypeHeaderValue ( "text / html")은 json 형식으로 출력을 가져와야합니다. 여기에 이미지 설명을 입력하십시오


1

핵심 라이브러리와 Json.Net의 최근 업데이트 후 Felipe Leusin 의 답변을 수년간 사용 하여 System.MissingMethodException: SupportedMediaTypes를 만났습니다 . 내 경우의 해결책은 예기치 않은 예외가 발생하는 다른 사람들에게 도움이되기를 희망하는 것 System.Net.Http입니다. 어떤 상황에서는 NuGet이 분명히 제거합니다. 수동 설치 후 문제가 해결되었습니다.


-3

나는 단일 사용 사례 (GET) 변경 코딩을 필요로하는 많은 응답을 참조 깜짝이야 하나의 API를 대신 한 번 설치해야하고 사용할 수 있습니다 어떤 적절한 도구를 사용하여 임의의 모든 API (자신 또는 제 3 자) 및 사용 사례.

따라서 좋은 대답은 다음과 같습니다.

  1. json 또는 다른 컨텐츠 유형 만 요청하려면 Requestly 또는 유사한 도구를 설치 하고 Accept 헤더를 수정하십시오.
  2. POST도 사용하고 json, xml 등을 멋지게 포맷하려면 Postman 또는 ARC 와 같은 적절한 API 테스트 확장을 사용하십시오 .

일부는 추가 도구 및 라이브러리의 형태로 팽창을 추가하지 않고 작업을 선호합니다.
tno2007

누군가 작업에 잘못된 도구를 사용하고 있기 때문에 API를 변경하는 것은 여전히 ​​잘못입니다. 웹 브라우저는 API를 테스트하도록 설계되지 않았으며, API 출력을 보거나 문서를 보도록 설계되었습니다. API 개발자가 API 테스터 도구가 API 개발자를위한 필수 툴킷 대신 부풀어 오른다 고 생각하면 더 나빠질 것입니다. 솔직히 API와 상호 작용하고 실험해야하기 때문에 프런트 엔드 개발자도 추가하려고합니다. addins가없는 브라우저는 헤더를 설정하거나 API에 게시하거나 응답 헤더를 검사 할 수 없기 때문에 충분하지 않을 수도 있습니다.
user3285954

나는 당신이 말하는 것을 이해하고 당신은 틀리지 않습니다. 그러나 주제에 맞지 않는 이유는 투표율이 낮은 이유는 질문에 대한 답변입니다. 당신은 매우 전투 적으로 들리며 모든 것을 알고 있다고 생각하는 개발자로 맞서게됩니다. 나는 당신이 당신의 응답으로 판단 할 때 훌륭한 개발자라고 확신합니다. 그러나 특히 이와 같은 전문적인 QA 환경에서 사람들을보다 친근하고 인간적인 방식으로 다루고 설득하는 방법을 배워야합니다. 아마도 먼저 원하는 답변을 한 다음 더 나은 방법을 설명하고 더 나은 이유에 동기를 부여하십시오.
tno2007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.