1220 votes

Comment faire pour que l'API Web ASP.NET renvoie JSON au lieu de XML en utilisant Chrome ?

En utilisant les nouvelles API Web ASP.NET en Chrome Je vois du XML - comment puis-je le changer en requête ? JSON pour que je puisse le visualiser dans le navigateur ? Je pense qu'il s'agit simplement d'une partie des en-têtes de la requête, ai-je raison ?

8 votes

Il y a une discussion ici pour que le retour de JSON seulement soit le comportement par défaut : github.com/aspnet/Mvc/issues/1765

1811voto

Felipe Leusin Points 4583

J'ajoute simplement ce qui suit dans App_Start / WebApiConfig.cs dans ma classe MVC API Web projet.

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

Cela permet d'obtenir JSON pour la plupart des requêtes, mais vous pouvez obtenir XML lorsque vous envoyez text/xml .

Si vous avez besoin d'avoir la réponse Content-Type comme application/json veuillez vérifier Réponse de Todd ci-dessous .

NameSpace utilise System.Net.Http.Headers .

118 votes

Il s'agit d'une réponse étonnamment négligée, et bien que la question originale n'ait pas été totalement claire, elle fait directement de JSON la réponse par défaut d'un navigateur Web (qui envoie Accept : text/html). Bon travail.

1 votes

J'aime beaucoup mieux cela que de demander un paramètre de requête json=true.

17 votes

+1 C'est de loin la meilleure réponse. J'imagine qu'il y a une tonne de gens qui choisissent de supprimer complètement XML juste parce qu'ils ne voient pas JSON dans le navigateur.

513voto

Glenn Slaven Points 15742

Si vous faites cela dans le WebApiConfig vous obtiendrez JSON par défaut, mais il vous sera toujours possible de retourner XML si vous passez le paramètre text/xml comme la demande Accept en-tête

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 vous n'utilisez pas le type de projet MVC et n'avez donc pas cette classe au départ, voir cette réponse pour plus de détails sur la façon de l'intégrer.

51 votes

Juste pour noter, le comportement original est correct. Demandes de Chrome application/xml avec une priorité de 0,9 et */* avec une priorité de 0,8. En supprimant application/xml vous supprimez la possibilité pour l'API Web de renvoyer du XML si le client le demande spécifiquement. Par exemple, si vous envoyez "Accept : application/xml", vous allez toujours recevoir JSON.

0 votes

Sur la base du commentaire de @Porges, je suggère d'envelopper les deux lignes qui suppriment le support XML dans une directive #if DEBUG. De cette façon, en dev, vous pouvez utiliser la barre d'adresse de Chrome pour tester votre api et obtenir json par defaut et vous continuerez à offrir le support XML dans votre environnement prod.

12 votes

Est-ce moi, ou la première phrase est-elle incorrecte ? Le code semble supprimer totalement le XML, et non pas simplement modifier la valeur par défaut.

324voto

Todd Menier Points 3599

J'aime L'approche de Felipe Leusin Le mieux : s'assurer que les navigateurs obtiennent JSON sans compromettre la négociation du contenu avec les clients qui veulent réellement du XML. La seule pièce manquante pour moi était que les en-têtes de réponse contenaient toujours content-type : text/html. Pourquoi était-ce un problème ? Parce que j'utilise l'option Extension Chrome JSON Formatter qui inspecte le type de contenu, et je n'obtiens pas le joli formatage auquel je suis habitué. J'ai corrigé cela avec un simple formateur personnalisé qui accepte les requêtes text/html et renvoie des réponses application/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");
    }
}

Inscrivez-vous comme suit :

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

24 votes

Dans le constructeur, ajoutez this.SerializerSettings.Formatting = Formatting.Indented; si vous voulez qu'il soit joliment imprimé sans extension de navigateur.

1 votes

Parfait. J'avais des problèmes avec la solution de Felipe qui retournait un Content-Type of text/html J'ai combiné votre réponse avec celle de suhair pour que le JSON soit envoyé au navigateur par défaut, mais que j'aie la possibilité d'ajouter "format=xml" ou "format=json" à la chaîne de requête pour sélectionner un format spécifique. Merci !

11 votes

Pourquoi voudriez-vous qu'il soit imprimé sur le fil ?

189voto

Yakir Manor Points 1725

Conseil rapide MVC4 n° 3 - Suppression du formateur XML de l'API Web d'ASP.Net

Sur Global.asax ajouter la ligne :

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

comme ça :

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

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

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

9 votes

Fonctionne - il est beaucoup plus agréable d'avoir JSON par défaut au lieu de XML.

5 votes

Mais pouvez-vous toujours renvoyer le xml alors ?

101 votes

Je l'ai testé, et vous ne pouvez pas. Donc c'est la suppression du support XML.. Soyez avertis, chers gens de Google

119voto

Dans le WebApiConfig.cs ajouter à la fin de l Registre fonction :

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

Source : .

0 votes

XmlFormatter est-il nouveau dans MVC4 ?

1 votes

En MVC5, cela peut être fait en remplaçant config par GlobalConfiguration.Configuration

5 votes

Pour un projet qui ne doit prendre en charge que JSON et qui ne peut en aucun cas être autorisé à émettre du XML, c'est de loin la meilleure option.

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