题 如何让ASP.NET Web API使用Chrome返回JSON而不是XML?


使用较新的 ASP.NET Web API,在  我看到XML - 如何更改它以请求 JSON 所以我可以在浏览器中查看它?我相信它只是请求标题的一部分,我是否正确?


1221
2018-03-23 23:04


起源


这里讨论使返回JSON只是默认行为: github.com/aspnet/Mvc/issues/1765 - Natan


答案:


我只是添加以下内容 App_Start / WebApiConfig.cs 我的MVC Web API项目中的类。

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

这确保你在大多数查询中得到json,但你可以得到 xml 当你寄出 text/xml

如果您需要回复 Content-Type 如 application/json 请检查 托德的回答如下

NameSpace 正在使用 System.Net.Http.Headers;


1530
2017-11-07 20:25



这是一个令人惊讶的被忽视的答案,虽然原始问题并不完全清楚,但这直接使JSON成为Web浏览器的默认响应(发送Accept:text / html)。做得好。 - gregmac
+1远离最好的答案。我想有很多人选择完全删除XML只是因为他们没有在浏览器中看到JSON。 - Derek Hunziker
请注意响应 Content-Type 标题仍然是 text/html。 - Mrchief
这太可怕了。响应内容类型标题应为application / json。这个“解决方案”使它成为text / html。 - meffect
这个答案更好: stackoverflow.com/a/26068063/510149 - kipusoep


如果你这样做的话 WebApiConfig 默认情况下,您将获得JSON,但如果通过,它仍将允许您返回XML text/xml 作为要求 Accept 头

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

如果您没有使用MVC项目类型,因此没有开始使用此类, 看到这个答案 有关如何合并它的详细信息。


471
2017-09-19 02:53



需要注意的是,原始行为是正确的。 Chrome请求 application/xml 优先级为0.9和 */* 优先级为0.8。通过删除 application/xml 如果客户端具体请求,则删除Web API返回XML的能力。例如如果您发送“Accept:application / xml”,您将会 仍然 收到JSON。 - porges
是我,还是第一句不正确?该代码似乎完全删除了XML,而不是简单地更改默认值。 - NickG
@NickG:这里忽略了一个解决方案,恕我直言是一个更好的选择(保持application / xml)是Felipe Leusin在本页面下提出的解决方案。使用config.Formatters.XmlFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(“text / html”)); - Cohen
那么,我们如何通过Web配置来实现它,所以我们默认获得json和XML请求? - Kyle
@Felipse Leusin的答案实际上更短,效果更好。 - Ken Smith


我喜欢 Felipe Leusin的方法 最好 - 确保浏览器获得JSON而不会影响实际需要XML的客户端的内容协商。对我来说唯一缺少的部分是响应头仍然包含content-type:text / html。为什么这是一个问题?因为我使用了 JSON Formatter Chrome扩展程序,它检查内容类型,我没有得到我习惯的漂亮格式。我修复了一个简单的自定义格式化程序,它接受text / html请求并返回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");
    }
}

注册如下:

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

278
2017-12-12 23:52



在构造函数中添加 this.SerializerSettings.Formatting = Formatting.Indented; 如果你想在没有浏览器扩展的情况下打印漂亮。 - Alastair Maw
你为什么要把它打印在电线上呢? - meffect
不是@dmit77的 回答 比这更好(更简洁)? - H.Wolper
@eddiegroves你不想要通过电线漂亮打印。您希望服务器通过线路发送最少量的位(即:无空格)。然后你希望浏览器使用插件等很好地格式化它。 Javascript通常需要解析JSON,为什么要通过引入不必要的格式来减慢它 - meffect
对于正在寻找的googlers:不要忘记添加 using System.Net.Http.Formatting 和 using Newtonsoft.Json - Berriel


使用RequestHeaderMapping工作得更好,因为它也设置了 Content-Type = application/json 在响应头中,它允许Firefox(带有JSONView附加组件)将响应格式化为JSON。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings
.Add(new System.Net.Http.Formatting.RequestHeaderMapping("Accept", 
                              "text/html",
                              StringComparison.InvariantCultureIgnoreCase,
                              true, 
                              "application/json"));

231
2017-09-26 20:48



这是最精简和最简单的解决方案,Fiddler还会检测作为josn返回的内容类型。 - Steve Johnson
太好了!你会在哪里建议把它放在代码中? - Tim Abell
它应该放在WebApiConfig.cs中 - Animesh
为我工作。我需要添加一个 使用System.Net.Http.Formatting; - bbsimonbb
这应该是IMO接受的答案,因为它返回 application/json 代替 text/html。 - shuniar


MVC4快速提示#3 - 从ASP.Net Web API中删除XML Formatter

Global.asax 添加行:

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

像这样:

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



Works - 使JSON成为默认值而不是XML更好。 - Lee
但是你还可以返回xml吗? - Thomas Stock
我测试了它,你不能。所以这是删除XML支持..你应该被警告,亲爱的谷歌人 - Thomas Stock
如果您查看下面的答案,如果您愿意,仍然会返回xml,但让网站使用JSON回复浏览器 - Glenn Slaven
@GlennSlaven是的,你的答案应该是标记为正确的答案。 - radu florescu


在里面 WebApiConfig.cs,添加到最后 寄存器 功能:

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

资源


102
2018-01-05 22:43



XmlFormatter在MVC4中是新的吗? - Glenn Slaven
在MVC5中,可以通过使用GlobalConfiguration.Configuration替换config来完成此操作 - Steven
对于必须仅支持JSON的项目,在任何情况下都不允许发出XML,这是目前最好的选择。 - Luc C
config.Formatters.Add(config.Formatters.JsonFormatter); - Cas Bloem
这太可怕了。 - 无论如何,这将始终返回JSON,即使客户端在Content-Type标头中特别要求XML。 - BrainSlugs83


在里面 Global.asax中 我正在使用下面的代码。我获取JSON的URI是 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



太棒了。你的方法对参数有什么期望?喜欢 本地主机:61044 / API /值/ GETDATE JSON =真,日期= 2012-08-01 - LT.Nolo
默认情况下,web api返回什么样的数据格式。是json还是webapi?谢谢 - Thomas


看看WebAPI中的内容协商。这些(第1部分 & 第2部分)非常详细和全面的博客文章解释它是如何工作的。

总之,你是对的,只需要设置 Accept 要么 Content-Type 请求标头。如果您的Action未编码为返回特定格式,则可以进行设置 Accept: application/json


47
2018-03-24 04:24



“所以我可以在浏览器中查看它” - Spongman
@Spongman,是的,你可以。但是使用像REST Client这样的扩展程序 - 大多数浏览器都有类似的。在浏览器中直接键入url是1.限制太多(无法控制标题,无法发布数据等); 2.不正确 - 浏览器不使用web api,因为它打算被消费 - 你不能依赖它正确地测试它。所以,再一次,一个好的REST客户端插件可以解决这个问题。 - Ivaylo Slavov


由于问题是特定于Chrome,因此您可以获得 邮递员延期 它允许您设置请求内容类型。

Postman


37
2017-09-27 10:40



在Firefox中,只需转到about:config,搜索accept.default并更改内容即可 network.http.accept.default 配置到 text/html,application/xhtml+xml,application/json;q=0.9,application/xml;q=0.8,*/*;q=0.7。 - Bjartur Thorlacius
或者更好,只是 text/html,application/xhtml+xml;q=1.0,*/*;q=0.7 避免像Bitbucket这样的错误主机意外地使用您的浏览器JSON代替HTML。 - Bjartur Thorlacius
网址已经死了。一个新的是 chrome.google.com/webstore/detail/postman/...。 - Falcon Momot


一个快速选项是使用MediaTypeMapping专门化。以下是在Application_Start事件中使用QueryStringMapping的示例:

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

现在,只要url包含查询字符串?a = b,在这种情况下,Json响应将显示在浏览器中。


30
2018-03-27 05:08



这非常有用。如果要使用path.to/item.json,也可以使用UriPathExtensionMapping而不是QueryStringMapping。 - Nuzzolilo