YAML媒体类型?

164

当使用YAML结构化数据通过HTTP发送时,最适合的媒体类型(正式MIME类型)是什么以及为什么?

我没有看到任何已注册的应用程序类型文本类型

示例:

> GET /example.yaml

< Content-Type: ????
<
< --- # Favorite movies
< - Casablanca
< - North by Northwest
< - Notorious

可能的选项:

  • text/x-yaml
  • text/yaml
  • text/yml
  • application/x-yaml
  • application/x-yml
  • application/yaml
  • application/yml
9个回答

99

Ruby on Rails使用application/x-yaml作为首选格式,备选格式是text/yaml (来源)。

据我所知,这只是一种惯例,没有技术上的原因。


100
这并不完全正确。以"text/"开头的MIME类型应该被处理为ISO-8859-1,除非另一种MIME类型被明确声明(例如"text/html; charset=utf-8")。以"application/"开头的MIME类型应该被处理为UTF-8,除非另一种MIME类型被明确声明。例如,"text/x-yaml"不能使用UTF-8字符,而"text/x-yaml; charset=utf-8"和"application/x-yaml"可以。据我所知,这在RFC 3023中有定义。 - Ryan Parman
3
你有点混淆了字符集和 MIME 类型。你说的没错,如果没有显式指定 charset= 参数,text/* 会被假定为 ISO-8859-1 字符集,但是 application/* 中的内容不一定是文本。你提供的 RFC 是关于 XML 的,不确定它与此相关。 - Thanatos
4
@RyanParman 不正确。https://tools.ietf.org/html/rfc6838#section-4.2.1 表示:“如果指定了“charset”参数,则应该是一个必需的参数,从而消除了指定默认值的选项。如果有充分的理由使该参数可选,尽管这样做不明智,每个子类型都可以指定自己的默认值,或者它也可以指定没有默认值。最后,“UTF-8”字符集[RFC3629]应该被选择为默认值。”由于text/yamltext/x-yaml没有正式的定义,所以默认值为UTF-8。 - aef
10
RFC 3023,包括编码处理方式,在2014年被https://tools.ietf.org/html/rfc7303#section-3所废止。在RFC 2046中,默认使用“US-ASCII”(注意:不是“ISO-8859-1”)作为“text/*”媒体类型的规则已经被https://tools.ietf.org/html/rfc6838#section-4.2.1中的“无论采用哪种方法,所有新的text/*注册必须明确指定字符集的确定方式; 不再允许依赖[RFC2046]的4.1.2节中定义的US-ASCII默认值。”所取代,该规定于2013年1月生效。据我所知,RFC 3023和RFC 7303并未通用地涉及“text/*”。 - aef
6
你当时的结论可能是正确的,但你错误地引用了 RFC 3023,实际上规则来自于 RFC 2046。然而,现在对于每个未在其 IANA 注册中声明不同的“text/*”媒体类型,默认值都是 UTF-8。 - aef
显示剩余4条评论

36

虽然另一个答案被接受了,但是请参考这个在IANA邮件列表中关于媒体类型的审查媒体类型注册提案的讨论 Proposed media type registration for YAML,其中Ben Harris, University of Cambridge Information Services代表YAML团队在2015年7月提出该媒体类型:

text/vnd.yaml

使用(建议弃用)的别名:

text/yaml
text/x-yaml
application/x-yaml
那仍然是提议/待定状态(帖子没有表明提议的状态),因此这个答案并不比其他答案更权威 :-)

17
截至2018年1月,该提议似乎没有进展,我试图联系作者,但未收到回复。 - djb
3
该提案已更新为 application/yaml。他们正在废弃 text/yaml,并且不鼓励使用 'x-'。但是,text/yaml会导致浏览器显示而非下载,因此我认为他们废弃这种媒体类型是错误的。 - carlin.scott
1
还有一个关于application/yaml的提案:https://www.ietf.org/archive/id/draft-ietf-httpapi-yaml-mediatypes-00.html#name-media-type-application-yaml - Adam B

19

我会选择text/x-yaml:

text优于application,因为它易于人类阅读

x-yaml优于yaml,因为它尚未被接受到mime类型的注册列表中。

编辑:来自RFC 3023(XML媒体类型):

顶级媒体类型“text”对MIME实体有一些限制,并在[RFC2045]和[RFC2046]中进行了描述。特别是不允许使用UTF-16系列、UCS-4和UTF-32(除非使用类似MIME的机制的HTTP [RFC2616])。

有趣的发现...还不太确定它的意思,但是值得思考。


1
它是可读性强的,但其目的是为了传达应用程序……XML是应用程序的一部分。 - Vinko Vrsalovic
还有在文本下面。看起来你需要同时拥有text/x-yaml和application/x-yaml... http://www.rfc-editor.org/rfc/rfc3023.txt - Vinko Vrsalovic
就算不值得一提,这也是 Django 的 TastyPie REST 实现能够理解的。 - Michael Scheper
3
但是 JSON 也是人类可读的,对吗?我认为说 application/yaml 才更加一致,就像我们会说 application/jsonapplication/xml 一样。 - Anthony Rutledge
@AnthonyRutledge - JSON 可读性与十六进制汇编代码相同,非常痛苦(与 YAML 相比)。我认为 XML 也是如此。YAML 在配置文件中被广泛使用,正是因为它易于人类阅读和编写。 - dsz

19
在 Chrome 中,application/yaml 会下载,而 text/yaml 则会显示。

13

10
"

"x-"媒体类型不建议使用,请参见RFC 4288,第3.4节。正确的做法是使用个人树、供应商树或尝试进行适当的媒体类型注册。

"

那将是 application/vnd.yamltext/vnd.yaml(似乎 text 更好) - wires
5
并非完全正确。唯一可以在未向 IANA 登记的情况下使用的子类型树是 x.,而 vnd.prs. 则需要进行登记。请参阅 https://tools.ietf.org/html/rfc6838#section-3.2 和 https://tools.ietf.org/html/rfc6838#section-3.3。 - aef

1

我在相关的MIME类型为TOML文件格式的讨论中读到了这篇非常有趣的文章。

application/* vs text/*

根据RFC (https://tools.ietf.org/html/rfc2046#section-3):

其他子类型用于富文本表单,应用软件可以增强文本的外观,但不需要依赖该软件才能理解内容的基本概念。因此,“text”的可能子类型包括任何可以在不使用理解该格式的软件的情况下读取的文字处理格式。

来自评论 https://github.com/toml-lang/toml/issues/465#issuecomment-306231107

基于此,我认为文本的子类型更适合用于非结构化(但可能格式化)的文本,而应用程序似乎更适合于结构化数据,例如TOML。虽然TOML强调人类可读性,但它仍然是一种数据格式,旨在被应用程序读取。相比之下,Markdown文件(text/markdown)传达其全部含义,而无需进一步由应用程序处理,而TOML文件通常在其配置的应用程序上下文之外是没有意义的。
我们可以对YAML格式说同样的话,所以我个人更喜欢使用application/*。
另一个支持application/*的论点是YAML是JSON的超集,MIME类型application/json用于JSON。
application/yaml与application/x-yaml
除非MIME类型已正式注册(假设有人计划这样做),否则应使用application/x-*。

由于YAML(以及TOML)尚未正式注册,最好使用x-前缀,因此我们得到application/x-yaml

有趣的事实:TOML 官方文档建议即使还没有正式注册也要使用application/toml。但并不是每个人都认为这是正确的决定。

Postman使用application/x-yaml

再一个使用此类MIME类型的理由:) Postman uses application/x-yaml


1
我不确定是将这个发表为答案还是作为对另一个答案的评论。(由于内容较长,我选择将其作为独立的答案发布。) 然而,我也在思考同样的问题,并且我在 IANA 列表中进行了搜索。
目前(2023-05-13),有一个草案条目可以在 IANA 列表中注册 YAML。将其注册为以下 MIME 类型:
application/yaml

然而,它尚未添加,我不知道整个过程还要持续多久。
草案06的IANA状态:
IANA review state:
  Version Changed - Review Needed

IANA expert review state:
  Need IANA Expert(s)

位置:需要审核,意味着:文档尚未由IANA审查。 [ review-state ]

更新(2023-06-06)

第07版草案的审核状态已更改为:

IANA review state               IANA OK - Actions Needed
IANA action state               In Progress
IANA expert review state        Expert Reviews OK 

在这里,IANA OK - Actions Needed的意思是:文档需要 IANA 进行操作,并且 IANA 考虑部分正确地指示了操作的详细信息。In Progress的意思是:IANA 目前正在处理此文档的操作,而Expert Reviews OK的意思是:所有专家评审已经完成,没有任何阻碍问题

也就是说,看起来我们将在今年年底之前(2023年)获得一个媒体类型。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接