Pregunta ¿Cómo obtengo que API Web ASP.NET devuelva JSON en lugar de XML utilizando Chrome?


Usando el más nuevo API web ASP.NET, en Cromo Estoy viendo XML. ¿Cómo puedo cambiarlo para solicitarlo? JSON entonces puedo verlo en el navegador? Sí creo que es solo parte de los encabezados de las solicitudes, ¿estoy en lo correcto?


1221
2018-03-23 23:04


origen


Respuestas:


Solo agrego lo siguiente en App_Start / WebApiConfig.cs clase en mi proyecto MVC Web API.

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

Eso asegura que obtienes json en la mayoría de las consultas, pero puedes obtener xml Cuando lo envies text/xml.

Si necesitas tener la respuesta Content-Type como application/json por favor, compruebe La respuesta de Todd a continuación.

NameSpace esta usando System.Net.Http.Headers;


1528
2017-11-07 20:25



Si haces esto en el WebApiConfig obtendrá JSON por defecto, pero aún le permitirá devolver XML si pasa text/xml como la solicitud Accept encabezamiento

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

Si no está utilizando el tipo de proyecto MVC y, por lo tanto, no tenía esta clase para empezar, ver esta respuesta para detalles sobre cómo incorporarlo.


471
2017-09-19 02:53



me gusta El enfoque de Felipe Leusin Lo mejor: asegúrese de que los navegadores obtengan JSON sin comprometer la negociación de contenido de los clientes que realmente desean XML. La única pieza que faltaba para mí era que los encabezados de respuesta aún contenían content-type: text / html. ¿Por qué fue eso un problema? Porque uso el JSON Formatter Extensión de Chrome, que inspecciona el tipo de contenido, y no obtengo el bonito formato al que estoy acostumbrado. Lo arreglé con un formateador personalizado simple que acepta solicitudes text / html y devuelve respuestas de aplicación / 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");
    }
}

Regístrese así:

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

277
2017-12-12 23:52



Usar RequestHeaderMapping funciona aún mejor, porque también establece el Content-Type = application/json en el encabezado de respuesta, que permite a Firefox (con el complemento JSONView) formatear la respuesta como JSON.

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

230
2017-09-26 20:48



Sugerencia rápida MVC4 n.º 3: eliminación del formateador XML de ASP.Net Web API

En Global.asax agregue la línea:

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

al igual que:

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

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

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

171
2018-04-02 16:11



En el WebApiConfig.cs, agregar al final de la Registro función:

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

Fuente.


102
2018-01-05 22:43



En el Global.asax Estoy usando el código a continuación. Mi URI para obtener JSON es 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
2017-07-06 07:00



Eche un vistazo a la negociación de contenido en la WebAPI. Estas (Parte 1 & Parte 2) publicaciones de blog maravillosamente detalladas y exhaustivas explican cómo funciona.

En resumen, tienes razón, y solo necesitas configurar el Accept o Content-Type solicitar encabezados Dado que su acción no está codificada para devolver un formato específico, puede establecer Accept: application/json.


47
2018-03-24 04:24



Como la pregunta es específica de Chrome, puede obtener Extensión del cartero que le permite establecer el tipo de contenido de la solicitud.

Postman


37
2017-09-27 10:40



Una opción rápida es usar la especialización MediaTypeMapping. Aquí hay un ejemplo de cómo usar QueryStringMapping en el evento Application_Start:

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

Ahora, cada vez que la url contiene la cadena de consulta? A = b en este caso, la respuesta de Json se mostrará en el navegador.


30
2018-03-27 05:08