我应该使用哪种 JSON content type (内容类型) ?

JSONContent type 内容类型有许多“标准”:

application/jsonapplication/x-javascripttext/javascripttext/x-javascripttext/x-json

那么具体我应该在什么地方使用那种 content type ?我假设安全性和浏览器支持问题是一个考虑因素。

相关:如果 JSON 被 REST API 返回,应该返回什么 MIME类型?

3636147 次浏览

对于JSON文本:

application/json

JSON文本的MIME媒体类型是application/json。默认编码是UTF-8。(来源:RFC 4627)

对于JSONP(可运行的JavaScript)和回调:

application/javascript

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

如果您从客户端调用ASP.NETWeb服务,您必须使用application/json才能使其工作。我相信jQueryExt框架也是如此。

当然,JSON的正确MIME媒体类型是application/json,但有必要了解应用程序中预期的数据类型。

例如,我使用ExtGWT,服务器响应必须作为text/html,但包含JSON数据。

客户端,Ext GWT表单侦听器

uploadForm.getForm().addListener(new FormListenerAdapter(){@Overridepublic void onActionFailed(Form form, int httpStatus, String responseText){MessageBox.alert("Error");}
@Overridepublic void onActionComplete(Form form, int httpStatus, String responseText){MessageBox.alert("Success");}});

如果使用应用程序名称响应类型,浏览器建议我保存文件。

服务器端源代码片段使用Spring MVC

return new AbstractUrlBasedView(){@SuppressWarnings("unchecked")@Overrideprotected void renderMergedOutputModel(Map model, HttpServletRequest request,HttpServletResponse response) throws Exception{response.setContentType("text/html");response.getWriter().write(json);}};

IANA已将JSON的官方MIME类型注册为#0

当被问及为什么不是text/json时,Crockford似乎说JSON不是真正的JavaScript也不是文本,而且IANA更有可能分发application/*而不是text/*

更多资源:

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

Apache模块mod_mime将有助于轻松完成此操作。但是,使用Ubuntu,您需要编辑文件/etc/mime.types并添加行

application/json json

然后重新启动Apache:

sudo service apache2 restart

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

如果您使用ExtJS表单提交上传文件,请注意浏览器解析服务器响应以创建<iframe>的文档。

如果服务器使用JSON发送返回对象,则必须将Content-Type标头设置为text/html,以便告诉浏览器将文本原封不动地插入文档正文。

Ext JS 3.4.0 API留档

仅当使用application/json作为MIME类型时,我有以下内容(截至2011年11月,Chrome的最新版本,FirefoxFirebug):

  • 从服务器加载JSON时,不再有来自Chrome的警告。
  • Firebug会在响应中添加一个选项卡,显示JSON数据格式化。如果MIME类型不同,它只会显示为响应内容

JSON的正确内容类型是application/json,除非您使用JSONP,也称为带有填充的JSON,实际上是JavaScript,因此正确的内容类型是application/javascript

毫无疑问,application/json是JSON响应的最佳MIME类型。

但是我有一些经验,因为一些压缩问题,我不得不使用application/x-javascript。我的主机环境与Go爸爸共享主机。他们不允许我更改服务器配置。我在我的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配置。

如果您在客户端环境中,对于支持良好的Web应用程序,调查跨浏览器支持是强制性的。

正确的HTTP Content-Type应该是application/json,正如其他人已经突出显示的那样,但是一些客户端不能很好地处理它,这就是为什么jQuery推荐默认的text/html

JSON是领域特定语言(DSL)和独立于JavaScript的数据格式,因此有自己的MIME类型,application/json。对MIME类型的尊重当然是客户端驱动的,所以text/plain可能适用于字节的传输,但那样你就会不必要地将解释推高到供应商应用程序域-application/json。你会通过text/plain传输XML吗?

但老实说,你选择的MIME类型是给客户端关于如何解释数据的建议——text/plaintext/HTML(当它不是超文本标记语言时)就像类型擦除一样——它就像用类型化语言制作所有类型为Object的对象一样没有信息。

据我所知,没有任何浏览器运行时会接受JSON文档并在没有干预的情况下自动将其作为JavaScript可访问对象提供给运行时,但如果你正在使用一个瘫痪的客户端,那是完全不同的事情。但这并不是故事的全部——RESTful JSON服务通常没有JavaScript运行时,但这并不能阻止他们使用JSON作为一种可行的数据交换格式。如果客户端如此瘫痪……那么我可能会考虑通过Ajax模板服务进行超文本标记语言注入。

应用程序/JSON!

对于JSON:

Content-Type: application/json

对于JSON-P

Content-Type: application/javascript

正确答案是:

Content-Type: application/json

JSP中,您可以在页面指令中使用此命令:

<%@ page language="java" contentType="application/json; charset=UTF-8"pageEncoding="UTF-8"%>

JSON正确的MIME媒体类型是application/json。JSP将使用它向客户端发送响应。

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:

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

示例:

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

内容类型application/json


JSON-P:

带有填充的JSON。响应是JSON数据,它包含一个函数调用。

示例:

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

内容类型application/javascript

正如许多人提到的,application/json是正确的答案。

但还没有解释的是你提出的其他选择是什么意思。

  • application/x-javascript:在application/javascript成为标准之前,JavaScript的实验性MIME类型。

  • text/javascript:现在已经过时了。使用javascript时应该使用application/javascript

  • text/x-javascript:上述情况的实验MIME类型。

  • text/x-json:在application/json正式注册之前的JSON的实验MIME类型。

总而言之,每当您对内容类型有任何疑问时,您应该检查此链接

正确的MIME类型是#0

但是

我经历了许多浏览器类型或框架用户需要的情况:

text/html
application/javascript

我用下面的

contentType: 'application/json',data: JSON.stringify(SendData),

如果JSON是带填充的,那么它将是application/jsonp。如果JSON没有填充,那么它将是application/json

要同时处理这两个问题,最好使用:“应用程序/javascript”,而不必考虑它是带填充还是不带填充。

Spring中,您有一个定义的类型:MediaType.APPLICATION_JSON_VALUE,它等价于应用程序名称

发布时字段类型标头应设置为“应用程序名称”。侦听请求的服务器应包括“接受=应用程序/json”。在Spring MVC中,你可以这样做:

@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")

将标题添加到响应中:

HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", "application/json");

IANA注册#0

使用此媒体类型的应用程序:JSON已用于在所有这些编写的应用程序之间交换数据编程语言: ActionScript, C, C#, Clojure, ColdFusion,Common Lisp、E、Erlang、Go、Java、JavaScript、Lua、ObjectiveCAML、Perl、PHP、Python、Rebol、Ruby、Scala和方案。

你会注意到IANA.org没有列出任何其他媒体类型,实际上连application/javascript都已经过时了。所以application/json实际上是唯一可能的正确答案。

浏览器支持是另一回事。

最广泛支持的非标准媒体类型是text/jsontext/javascript。但一些大牌甚至使用text/plain

更奇怪的是Flickr发送的Content-Type标头,它将JSON返回为text/xml。Google对其一些ajax api使用text/javascript

示例:

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

PHP开发人员使用这个:

<?phpheader("Content-type: application/json");
// Do something here...?>

对于JSON,我使用:

Content-Type: application/json

这在IETF的JSON数据交换格式7158提案第1.2节:JSON规范中进行了描述。

application/json在PHP中非常适合存储数组或对象数据。

我使用此代码将数据放在设置为公开可见谷歌云存储(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"));

扩展接受的响应,当您在REST上下文中使用JSON时…

当您表示REST资源和集合时,有一个关于使用application/x-resource+jsonapplication/x-collection+json强有力的论点

如果您决定遵循jsonapi规范,你应该使用application/vnd.api+json,如文档所示。

尽管没有一个通用的标准,但很明显,被转移的资源的附加语义证明了字段类型application/json更明确。

按照这个推理,其他上下文可以证明更具体的字段类型

JSON(JavaScript Object Notation)和JSONP(“带填充的JSON”)格式似乎非常相似,因此可能会非常混淆它们应该使用哪种MIME类型。即使格式相似,它们之间也有一些细微的差异。

因此,每当有任何疑问时,我都有一个非常简单的方法(在大多数情况下效果非常好),即去检查相应的RFC文档。

JSONrfc4627(JavaScript对象表示法(JSON)的应用程序/json媒体类型)是JSON格式的规范。它在第6节中说,JSON文本的MIME媒体类型是

application/json.

JSONPJSONP(“带填充的JSON”)在浏览器中的处理方式与JSON不同。JSONP被视为常规JavaScript脚本,因此它应该使用application/javascript,当前JavaScript的官方MIME类型。然而,在许多情况下,text/javascript MIME类型也可以正常工作。

请注意,text/javascript已被rfc4329(脚本媒体类型)文档标记为过时,建议使用application/javascript类型。然而,由于遗留原因,text/javascript仍然被广泛使用,并且它具有跨浏览器支持(application/javascript MIME类型并非总是如此,尤其是在旧浏览器中)。

如果您使用JSON从REST API获取数据,则必须使用内容类型

  • 对于JSON数据:内容-类型:应用程序/json
  • 对于超文本标记语言数据:内容-类型:文本/html
  • 对于XHTML数据:内容-类型:应用程序/xhtml+xml
  • 对于XML数据:Content-Type:文本/xml,应用程序/xml

为了指定有趣的JSON结果,您可以在请求标头中添加“应用程序/json”,如下所示:

“接受:应用程序/json”是所需的响应格式。

“Content-Type: apps/json”指定了您请求的内容格式,但有时您同时指定application/jsonapplication/xml,但它们的质量可能不同。哪个服务器会发回不同的响应格式,请看示例:

Accept:application/json;q=0.4,application/xml;q=8

这将返回XML,因为XML具有更高的质量。

正确的当前标准是application/json。虽然默认编码是UTF-8,但值得一提的是,它也可以是UTF-16或UTF-32。当JSON以UTF-16或UTF-32编写时,必须使用二进制内容传输编码。

RFC 4627:JavaScript对象表示法(JSON)的应用程序/json媒体类型中有更多关于JSON的信息

有关二进制传输编码的更多信息,请参阅5.内容传输编码头字段(RFC 1341)。

为了补充前面的答案,JSON链接数据(JSON-LD)根据w3c的MIME类型是:

application/ld+json

类型名称:应用

子类型名称: ld+json

从同一来源:

文件扩展名

.jsonld

  • Content-Type: application/json-JSON
  • Content-Type: application/javascript-JSON-P
  • Content-Type: application/x-javascript-JavaScript
  • Content-Type: text/javascript-JavaScript已过时。较旧的Internet Explorer版本用于超文本标记语言属性。
  • Content-Type: text/x-javascript-JavaScript媒体类型,过时
  • Content-Type: text/x-json-应用程序名称之前的JSON正式注册。

由于您可能需要更频繁地使用这些内容,因此请始终尝试记住这三种内容类型,即使有许多内容类型

  • 应用类型:应用程序/json
  • Content-Type:应用程序/xml
  • 内容类型:文本/html

你的问题的一部分与我有关,因为我刚刚遇到它。

第三方提供商正在提供一个由多个客户端使用的REST服务。这是一个直接的REST调用,带有查询参数,返回格式良好的JSON。我已经用PHP测试了它,并Java它在哪里按预期工作。

我的客户端使用Oracle服务总线作为他的应用程序服务器和Internet之间的网关。当我创建OSB服务时,它因Invalid message format错误而崩溃。结果返回的content-typetext/html。OSB根据这个标头处理响应;在文本、XML和JSON之间转换。在这种情况下,响应是JSON,但标头没有这么说。联系提供商,我得到了回复:“我们不会改变它,因为它不影响其他人”。

标题Content-Type指定的是内容应该是什么,而不是内容实际上是什么。也就是说,在您的消费程序中,您可以检查或忽略它并以任何方式处理内容。另一个例子,您可以返回GIF数据,但将内容类型指定为JSON,然后继续忽略标题并读取图像数据。这不会伤害您的程序,但可能会伤害其他人。

故事的寓意:玩得好。

作为一些研究,

最常见的MIME类型是

应用程序名称

让我们看一个区分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"}]

  • 应用程序/javascript

它在预定义数据使用时使用。它由客户端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媒体类型)中的完整详细信息。

这取决于观点。

如果您是发送请求的客户端,那么application/json是正确的选择。

但是如果您是接收请求的服务器,您必须做好准备,客户端也可能发送编码。所以application/jsonapplication/json; charset=utf-8是有效的。

两种情况下的媒体类型相同。但内容类型不同。

最常见的mime类型是Application/json。以下是所有JSON内容类型的列表:

  • Content-Type: application/json-JSON
  • Content-Type: text/x-json-应用程序名称之前的JSON正式注册。
  • Content-Type: application/javascript-JSON-P
  • Content-Type: application/x-javascript-JavaScript

过时的类型:

  • Content-Type: text/javascript-JavaScript已过时。较旧的Internet Explorer版本用于超文本标记语言属性。
  • Content-Type: text/x-javascript-JavaScript媒体类型,过时