8 votes

MVC 4 - Web Api et JSON ?

Je travaille sur l'API Web de MVC 4 et je suis un peu confus à propos du formatage par défaut. Je veux que les données de l'API soient en JSON. Cependant, elles sont renvoyées en XML. D'après la vidéo de démarrage de MVC 4 à l'adresse http://www.asp.net/web-api/videos/getting-started/your-first-web-api Il devrait être JSON par défaut. Mais lorsque je crée un nouveau projet Web Api et que j'exécute l'exemple, j'obtiens ceci :

<ArrayOfstring><string>value1</string><string>value2</string></ArrayOfstring>

J'ai tourné en rond en essayant d'obtenir ceci en JSON mais apparemment il y a beaucoup de désinformation à ce sujet. Par exemple :

  1. Si j'ajoute "application/json" à l'en-tête du type de contenu, il devrait renvoyer du JSON. Cela ne fonctionne pas, mais je soupçonne que le nom de la variable d'en-tête n'est pas correct car je ne trouve pas le nom exact à utiliser. J'ai essayé "Content-Type" et "contentType" dans les en-têtes de la requête sans succès. De plus, je veux du JSON par défaut, pas en fonction des informations de l'en-tête.
  2. Si je crée un JsonFormatter et que je l'ajoute dans Application_Start GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonNetFormatter(serializerSettings)); Il devrait faire l'affaire. Mais je l'ai trouvé déprécié car aucun des exemples ne fonctionne.

Que pourrais-je faire, quelque chose de simple de préférence, pour produire des données au format JSON par défaut ?

19voto

Justin Points 2493

Ajoutez ceci à GLOBAL.ASAX pour que la réponse soit application/json

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

Il devrait donc ressembler à ceci dans le contexte :

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

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

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

OU si vous devez conserver XML comme type de média, vous pouvez éditer App_Start/WebApiConfig.cs :

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

Ce qui fait de JSON la réponse par défaut d'un navigateur web mais renvoie text/html .

Source

4voto

Maggie Ying Points 3804

Je veux que les données de l'API soient en JSON. Cependant, il les renvoie en XML

Comment accédez-vous à votre webapi ? Utilisez-vous Chrome pour accéder à votre service webapi (comme Nick l'a mentionné dans le commentaire) ? Chrome ajoute l'en-tête Accept application/xml à la requête...

Si j'ajoute "application/json" à l'en-tête du type de contenu, il devrait renvoyer du JSON.

Essayez plutôt de définir l'en-tête "Accept".

Si je crée un JsonFormatter et l'ajoute dans Application_Start GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonNetFormatter(serializerSettings)) ; Cela devrait faire l'affaire. Mais je l'ai trouvé déprécié car aucun des exemples ne fonctionne.

Si l'en-tête accept de la requête est application/xml, la négociation de contenu choisira toujours le format XmlMediaTypeFormatter et renverra application/xml. Une dernière chose, le formateur pour JSON s'appelle JsonMediaTypeFormatter, et il est déjà en position 0 de la collection Formatters.

0voto

Darrel Miller Points 56797

Si vous ne voulez que du JSON, supprimez toutes les valeurs par défaut de la collection de formateurs, puis ajoutez uniquement la valeur JSON.

0voto

John Korsnes Points 610

Il n'est pas nécessaire de supprimer le support xml pour obtenir une réponse JSON. Pour les requêtes GET, vous devez définir l'en-tête Accept-header - et non l'en-tête Content-Type. Pour les autres verbes HTTP, cela dépend. Explication complète ici.

http://blogs.msdn.com/b/kiranchalla/archive/2012/02/25/content-negotiation-in-asp-net-mvc4-web-api-beta-part-1.aspx

Bonus : Utilisez le plugin Postman de Google Chrome pour tester les API REST. Hautement recommandé :)

https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en

0voto

KomalJariwala Points 523

Vous pouvez également écrire ci-dessous dans GLOBAL.ASAX

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

cela fonctionne également pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X