我一直在弄乱JSON一段时间,只是将其作为文本推出,并没有伤害任何人(据我所知),但是我想正确地做事。
我见过这么多的所谓的 “标准” 为 JSON 内容类型:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
但是哪一个是正确的,还是最好的?我发现在它们之间存在安全性和浏览器支持问题。
我知道有一个类似的问题, 如果 REST API 返回 JSON,则为哪种 MIME 类型? ,但我想要一个更有针对性的答案。
对于 JSON 文本:
application/json
JSON 文本的 MIME 媒体类型为
application/json
。默认编码为 UTF-8。 (来源: RFC 4627 )。
对于带回调的 JSONP (可运行的 javascript):
application/javascript
这是相关评论中提到的一些博客文章。
IANA已将 JSON 的正式 MIME 类型注册为application/json
。
当被问及为什么不是text/json
,Crockford 似乎说 JSON 并不是 JavaScript 也不是 text,而且 IANA 比text/*
更有可能分发application/*
text/*
。
更多资源:
当然,JSON 的正确 MIME 媒体类型是application/json
,但是有必要了解应用程序中期望的数据类型。
例如,我使用Ext GWT ,服务器响应必须为text / html,但包含 JSON 数据。
客户端,Ext GWT 表单侦听器
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响应类型,浏览器建议我保存文件。
使用Spring MVC 的服务器端源代码片段
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 中传递的查询参数动态生成的数据。
例:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
内容类型: application/json
带有填充的 JSON。响应是 JSON 数据,并带有包装的函数调用。
例:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
内容类型: application/javascript
JSON 的正确内容类型是application/json
除非您使用JSONP ,也称为 JSON 与 Padding,它实际上是 JavaScript,因此正确的内容类型将是application/javascript
。
毫无疑问, application/json
是 JSON 响应的最佳MIME类型。
但是由于一些压缩问题,我有一些必须使用application/x-javascript
经验。我的托管环境是与GoDaddy共享的托管。它们不允许我更改服务器配置。我已将以下代码添加到我的web.config
文件中以压缩响应。
<httpCompression>
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>
通过使用此选项,.aspx 页使用 g-zip 压缩,但 JSON 响应未压缩。我加了
<add mimeType="application/json" enabled="true"/>
在静态和动态类型部分中。 但这根本不会压缩 JSON 响应。
之后,我删除了这个新添加的类型并添加了
<add mimeType="application/x-javascript" enabled="true"/>
在静态和动态类型部分中,并更改了响应类型
.ashx(异步处理程序)
application/x-javascript
现在,我发现我的 JSON 响应已使用 g-zip 压缩。所以我个人建议使用
application/x-javascript
仅当您要在共享托管环境上压缩 JSON 响应时。因为在共享主机中,它们不允许您更改IIS配置。