Question Comment obtenir l'API Web ASP.NET pour renvoyer JSON au lieu de XML en utilisant Chrome?


En utilisant le plus récent API Web ASP.NET, dans Chrome Je vois XML - comment puis-je le changer pour demander JSON donc je peux le voir dans le navigateur? Je crois que cela fait partie des en-têtes des demandes, ai-je raison?


1221
2018-03-23 23:04


origine


Réponses:


Je viens d'ajouter ce qui suit dans App_Start / WebApiConfig.cs classe dans mon projet API Web MVC.

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

Cela assure que vous obtenez json sur la plupart des requêtes, mais vous pouvez obtenir xml quand tu envoies text/xml.

Si vous avez besoin de la réponse Content-Type comme application/json Vérifiez s'il vous plaît La réponse de Todd ci-dessous.

NameSpace utilise System.Net.Http.Headers;


1528
2017-11-07 20:25



Si vous faites cela dans le WebApiConfig vous obtiendrez JSON par défaut, mais cela vous permettra quand même de renvoyer du XML si vous passez text/xml comme la demande Accept entê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 pour commencer, voir cette réponse pour plus de détails sur la façon de l'incorporer.


471
2017-09-19 02:53



J'aime L'approche de Felipe Leusin meilleur - assurez-vous que les navigateurs obtiennent JSON sans compromettre la négociation de contenu des clients qui veulent réellement du XML. Le seul élément qui manquait pour moi était que les en-têtes de réponse contenaient encore content-type: text / html. Pourquoi était-ce un problème? Parce que j'utilise le JSON Formatter Chrome extension, 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 les 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 ceci:

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

277
2017-12-12 23:52



L'utilisation de RequestHeaderMapping fonctionne encore mieux, car elle définit également Content-Type = application/json dans l'en-tête de réponse, qui permet à Firefox (avec l'extension JSONView) de formater la réponse en 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



Astuce n ° 3 de MVC4: suppression du formateur XML de l'API Web ASP.Net

Dans Global.asax ajoutez la ligne:

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

ainsi:

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



dans le WebApiConfig.cs, ajouter à la fin de la registre fonction:

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

La source.


102
2018-01-05 22:43



dans le Global.asax J'utilise le code ci-dessous. Mon URI pour obtenir JSON est 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



Jetez un oeil à la négociation de contenu dans le WebAPI. Celles-ci (Partie 1 & Partie 2) des articles de blog merveilleusement détaillés et complets expliquent comment cela fonctionne.

En bref, vous avez raison, et juste besoin de définir le Accept ou Content-Type demander des en-têtes. Étant donné que votre action n'est pas codée pour renvoyer un format spécifique, vous pouvez définir Accept: application/json.


47
2018-03-24 04:24



Comme la question est spécifique à Chrome, vous pouvez obtenir Extension de facteur ce qui vous permet de définir le type de contenu de la requête.

Postman


37
2017-09-27 10:40



Une option rapide consiste à utiliser la spécialisation MediaTypeMapping. Voici un exemple d'utilisation de QueryStringMapping dans l'événement Application_Start:

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

Maintenant, chaque fois que l'URL contient la chaîne de requête? A = b dans ce cas, la réponse de Json sera affichée dans le navigateur.


30
2018-03-27 05:08



Ce code fait de json mon défaut et me permet également d'utiliser le format XML. Je vais juste ajouter le xml=true.

GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", "application/xml"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

Merci tout le monde!


27
2017-09-03 01:48