什么是正确的JSON内容types?
我已经把JSON搞乱了一段时间,只是把它作为文本推出来,并没有伤害任何人(我知道的),但我想开始正确的做事。
我已经看到了很多JSON内容types的“标准”:
application/json application/x-javascript text/javascript text/x-javascript text/x-json
但是哪个是正确的,还是最好的? 我收集他们之间的安全和浏览器支持问题。
我知道还有一个类似的问题, 如果REST API返回JSON的MIMEtypes是什么? ,但我想要一个更有针对性的答案。
对于JSON文本:
JSON文本的MIME媒体types是
application/json
。 默认编码是UTF-8。 (来源: RFC 4627 )
对于带callback的JSONP :
application/javascript
以下是相关评论中提到的一些博客文章。
- 为什么你不应该使用
text/html
的JSON - Internet Explorer有时与
application/json
有问题 - 一个相当完整的Mimetypes列表以及使用它们的方法
IANA已经将JSON的官方MIMEtypes注册为application/json
。
当被问及为什么不是text/json
,Crockford似乎说JSON不是真正的JavaScript和文本,而且IANA更有可能将text/*
发给application/*
text/*
。
更多资源:
- 媒体types
- 征求意见4627
- bluesmoon:JSON有一个types
对于JSON:
Content-Type: application/json
对于JSON-P :
Content-Type: application/javascript
当然,JSON的正确MIME媒体types是application/json
,但是有必要了解应用程序中预期的数据types。
例如,我使用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响应types的情况下,浏览器build议我保存该文件。
服务器端使用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:
响应是dynamic生成的数据,根据URL中传递的查询参数。
例:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
内容types: application/json
JSON-P:
JSON与填充。 响应是JSON数据,其中包含一个函数调用。
例:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
内容types: application/javascript
如果您使用的是Ubuntu或Debian,并且通过Apache提供.json文件,则可能需要使用正确的内容types来提供文件。 我这样做主要是因为我想使用Firefox扩展JSONView
Apache模块mod_mime将帮助您轻松完成此操作。 但是,在Ubuntu中,您需要编辑文件/etc/mime.types并添加该行
application/json json
然后重启Apache:
sudo service apache2 restart
如果您从客户端调用ASP.NET Web服务,则必须使用application/json
才能正常工作。 我相信这与jQuery和Ext框架是一样的。
JSON的正确内容types是application/json
除非你使用的是JSONP ,也就是所谓的带有Padding的JSON,它实际上是JavaScript,所以正确的内容types是application/javascript
。
毫无疑问, application/json
是JSON响应的最佳MIMEtypes。
但我有一些经验,因为一些压缩问题,我不得不使用application/x-javascript
。 我的托pipe环境与GoDaddy共享托pipe。 他们不允许我改变服务器configuration。 我已经将下面的代码添加到我的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"/>
在静态和dynamictypes的部分。 但是这根本不压缩JSON响应。
之后,我删除了这个新添加的types,并添加
<add mimeType="application/x-javascript" enabled="true"/>
在静态和dynamictypes部分,并改变了响应types
.ashx(asynchronous处理程序)来
application/x-javascript
现在我发现我的JSON响应是用g-zip压缩的。 所以我个人推荐使用
application/x-javascript
只有当你想压缩你的JSON响应共享主机环境 。 因为在共享主机中,它们不允许您更改IISconfiguration。
只有在使用application/json
作为MIMEtypes时,我有以下几点(截至2011年11月,最新版本的Chrome,Firefox和Firebug ):
- 从服务器加载JSON时,不会再有来自Chrome的警告。
- Firebug将在响应中添加一个标签,显示格式化的JSON数据。 如果MIMEtypes不同,则只会显示为“响应内容”。
不是所有的内容types的application/json
作品。
如果您使用Ext JS表单提交上传文件,请注意,浏览器会parsing服务器响应,为<iframe>
创build文档。
如果服务器使用JSON发送返回对象,那么Content-Type
头部必须设置为text/html
,以便告诉浏览器将文本原样插入到文档主体中。
请参阅Ext JS 3.4.0 API文档 。
JSON是特定于域的语言 (DSL)和独立于JavaScript的数据格式,因此具有自己的MIMEtypesapplication/json
。 尊重MIMEtypes当然是客户端驱动的,所以text/plain
可以做字节传输,但是你会不必要地将解释推给供应商应用程序域 – application/json
。 你会通过text/plain
传输XML吗?
但是说实话,你select的MIMEtypes对于如何解释data- text/plain
或text/HTML
(当它不是HTML)就像是types擦除一样,对于客户来说是一种build议,以打字的语言。
我知道没有一个浏览器运行时会获取一个JSON文档,并将其作为一个JavaScript可访问的对象自动提供给运行时,而不需要干预,但是如果您正在使用一个残缺的客户端,则完全是另一回事。 但是,这不是全部的故事–RESTful JSON服务通常没有JavaScript运行时,但是并不能阻止他们使用JSON作为可行的数据交换格式。 如果客户是跛脚的…那么我会考虑通过一个Ajax模板服务,而不是HTML注入。
应用程序/ JSON!
如果您处于客户端环境中,则需要对支持良好的Web应用程序进行跨浏览器支持的调查。
正确的HTTP内容types应该是application/json
,正如其他人已经强调的那样,但是一些客户端不能很好地处理它,这就是为什么jQuery推荐默认的text/html
。
正确的答案是:
Content-Type: application/json
和其他人一样, application/json
是正确的答案。
但是还没有解释的是你提出的其他select是什么意思。
-
application/x-javascript
:application/javascript
之前的JavaScript的实验性MIMEtypesapplication/javascript
被制定为标准。 -
text/javascript
:现在已经过时了。 使用application/javascript
时,应该使用application/javascript
javascript。 -
text/x-javascript
:针对上述情况的实验性MIMEtypes。 -
text/x-json
:application/json
正式注册之前JSON的实验性MIMEtypes。
总而言之,只要你对内容types有任何疑问,你应该检查这个链接
在JSP中 ,你可以在页面指令中使用这个:
<%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%>
JSON的正确的MIME媒体types是application/json
。 JSP将使用它来向客户端发送响应。
“ application/json
”是正确的JSON内容types。
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 application/json
注册说
使用此媒体types的应用程序: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 没有列出其他任何媒体types ,实际上甚至application/javascript
现在已经过时了。 所以application/json
是唯一可能的正确答案。
浏览器支持是另一回事。
支持最广泛的非标准媒体typestext/json
或text/javascript
。 但是一些大牌甚至使用text/plain
。 更为奇怪的是由Flickr发送的Content-Type头,他使用text/xml
返回一个JSONstring。 也包括Google示例,用text/html
还有一个JSONstring进行响应。
例子:
curl -I http://ajax.googleapis.com:80/ajax/services/search/web\?q\=json
输出: Content-Type: text/html
curl -I https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93
输出: Content-Type: text/xml
正确的MIMEtypes是application/json
但
我经历了许多浏览器types或框架用户需要的情况:
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");
在Spring中,你有一个定义的types: MediaType.APPLICATION_JSON_VALUE
,它相当于application / json 。
application/json
在php中工作良好,可以存储数组或对象数据。
我使用此代码将数据放入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与填充,那么它将是application/jsonp
。 如果JSON没有填充,那么它将是application/json
。
为了处理这两个问题,使用'application / javascript'是一个很好的做法,不用担心是使用填充还是不使用填充。
对于JSON,我正在使用:
Content-Type: application/json
这在IETF的JSON数据交换格式7158提案中描述, 第1.2节:JSON的规范 。
如果您从JSON中的REST API获取数据,那么您必须使用内容types
For JSON data: Content-Type:application/json For HTML data: Content-Type:text/html, For XHTML data: Content-Type:application/xhtml+xml, For XML data: Content-Type:text/xml, application/xml
PHP开发人员使用这个:
<?php header("Content-type: application/json"); // Do something here... ?>
扩展接受的响应,当您在REST环境中使用JSON时…
在代表REST资源和集合时,有一个关于使用application/x-resource+json
和application/x-collection+json
的强烈争论 。
如果你决定遵循jsonapi规范, 你应该使用application/vnd.api+json
,就像它被logging的那样。
尽pipe没有一个通用的标准,但很显然,被转移的资源所增加的语义certificate了一个比application/json
更明确的Content-Type 。
根据这个推理,其他上下文可以certificate更具体的内容types 。
JSON (JavaScript对象表示法)和JSONP (“带填充的JSON”)格式似乎非常相似,因此可能非常混淆他们应该使用的MIMEtypes。 尽pipe格式似乎非常相似,但它们之间有一些细微的差别。
所以无论什么时候有什么疑问,我都有非常简单的方法(在大多数情况下完美的find了),即去检查相应的RFC文档。
JSON RFC 4627 (用于JavaScript对象表示法(JSON)的应用程序/ json媒体types)是JSON格式的规范。 它在第6节说,JSON文本的MIME媒体types是
application/json.
JSONP JSONP(“带填充的JSON”)在浏览器中的处理方式与JSON不同。 JSONP被视为一个普通的JavaScript脚本,因此它应该使用application/javascript,
这是JavaScript的官方MIMEtypes。 然而,在很多情况下, text/javascript
MIMEtypes也可以正常工作。
请注意, text/javascript
已被RFC 4329 (Scripting Media Types)文档标记为废弃,build议使用application/javascript
types。 但是,由于遗留的原因, text/javascript
仍然被广泛使用,它具有跨浏览器的支持(对于application/javascript
MIMEtypes,并不总是这种情况,特别是在较老的浏览器中)。
Content-type: application/json,json Content-Type: application/javascript, json-P Content-type: application/x-javascript, javascript Content-type: text/javascript, javascript BUT obsolete, older IE versions used to use as html attribute Content-type: text/x-javascript, JavaScript Media Types BUT obsolete Content-type: text/x-json, json before application/json got officially registered.