J'ai un projet d'API Web qui renvoie des données de produit. Il négocie correctement le type de retour en fonction de l'en-tête Accept (JSON/XML) de la demande. Le problème est que si aucun en-tête Accept n'est spécifié, il renvoie XML, mais je veux qu'il renvoie JSON par défaut.
http://website.com/MyPage?type=json // returns json
http://website.com/MyPage?type=xml // returns xml
http://website.com/MyPage // returns xml by default
Voici mon code actuel qui ressemble à:
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")));
Ajoutez ceci dans votre App_Start/WebApiConfig.cs
:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
Je pense que l'API Web utilise simplement le premier formateur qu'il peut trouver dans la collection Formatters. Vous pouvez changer la commande avec quelque chose comme
GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
GlobalConfiguration.Configuration.Formatters.Add(new XmlMediaTypeFormatter());
Mais il semble que le formateur JSON devrait être le premier par défaut, vous devriez donc vérifier si vous modifiez déjà cette collection quelque part.
Je pense que vous devriez changer comme suit . Global.asax:
/*For Indented formatting:*/
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
/*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")));
Ou simplement supprimer le XmlFormatter
var formatters = GlobalConfiguration.Configuration.Formatters;
formatters.Remove(formatters.XmlFormatter);
Aucune des réponses ci-dessus n'a fonctionné pour moi. Le problème était que je récupérais les formateurs de GlobalConfiguration
et non de l'objet config
créé avec new HttpConfiguration()
.
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")));