c# - una - modificar api
¿Cómo cambiar la API Web 2 predeterminada al formateador JSON? (6)
Tengo un proyecto de API web que devuelve algunos datos del producto. Negocia el tipo de devolución correctamente según el encabezado Aceptar (JSON / XML) de la solicitud. El problema es que si no se especifica ningún encabezado Accept, se devuelve XML, pero quiero que devuelva JSON de manera predeterminada
http://website.com/MyPage?type=json // returns json
http://website.com/MyPage?type=xml // returns xml
http://website.com/MyPage // returns xml by default
Aquí está mi código actual se ve así:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(
new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml")));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(
new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json")));
Creo que deberías cambiar como sigue.
/*Response as default json format
* example (http://localhost:9090/WebApp/api/user/)
*/
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
/*Response as json format depend on request type
* http://localhost:9090/WebApp/api/user/?type=json
*/
GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(
new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json")));
/*Response as xml format depend on request type
* http://localhost:9090/WebApp/api/user/?type=xml
*/
GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(
new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml")));
Creo que Web API solo usa el primer formateador que puede encontrar en la colección de Formateadores. Puedes cambiar el orden con algo como
GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
GlobalConfiguration.Configuration.Formatters.Add(new XmlMediaTypeFormatter());
Pero parece que el formateador JSON debe ser el primero por defecto, por lo que es posible que desee verificar si ya está modificando esta colección en alguna parte.
O simplemente elimine el XmlFormatter
var formatters = GlobalConfiguration.Configuration.Formatters;
formatters.Remove(formatters.XmlFormatter);
Agregue esto en su App_Start/WebApiConfig.cs
:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
Ninguna de las respuestas anteriores funcionó para mí. El problema era que estaba obteniendo los formateadores de GlobalConfiguration
y no el objeto de config
creado con la new HttpConfiguration()
Aquí está el código que funciona para mí:
public class WebApiConfig
{
public static HttpConfiguration Register()
{
var config = new HttpConfiguration();
// This next line could stay if you want xml formatting
config.Formatters.Remove(config.Formatters.XmlFormatter);
// This next commented out line was causing the problem
//var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
// This next line was the solution
var jsonFormatter = config.Formatters.JsonFormatter;
jsonFormatter.UseDataContractJsonSerializer = false; // defaults to false, but no harm done
jsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
jsonFormatter.SerializerSettings.Formatting = Formatting.None;
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
// remaining irrelevant code commented out
return config;
}
}
config.EnableSystemDiagnosticsTracing();
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
// Adding formatter for Json
config.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json")));
// Adding formatter for XML
config.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml")));