JSON 内容类型有许多“标准”:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
哪个最好?我认为安全和浏览器支持问题是一个因素。
对于 JSON 文本:
application/json
JSON 文本的 MIME 媒体类型是 application/json。默认编码为 UTF-8。 (来源:RFC 4627)
对于带有回调的 JSONP(可运行 JavaScript):
application/javascript
以下是相关评论中提到的一些博客文章:
为什么不应该对 JSON 使用 text/html
Internet Explorer 有时会出现 application/json 问题
一个相当完整的 Mimetype 列表以及它们的用途
IANA 的官方 mime 类型列表来自 @gnrfan 下面的回答
IANA 已将 JSON 的官方 MIME 类型注册为 application/json
。
当被问及为什么不使用 text/json
时,Crockford 似乎说 JSON 不是真正的 JavaScript 也不是文本,而且 IANA 更可能分发 application/*
而不是 text/*
。
更多资源:
媒体类型
征求意见 4627
bluesmoon:JSON 有一个类型
text/*
部分,而现在可能会被放入 application/*
部分。
cat file.jpg
。而任何 xml 或 json 文件都是 100% 可打印的。所以我认为 Stijn de Witt 的观点是有效的,尽管事实上是的,现在改变为时已晚。
x
字符。不是 78. JSON 是文本,其方式与 HTML (text/html) 完全相同。它仅包含可读的文本字符,其中包含结构化的含义。
对于 JSON:
Content-Type: application/json
对于 JSON-P:
Content-Type: application/javascript
当然,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);
}
};
JSON:
响应是根据 URL 中传递的查询参数动态生成的数据。
例子:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
内容类型: application/json
JSON-P:
带填充的 JSON。响应是 JSON 数据,其中包含一个函数调用。
例子:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
内容类型: application/javascript
如果您使用的是 Ubuntu 或 Debian,并且通过 Apache 提供 .json 文件,您可能希望提供具有正确内容类型的文件。我这样做主要是因为我想使用 Firefox 扩展 JSONView
Apache 模块 mod_mime 将有助于轻松完成此操作。但是,对于 Ubuntu,您需要编辑文件 /etc/mime.types 并添加该行
application/json json
然后重启 Apache:
sudo service apache2 restart
如果您从客户端调用 ASP.NET Web 服务,则必须使用 application/json
才能使其工作。我相信 jQuery 和 Ext 框架也是如此。
content-Type: text/plain
、content-Type: application/json
、content-Type: application/json; charset=UTF-8
、contentType: "application/x-www-form-urlencoded; charset=UTF-8"
JSON 的正确内容类型是 application/json
,除非您使用的是 JSONP,也称为 JSON with 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 配置。
application/json
,我在共享主机上利用它,我不建议使用不同的内容类型来启用压缩,这是完全错误的。它可以做到,但它仍然是错误的。 浏览器支持使用不同的内容类型是一回事,服务器端压缩使用不同的内容类型是另一回事。
并非所有内容都适用于内容类型 application/json
。
如果您使用 Ext JS 表单提交来上传文件,请注意浏览器会解析服务器响应以创建 <iframe>
的文档。
如果服务器使用 JSON 发送返回对象,则必须将 Content-Type
标头设置为 text/html
,以告知浏览器将未更改的文本插入到文档正文中。
请参阅the Ext JS 3.4.0 API documentation。
application/json
。
iframe
似乎触发了 application/javascript
、application/x-javascript
、text/javascript
的 load
事件, text/plain
,但 NOT 为 application/json
或 text/html
触发它。截至今天,Android <=2.3 约占 Android 市场份额的 50%。
JSON 是一种 domain-specific language (DSL) 和一种独立于 JavaScript 的数据格式,因此具有自己的 MIME 类型 application/json
。对 MIME 类型的尊重当然是客户端驱动的,因此 text/plain
可能用于字节传输,但是您将不必要地将解释推向供应商应用程序域 - application/json
。您会通过 text/plain
传输 XML 吗?
但老实说,您选择的 MIME 类型是对客户如何解释数据的建议 - text/plain
或 text/HTML
(当它不是 HTML 时)就像类型擦除 - 它与将所有对象都设为 Object 类型一样没有信息用打字的语言。
据我所知,没有浏览器运行时会采用 JSON 文档并自动将其作为 JavaScript 可访问对象提供给运行时,而无需干预,但如果您使用的是残缺的客户端,那就完全不同了。但这还不是全部 - RESTful JSON 服务通常没有 JavaScript 运行时,但这并没有阻止它们使用 JSON 作为一种可行的数据交换格式。如果客户端那么残废......那么我可能会考虑通过 Ajax 模板服务进行 HTML 注入。
应用程序/JSON!
如果您在客户端环境中,则必须调查跨浏览器支持对于支持良好的 Web 应用程序。
正确的 HTTP Content-Type 应该是 application/json
,正如其他人已经突出显示的那样,但有些客户端不能很好地处理它,这就是 jQuery 推荐默认 text/html
的原因。
正确答案是:
Content-Type: application/json
正如许多其他人所提到的,application/json
是正确答案。
但是尚未解释的是您提出的其他选项的含义。
application/x-javascript:在 application/javascript 成为标准之前 JavaScript 的实验性 MIME 类型。
文本/javascript:现在已过时。使用 javascript 时应使用 application/javascript。
text/x-javascript:针对上述情况的实验性 MIME 类型。
text/x-json:在 application/json 正式注册之前 JSON 的实验性 MIME 类型。
总而言之,每当您对内容类型有任何疑问时,都应该检查 this link
text/javascript
什么时候过时了?我仍在用 <script type="text/javascript" ...
标记填充 HTML 文档。
type="text/javascript"
并至少根据 HTML5 执行 <script>...</script>
。
“application/json
”是正确的 JSON 内容类型。
def ajaxFindSystems = {
def result = Systems.list()
render(contentType:'application/json') {
results {
result.each{sys->
system(id:sys.id, name:sys.name)
}
}
resultset (rows:result.size())
}
}
IANA registration for application/json
说
使用这种媒体类型的应用程序:JSON 已被用于在使用以下所有编程语言编写的应用程序之间交换数据:ActionScript、C、C#、Clojure、ColdFusion、Common Lisp、E、Erlang、Go、Java、JavaScript、Lua、Objective CAML、Perl、PHP、Python、Rebol、Ruby、Scala 和 Scheme。
您会注意到 IANA.org doesn't list any of these other media types,实际上甚至 application/javascript
现在都已过时。所以 application/json
确实是唯一可能的正确答案。
浏览器支持是另一回事。
最广泛支持的非标准媒体类型是 text/json
或 text/javascript
。但一些大牌甚至使用text/plain
。
更奇怪的是 Flickr 发送的 Content-Type 标头,它返回 JSON 作为 text/xml
。 Google 将 text/javascript
用于它的一些 ajax api。
例子:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
输出:Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
输出:Content-Type: text/xml
正确的 MIME 类型是 application/json
但
我经历了很多浏览器类型或框架用户需要的情况:
text/html
application/javascript
我使用以下
contentType: 'application/json',
data: JSON.stringify(SendData),
发布时,Content-Type 标头应设置为“application/json”。侦听请求的服务器应包含“Accept=application/json”。在 Spring MVC 中,您可以这样做:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
在响应中添加标头:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
application/json 在 PHP 中可以很好地存储数组或对象数据。
我使用此代码将数据放在设置为 publically viewable 的 Google Cloud Storage (GCS) 上的 JSON 中:
$context = stream_context_create([
'gs' => [
'acl'=>'public-read',
'Content-Type' => 'application/json',
]
]);
file_put_contents(
"gs://BUCKETNAME/FILENAME.json",
json_encode((object) $array),
false,
$context
);
要取回数据很简单:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
内容类型:应用程序/json - JSON
内容类型:应用程序/javascript - JSON-P
内容类型:application/x-javascript - JavaScript
Content-Type: text/javascript - JavaScript 但已过时。旧的 Internet Explorer 版本用于将其用于 HTML 属性。
Content-Type: text/x-javascript - JavaScript 媒体类型,但已过时
Content-Type: text/x-json - application/json 正式注册之前的 JSON。
在 Spring 中,您定义了一个类型:MediaType.APPLICATION_JSON_VALUE
,相当于 application/json。
对于 JSON,我正在使用:
Content-Type: application/json
这在 IETF 的 JSON 数据交换格式 7158 提案 Section 1.2: Specifications of JSON 中有所描述。
如果 JSON 带有填充,那么它将是 application/jsonp
。如果 JSON 没有填充,那么它将是 application/json
。
要同时处理这两种情况,最好使用:'application/javascript',而不用担心它是带填充还是不带填充。
当您在 REST 上下文中使用 JSON 时,扩展接受的响应...
当您表示 REST 资源和集合时,有一个关于使用 application/x-resource+json
和 application/x-collection+json
的strong argument。
如果您决定遵循 jsonapi 规范,请you should使用 application/vnd.api+json
,因为它已记录在案。
尽管没有通用标准,但很明显,向正在传输的资源添加的语义证明了比 application/json
更明确的 Content-Type 是合理的。
按照这个推理,其他上下文可以证明更具体的 Content-Type 是合理的。
application/vnd.api+json
似乎专门用于使用 json:api 的 api,这是一个非常狭窄的规范,有自己的期望和格式,我不明白它适用于返回 json 的 any API。如果我错了请纠正我
如果您以 JSON 格式从 REST API 获取数据,则必须使用 Content-Type:
对于 JSON 数据:Content-Type:application/json
对于 HTML 数据:Content-Type:text/html,
对于 XHTML 数据:Content-Type:application/xhtml+xml,
对于 XML 数据:Content-Type:text/xml, application/xml
PHP 开发人员使用这个:
<?php
header("Content-type: application/json");
// Do something here...
?>
JSON(JavaScript 对象表示法)和 JSONP(“带填充的 JSON”)格式似乎非常相似,因此它们应该使用哪种 MIME 类型可能会非常混乱。即使格式相似,它们之间也存在一些细微的差异。
因此,每当有任何疑问时,我都有一个非常简单的方法(在大多数情况下效果很好),即去检查相应的 RFC 文档。
JSON RFC 4627(JavaScript Object Notation (JSON) 的 application/json 媒体类型)是 JSON 格式的规范。它在第 6 节中说,JSON 文本的 MIME 媒体类型是
application/json.
JSONP JSONP(“带填充的 JSON”)在浏览器中的处理方式与 JSON 不同。 JSONP 被视为常规 JavaScript 脚本,因此它应该使用 application/javascript,
当前官方的 JavaScript MIME 类型。然而,在许多情况下,text/javascript
MIME 类型也可以正常工作。
请注意,text/javascript
已被 RFC 4329(脚本媒体类型)文档标记为过时,建议改用 application/javascript
类型。但是,由于遗留原因,text/javascript
仍然被广泛使用,并且它具有跨浏览器支持(application/javascript
MIME 类型并不总是这样,尤其是在旧浏览器中)。