关于HTTP头:正确的JSON内容类型是什么?

What is the correct JSON content type?

我已经和JSON混了一段时间了,只是把它作为文本推出来,它不会伤害任何人(据我所知),但我想开始做正确的事情。

我已经看到了很多关于JSON内容类型的所谓"标准":

1
2
3
4
5
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

但哪一个是正确的,还是最好的?我认为它们之间存在不同的安全和浏览器支持问题。

我知道有一个类似的问题,如果一个RESTAPI返回了JSON,那么是什么mime类型?但是我想要一个更有针对性的回答。


对于JSON文本:

application/json

The MIME media type for JSON text is application/json. The default encoding is UTF-8. (Source: RFC 4627).

对于带有回调的jsonp(可运行的javascript):

application/javascript

以下是一些相关评论中提到的博客文章。

  • 为什么不使用text/html作为json
  • Internet Explorer有时与application/json有问题(死亡2018-06-26)
  • 一个相当完整的mimetypes列表以及它们的用途
  • 下面是来自@gnrfan答案的IANA官方MIME类型列表


IANA已将JSON的官方mime类型注册为application/json

当被问及为什么不使用text/json时,crockford似乎说json不是真正的javascript,也不是文本,而且iana比text/*更有可能使用application/*

更多资源:

  • 媒体类型
  • 征求意见4627
  • bluesmoon:json有一个类型


对于JSON:

1
Content-Type: application/json

对于JSON-P:

1
Content-Type: application/javascript


当然,JSON的正确mime媒体类型是application/json,但必须了解应用程序中需要什么类型的数据。

例如,我使用ext-gwt,服务器响应必须作为文本/html,但包含JSON数据。

客户端,外部GWT窗体侦听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
uploadForm.getForm().addListener(new FormListenerAdapter()
{
    @Override
    public void onActionFailed(Form form, int httpStatus, String responseText)
    {
        MessageBox.alert("Error");
    }

    @Override
    public void onActionComplete(Form form, int httpStatus, String responseText)
    {
        MessageBox.alert("Success");
    }
});

如果使用application/json响应类型,浏览器建议我保存该文件。

使用SpringMVC的服务器端源代码段

1
2
3
4
5
6
7
8
9
10
11
return new AbstractUrlBasedView()
{
    @SuppressWarnings("unchecked")
    @Override
    protected void renderMergedOutputModel(Map model, HttpServletRequest request,
                                           HttpServletResponse response) throws Exception
    {
        response.setContentType("text/html");
        response.getWriter().write(json);
    }
};


杰森:

响应是根据URL中传递的查询参数动态生成的数据。

例子:

1
{"Name":"Foo","Id": 1234,"Rank": 7 }

内容类型:application/json

JSON-P:

带填充的JSON。响应是JSON数据,周围环绕着函数调用。

例子:

1
functionCall({"Name":"Foo","Id": 1234,"Rank": 7});

内容类型:application/javascript


如果您使用的是Ubuntu或Debian,并且通过Apache提供.json文件,那么您可能希望为这些文件提供正确的内容类型。我这样做主要是因为我想使用火狐扩展jsonview

Apache模块mod_mime将有助于轻松实现这一点。但是,使用Ubuntu,您需要编辑文件/etc/mime.types并添加行

1
application/json json

然后重新启动Apache:

1
sudo service apache2 restart


如果从客户端调用ASP.NET Web服务,则必须使用application/json才能使其工作。我相信这对于jquery和ext框架也是一样的。


json的正确内容类型是application/json,除非您使用的是jsonp,也称为带填充的json,实际上是javascript,所以正确的内容类型是application/javascript


毫无疑问,对于JSON响应,application/json是最好的mime类型。

但我有一些经验,因为一些压缩问题,我不得不使用application/x-javascript。我的托管环境是与Godaddy共享的托管。它们不允许我更改服务器配置。为了压缩响应,我在web.config文件中添加了以下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<httpCompression>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
       
       
       
       
    </dynamicTypes>
    <staticTypes>
       
       
       
       
    </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>

通过使用这个,用g-zip压缩了.aspx页,但json响应没有。我补充说

1
 

在静态和动态类型部分。但这根本不压缩JSON响应。

之后,我删除了这个新添加的类型并添加了

1
 

在静态和动态类型部分中,并在

.ashx(异步处理程序)到

1
application/x-javascript

现在我发现我的JSON响应是用g-zip压缩的。所以我个人推荐使用

1
application/x-javascript

只有当您想要压缩共享托管环境上的JSON响应时。因为在共享宿主中,它们不允许您更改IIS配置。


仅当使用application/json作为mime类型时,我才具有以下功能(截至2011年11月最新版本的chrome,firefox和firebug):

  • 从服务器加载JSON时,Chrome不再发出警告。
  • Firebug会在响应中添加一个标签,显示JSON数据。格式化的。如果mime类型不同,它将显示为"响应内容"。

并不是所有内容都适用于内容类型application/json

如果您使用Ext ;JS Form Submit to Upload文件,请注意浏览器会解析服务器响应,以便为