[英]What is the correct JSON content type?
JSON内容类型有许多“标准”:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
哪个最好? 我认为安全和浏览器支持问题是一个因素。
IANA已将 JSON 的官方 MIME 类型注册为application/json
。
当被问及为什么不是text/json
时,Crockford 似乎说 JSON 不是真正的 JavaScript 也不是 text,而且 IANA 更有可能分发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 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
。
如果您使用Ext JS表单提交来上传文件,请注意浏览器会解析服务器响应以创建<iframe>
的文档。
如果服务器使用 JSON 发送返回对象,则Content-Type
标头必须设置为text/html
以告诉浏览器将未更改的文本插入到文档正文中。
JSON 是一种领域特定语言(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 类型。
text/javascript
:现在已过时。 使用 javascript 时应使用application/javascript
javascript。
text/x-javascript
:上述情况的实验性 MIME 类型。
text/x-json
:在application/json
正式注册之前 JSON 的实验性 MIME 类型。
总而言之,每当您对内容类型有任何疑问时,都应该查看 此链接
“ 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())
}
}
使用这种媒体类型的应用程序: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 没有列出任何其他媒体类型,事实上,即使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 中可以很好地存储数组或对象数据。
我使用此代码将数据以 JSON 格式放在设置为公开可见的Google Cloud Storage (GCS)上:
$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"));
Content-Type: application/json
- JSONContent-Type: application/javascript
- JSON-PContent-Type: application/x-javascript
- JavaScriptContent-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 带有填充,那么它将是application/jsonp
。 如果 JSON 没有填充,那么它将是application/json
。
为了同时处理这两种情况,使用:'application/javascript' 是一个很好的做法,而不用担心它是带填充还是不带填充。
如果您以 JSON 格式从 REST API 获取数据,则必须使用Content-Type :
PHP 开发人员使用这个:
<?php
header("Content-type: application/json");
// Do something here...
?>
JSON (JavaScript 对象表示法)和JSONP (“带填充的 JSON”)格式似乎非常相似,因此它们应该使用哪种 MIME 类型可能会非常混乱。 即使格式相似,它们之间也存在一些细微的差异。
因此,每当有任何疑问时,我都有一个非常简单的方法(在大多数情况下效果很好),即去检查相应的 RFC 文档。
JSON RFC 4627 (The application/json Media Type for JavaScript Object Notation (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 类型并不总是这样,尤其是在旧浏览器中)。
正确的当前标准是application/json
。 虽然默认编码是 UTF-8,但值得一提的是它也可以是 UTF-16 或 UTF-32。 当 JSON 以 UTF-16 或 UTF-32 编写时,必须使用二进制内容传输编码。
RFC 4627 中有关于 JSON 的更多信息:JavaScript Object Notation (JSON) 的 application/json 媒体类型
有关二进制传输编码的更多信息,请参见5. Content-Transfer-Encoding Header Field (RFC 1341)。
为了补充前面的答案,根据 W3C的 JSON 链接数据 (JSON-LD) 的 MIME 类型是:
application/ld+json
类型名称:应用程序
子类型名称: ld+json
此外,来自同一来源:
文件扩展名:
.jsonld
由于您可能不得不更频繁地使用这些内容,因此即使有很多内容类型,也请始终尝试记住这三种内容类型:
要指定有趣的 JSON 结果,请在请求标头中添加“application/json”,如下所示:
“Accept:application/json”是所需的响应格式。
"Content-Type:application/json" 指定请求的内容格式,但有时您同时指定application/json
和application/xml
,但它们的质量可能不同。 哪个服务器会发回不同的响应格式,看例子:
Accept:application/json;q=0.4,application/xml;q=8
这将返回 XML,因为 XML 具有更高的质量。
作为一些研究,
最常见的 MIME 类型是
应用程序/json
让我们看一个区分 JSON 和 JavaScript 的示例。
当不知道如何使用这些数据时使用它。 当信息要以 JSON 格式从服务器中提取时,它可能是通过链接或从任何文件中提取的,在这种情况下,它会被使用。
例如-
<?php
header('Content-type:application/json');
$directory = [
['Id' => 1, 'Name' => 'this'],
['Id' => 2, 'Name' => 'is'],
['Id' => 3, 'Name' => 'Stack Overflow'],
];
// Showing the JSON data
echo json_encode($directory);
?>
输出是,
[{"Id":1, "Name":"this"}, {"Id":2, "Name":"is"}, {"Id":3, "Name":"Stack Overflow"}]
它在预定义数据的使用时使用。 它由客户端 Ajax 应用程序调用的应用程序使用。 当数据是 JSON-P 或JSONP类型时使用它。
例如
<?php
header('Content-type:application/javascript');
$dir = [
['Id' => 1, 'Name' => 'this' ],
['Id' => 2, 'Name' => 'is'],
['Id' => 3, 'Name' => 'Stack Overflow'],
];
echo "Function_call(" . json_encode($dir) . ");";
?>
输出是,
Function_call([{"Id":1, "Name":"this"}, {"Id":2, "Name":"is"}, {"Id":3, "Name":"Stack Overflow"}])
对于其他 MIME 类型,请参阅MIME 类型(IANA 媒体类型)中的完整详细信息。
你的问题的一部分与我有关,因为我刚刚遇到它。
第三方提供商正在提供可供多个客户端使用的 REST 服务。 它是一个简单的 REST,使用返回格式良好的 JSON 的查询参数调用。 我已经用 PHP 和 Java 对其进行了测试,它按预期工作。
我的客户使用 Oracle Service Bus 作为其应用程序服务器和 Internet 之间的网关。 当我创建 OSB 服务时,它因Invalid message format
错误而崩溃。 原来返回的content-type
是text/html
。 OSB 按照此标头处理响应; 在文本、XML 和 JSON 之间进行转换。 在这种情况下,响应是 JSON,但标头没有说明。 联系提供商,我得到了答复:“我们不会更改它,因为它不会影响其他任何人”。
Content-Type
标头指定内容应该是什么,而不是它实际上是什么。 也就是说,在您的消费程序中,是否检查或忽略它并以任何方式处理内容取决于您。 另一个例子,您可以返回 GIF 数据,但将内容类型指定为 JSON,然后继续忽略标头并读取图像数据。 这不会伤害您的程序,但可能会伤害其他人。
故事的寓意:玩得好。
这取决于观点。
如果您是发送请求的客户端,那么application/json
是正确的选择。
但是如果你是接收请求的服务器,你必须做好准备,客户端也可能发送编码。 所以application/json
和application/json; charset=utf-8
application/json; charset=utf-8
有效。
两种情况下的媒体类型相同。 但内容类型不同。
最常见的MIME 类型是 application/json。 以下是所有 JSON 内容类型的列表:
Content-Type: application/json
- JSONContent-Type: text/x-json
- application/json正式注册之前的 JSON。Content-Type: application/javascript
- JSON-PContent-Type: application/x-javascript
- JavaScript过时的类型:
Content-Type: text/javascript
- JavaScript但已过时。 旧的 Internet Explorer 版本用于将其用于 HTML 属性。Content-Type: text/x-javascript
- JavaScript 媒体类型,但已过时Content-Type 是一个 HTTP 标头,用于指示资源的媒体类型,在响应的情况下,它告诉浏览器返回内容的实际内容类型是什么。 如果有任何 POST 或 PUT 请求,客户端会告诉服务器发送的数据类型。
所以我们通过在 Content-Type 中提到它来设置它的 MIME 类型。 我们可以通过两种方式做同样的事情:
MIME 类型:application/json MIME 类型:application/javascript
MIME 类型:application/json在不知道如何使用这些数据时使用。 当仅以 JSON 格式从服务器提取信息时,它可能是通过链接或从任何文件中提取的,在这种情况下,将使用它。 在这里,客户端只获取JSON格式的数据,可以作为数据的链接,可以被任何前端框架实时格式化
Content-Type:application/json
MIME 类型:application/javascript预定义数据的使用时使用。 它由客户端 ajax 应用程序调用的应用程序使用。 当数据为 JSON-P 或 JSONP 类型时使用。 当 API 包含在函数调用中时,使用 JSONP 或 JavaScript Object Notation with Padding。
Content-Type:application/javascript
用代码解释这一点:
const applicationJson = { hello: "world" };
const textJson = '{ hello: "world" }';
JSON 文本的媒体类型是application/json
。 您可以在此表中查看流行扩展的 MIME 类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.