long类型 - 什么是正确的JSON内容类型?




json格式化 (20)

我一直在搞JSON一段时间,只是把它作为文本推出它并没有伤害任何人(我知道),但我想开始正确地做事。

我已经看到了许多声称的JSON内容类型的“标准”:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

但哪个是正确的,还是最好的? 我认为它们之间存在安全性和浏览器支持问题。

我知道有一个类似的问题, 如果REST API返回JSON那么MIME类型是什么? ,但我想要一个稍微有针对性的答案。


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:

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

例:

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

Content-Type: application/json

JSON-P:

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

例:

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

内容类型: application/javascript


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

但老实说,你对MIME类型的选择是建议客户端如何解释数据text/plain text/HTMLtext/HTML (当它不是HTML时)就像类型擦除一样 - 它就像制作所有类型为Object的对象一样无法提供信息用打字语言。

我所知道的浏览器运行时没有采用JSON文档并自动将其作为JavaScript可访问对象提供给运行时而无需干预,但如果您正在使用残缺客户端,那就完全不同了。 但这不是整个故事 - RESTful JSON服务通常没有JavaScript运行时,但它并没有阻止它们使用JSON作为可行的数据交换格式。 如果客户端瘫痪......那么我会考虑通过Ajax模板服务来注入HTML。

应用程序/ JSON!


JSON的正确内容类型是application/json除非你正在使用JSONP ,也称为带有Padding的JSON,它实际上是JavaScript,所以正确的内容类型是application/javascript



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

因此,无论什么时候怀疑,我都有非常简单的方法(在大多数情况下都可以很好地找到),即去检查相应的RFC文档。

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

application/json.

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

请注意, rfc-editor.org/rfc/rfc4329.txt (脚本媒体类型)文档已将text/javascript标记为已过时,建议使用application/javascript类型。 但是,由于遗留原因, text/javascript仍然被广泛使用,并且它具有跨浏览器支持(对于application/javascript MIME类型并不总是如此,特别是对于旧版浏览器)。


对于JSON:

Content-Type: application/json

对于JSONP

Content-Type: application/javascript

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

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

JSP ,您可以在page指令中使用它:

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

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


Spring您有一个已定义的类型: MediaType.APPLICATION_JSON_VALUE ,它等同于application / json


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

要处理这两个问题,最好使用:'application / javascript',而不用担心是填充还是填充。


如果从JSON中的REST API获取数据,则必须使用content-type

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

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

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

application/json json

然后重启Apache:

sudo service apache2 restart

如果您处于客户端环境中,那么对于支持良好的Web应用程序,必须调查跨浏览器支持。

正确的HTTP Content-Type将是application/json ,因为其他人已经突出显示,但是有些客户端没有很好地处理它,这就是jQuery推荐默认text/html



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

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

如果服务器使用JSON发送返回对象,则必须将Content-Type标头设置为text/html ,以告知浏览器将文本未更改地插入到文档正文中。

请参阅Ext JS 3.4.0 API文档


我用下面的

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

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

但尚未解释的是你提出的其他选择意味着什么。

  • application/x-javascriptapplication/javascript标准之前JavaScript的实验MIME类型。

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

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

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

总而言之,只要您对内容类型有任何疑问,就应该查看此链接


正确答案是:

Content-Type: application/json

毫无疑问, 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配置。







content-type