Вопрос: Как заставить ASP.NET Web API возвращать JSON вместо XML с помощью Chrome?


Использование нового Веб-API ASP.NET , в Хром Я вижу XML - как я могу его изменить для запроса JSON поэтому я могу просмотреть его в браузере? Я верю, что это всего лишь часть заголовков запросов, я прав в этом?


1221


источник


Ответы:


Я просто добавлю следующее в App_Start / WebApiConfig.csкласса в моем проекте MVC Web API.

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

Это гарантирует, что вы получите json по большинству запросов, но вы можете получить xmlкогда вы отправляете text/xml,

Если вам нужен ответ Content-Typeв виде application/jsonпожалуйста, проверьте Ответ Тодда ниже ,

NameSpaceиспользует System.Net.Http.Headers;


1511



Если вы сделаете это в WebApiConfigвы получите JSON по умолчанию, но он все равно позволит вам вернуть XML, если вы пройдете text/xmlкак запрос Acceptзаголовок

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 и, следовательно, не имели этого класса для начала, см. этот ответ для получения подробной информации о том, как его включить.


470



мне нравится Подход Фелипе Леусина лучше - убедитесь, что браузеры получают JSON без компрометации согласования контента с клиентами, которые действительно хотят XML. Единственным недостающим моментом для меня было то, что заголовки ответов по-прежнему содержали контент-тип: text / html. Почему это проблема? Потому что я использую Расширение JSON Formatter Chrome , который проверяет тип содержимого, и я не получаю красивое форматирование, к которому я привык. Я исправил это с помощью простого пользовательского форматирования, который принимает запросы text / 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());

273



Использование 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"));

217



MVC4 Quick Tip # 3 - Извлечение XML Formatter из ASP.Net Web 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();
}

170



в WebApiConfig.cs , добавьте к концу регистр функция:

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

Источник ,


100



In the Global.asax I am using the code below. My URI to get JSON is 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"));
}

87



Have a look at content negotiation in the WebAPI. These (Part 1 & Part 2) wonderfully detailed and thorough blog posts explain how it works.

In short, you are right, and just need to set the Accept or Content-Type request headers. Given your Action isn't coded to return a specific format, you can set Accept: application/json.


47