Frage Wie kann ich die ASP.NET-Web-API dazu bringen, JSON anstelle von XML mithilfe von Chrome zurückzugeben?


Verwenden der neueren ASP.NET-Web-API, im Chrom Ich sehe XML - wie kann ich es ändern, um es anzufordern JSON also kann ich es im Browser sehen? Ich glaube, es ist nur ein Teil der Anfrage Header, bin ich richtig darin?


1221
2018-03-23 23:04


Ursprung


Antworten:


Ich füge einfach folgendes hinzu App_Start / WebApiConfig.cs Klasse in meinem MVC-Web-API-Projekt.

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

Das stellt sicher, dass Sie JSON bei den meisten Abfragen erhalten, aber Sie können bekommen xml wenn Sie schicken text/xml.

Wenn Sie die Antwort benötigen Content-Type wie application/json bitte prüfe Todds Antwort unten.

NameSpace benutzt System.Net.Http.Headers;


1528
2017-11-07 20:25



Wenn Sie dies in der tun WebApiConfig Sie erhalten JSON standardmäßig, aber Sie können weiterhin XML zurückgeben, wenn Sie bestehen text/xml als die Anfrage Accept Header

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);
    }
}

Wenn Sie den MVC-Projekttyp nicht verwenden und daher nicht über diese Klasse verfügen, Siehe diese Antwort für Details, wie man es einbaut.


471
2017-09-19 02:53



ich mag Felipe Leusins ​​Ansatz Am besten - stellen Sie sicher, dass Browser JSON erhalten, ohne die Inhaltsverhandlung von Clients zu gefährden, die tatsächlich XML möchten. Das einzige fehlende Stück für mich war, dass die Response-Header immer noch content-type enthalten: text / html. Warum war das ein Problem? Weil ich das benutze JSON Formatter Chrome-Erweiterung, die den Inhaltstyp überprüft, und ich bekomme nicht die hübsche Formatierung, die ich gewohnt bin. Ich habe das mit einem einfachen benutzerdefinierten Formatierer korrigiert, der Text / HTML-Anfragen akzeptiert und Anwendungs ​​/ JSON-Antworten zurückgibt:

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");
    }
}

Registrieren Sie sich so:

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

277
2017-12-12 23:52



Die Verwendung von RequestHeaderMapping funktioniert sogar noch besser, da es auch die Content-Type = application/json im Response-Header, der es Firefox (mit JSONView-Add-On) ermöglicht, die Antwort als JSON zu formatieren.

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



MVC4 Quick Tipp # 3 - Entfernen der XML-Formatierung von ASP.Net Web API

Im Global.asax füge die Zeile hinzu:

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

so:

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



In dem WebApiConfig.cs, am Ende der Registrieren Funktion:

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

Quelle.


102
2018-01-05 22:43



In dem Global.asax Ich verwende den folgenden Code. Mein URI, um JSON zu bekommen, ist 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



Sehen Sie sich die Inhaltsverhandlung in der WebAPI an. Diese (Teil 1 & Teil 2) wunderbar detaillierte und gründliche Blogbeiträge erklären, wie es funktioniert.

Kurz gesagt, Sie haben Recht, und müssen nur die Accept oder Content-Type Anforderungsheader Wenn Ihre Aktion nicht zum Zurückgeben eines bestimmten Formats codiert ist, können Sie festlegen Accept: application/json.


47
2018-03-24 04:24



Da die Frage Chrome-spezifisch ist, können Sie die Postbote-Erweiterung Mit dieser Option können Sie den Inhaltstyp der Anfrage festlegen.

Postman


37
2017-09-27 10:40



Eine schnelle Möglichkeit besteht darin, die MediaTypeMapping-Spezialisierung zu verwenden. Im Folgenden finden Sie ein Beispiel für die Verwendung von QueryStringMapping im Application_Start-Ereignis:

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

Wann immer die URL die Querystring enthält? A = b in diesem Fall wird Json Antwort im Browser angezeigt.


30
2018-03-27 05:08