programing

ASP 입수 방법크롬을 사용하여 XML 대신 JSON을 반환하는 NET Web API를 선택하십시오.

i4 2023. 3. 7. 21:04
반응형

ASP 입수 방법크롬을 사용하여 XML 대신 JSON을 반환하는 NET Web API를 선택하십시오.

새로운 ASP 사용.NET Web API, Chrome에서 XML을 볼 수 있습니다.JSON을 요청하도록 변경하려면 어떻게 해야 합니까?요청 헤더의 일부라고 생각합니다만, 맞습니까?

주의: 이 답변의 코멘트를 읽어주세요.WebAPI 기본 오류 처리를 사용하면 XSS 취약성이 발생할 수 있습니다.

I just add the following in 다음 내용을 추가했을 뿐입니다.App_Start / WebApiConfig.csmvc Web API 프로젝트의 클래스입니다.

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

그것은 JSON에 JON을 받을 수 있지만 리 부 j 에 서 지 있 만 을 makes that queries수 get get, most can you you쿼대그 j얻 butXML낼을 보낼 때text/xml.

If you need to have the response 답변이 필요한 경우Content-Type as ~하듯이application/json아래 토드의 답변을 확인해 주세요.

NameSpace is using 사용하고 있다System.Net.Http.Headers.

에서 했을 경우WebApiConfig되지만, 「JSON」에 할 수 .text/xmlAccept머리글

의: 것것해,, 음음음음음 for for for for for for for for for for for for for for for for for for for for for for for for의 지원이 .application/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 프로젝트 유형을 사용하지 않기 때문에 처음부터 이 클래스가 없는 경우 통합 방법에 대한 자세한 내용은 다음 답변을 참조하십시오.

사용하면 설정되므로 Header Mapping이 합니다. 왜냐하면 헤더 매핑은Content-Type = application/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 Formatter Chrome 익스텐션을 사용하고 있기 때문에 익숙한 포맷이 아닙니다.텍스트/html 요청을 받아들여 응용 프로그램/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에서 XML 포메터 삭제넷 웹 API

»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에서 Register 기능의 끝에 추가합니다.

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

WebAPI의 콘텐츠네고시에이션을 참조해 주세요.이러한 (제1부 제2부)의 블로그 투고는, 매우 상세하고 철저한 구조를 설명하고 있습니다.

이 옳고, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.★★★★★★★★★★★★★★★★★★,Accept ★★★★★★★★★★★★★★★★★」Content-Type특정 않은 , 설정할 수 .Accept: application/json

질문은 크롬에 따라 다르므로, 요청 내용 유형을 설정할 수 있는 우체국 확장자를 얻을 수 있습니다.

집배원

이 코드를 사용하면 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"));

여러분 감사합니다.

Media Type Mapping의 특화 기능을 사용하는 방법이 있습니다.다음으로 Application_Start 이벤트에서 QueryStringMapping을 사용하는 예를 나타냅니다.

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

이 경우 url에 querystring ?a=b가 포함될 때마다 Json 응답이 브라우저에 표시됩니다.

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

대신 CURL이나 Fiddler 등의 요청을 지정할 수 있는HTTP 클라이언트를 사용해 보십시오.

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

위의 답변은 대부분 일리가 있습니다.데이터가 XML 형식으로 포맷되어 있기 때문에 XML 포맷터가 적용되어 있습니다.따라서 다음과 같이 XMLFormatter를 HttpConfiguration 파라미터에서 삭제하는 것만으로 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이 기본 형식이기 때문에

올바른 포맷은 미디어 타입의 포맷에 의해 반환됩니다.하셨듯이 '다음에'에서 이렇게 할 수 있어요.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을는, 「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].

를 사용하여 했습니다.Accept: application/xmlUser-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();
    }
}

효과가 있는 것 같아.

net 2의 최신 에서는, 「ASP.net WebApi 2」에 있습니다.WebApiConfig.cs , , , , , , , , , , , , , , , , , , , .

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

「Advanced REST Client」REST입니다.[ - ]를 [Content - Type ]으로 할 수 .application/json그 중에서도, 다음과 같습니다.고급 REST 클라이언트

config.Formatters.Remove(config.Formatters.XmlFormatter);

왜 답변에 이 모든 복잡성이 있는지 알 수 없습니다.QueryStrings, 헤더, 옵션 등 다양한 방법이 있습니다.베스트 프랙티스라고 생각하는 것은 간단합니다. URL "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 디폴트 또는 (프로젝트 내 다른 사용자가) 다른 곳에 작성했을 수 있습니다.어쨌든, 이게 도움이 되길 바라.

다음과 같이 사용할 수 있습니다.

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

다음은 jaison.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의 $ODATA를 하고 있습니다.Content-Type: application/json; charset=utf-8머리글

해서 할 수 있습니다.&$format=json ★★★★★★★★★★★★★★★★★」&$format=xml를 브라우저로 테스트할 때 uri 끝까지 표시합니다.자체 헤더를 설정할 수 있는 브라우저 이외의 클라이언트를 사용할 경우 예상되는 다른 동작을 방해하지 않습니다.

WebApiConfig 클래스에 이 두 줄의 코드를 추가하기만 하면 됩니다.

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


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

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

이 질문에 대한 질문(및 답변)이 있은 후 시간이 좀 지났지만 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브라우저 타입 등 모든 것을 사용할 수 있습니다.이는 기본 콘텐츠네고시에이션을 덮어쓰려는 경우에 한해 적용됩니다.그렇지 않으면 다른 답변과 마찬가지로 Configuration에서 불필요한 포맷터를 삭제하기만 하면 됩니다.

당연히 등록하셔야 합니다.이것은, 글로벌하게 실시할 수 있습니다.

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

제가 지금까지 응용 프로그램에서 사용한 가장 쉬운 방법은 다음과 같습니다. 때 3행의 합니다.App_Start\WebApiConfig.cs Register★★★★

var formatters = GlobalConfiguration.Configuration.Formatters;

formatters.Remove(formatters.XmlFormatter);

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

.net Web 및 Asp.net Web API로 application/json는 헤더에 추가되므로 브라우저 또는 수신자가 JSON 결과를 반환하고 있음을 인식할 수 있습니다.

MSDN에서 ASP를 사용한1 페이지 어플리케이션 구축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();
    }

최신 제품이어야 하는데, 시도해보니 작동했어요.

Felipe Leusin의 답변은 핵심 라이브러리와 Json의 최근 업데이트 후 수년간 사용되었습니다.네, 저는 우연히System.MissingMethodException Supported Types : 되는 미디어 치 않은 예외를 있는 다른 이 될 수 좋겠다고 생각합니다만, 「」를 인스톨 하는 해결책입니다.System.Net.Http은 일부에서 이를 으로 보입니다 NuGet을 사용합니다.수동 설치 후 문제가 해결되었습니다.

WebApiConfig는 json 또는 xml 중 어느 것으로 출력할지를 설정할 수 있는 장소입니다.기본적으로는 xml입니다.레지스터 기능에서는 HttpConfiguration Formatters를 사용하여 출력을 포맷할 수 있습니다.

System.Net.Http.Headers => MediaTypeHeaderValue("text/html")조손

여기에 이미지 설명 입력

한 번 설치해야 하는 적절한 툴을 사용하지 않고 하나의 API(소유 또는 서드파티) 및 모든 사용 사례에 사용할 수 있는 단일 사용 사례(GET)를 변경하기 위해 코딩이 필요한 답변이 너무 많다는 사실에 놀랐습니다.

좋은 답은 다음과 같습니다.

  1. json 또는 기타 콘텐츠만 요청하려면 Requestly 또는 유사한 도구를 설치하고 Accept 헤더를 수정합니다.
  2. 또한 POST를 사용하고 json, xml 등을 올바르게 포맷하고 싶다면 Postman이나 ARC와 같은 적절한 API 테스트 확장을 사용하십시오.

언급URL : https://stackoverflow.com/questions/9847564/how-do-i-get-asp-net-web-api-to-return-json-instead-of-xml-using-chrome

반응형