ContentType和MimeType有什么区别


103

据我所知,它们是绝对平等的。但是,浏览一些django文档,我发现了这段代码:

HttpResponse.__init__(content='', mimetype=None, status=200, content_type='text/html')

令我惊讶的是两个人相处得很好。官方文档能够以实用的方式解决此问题:

content_type是mimetype的别名。从历史上讲,此参数仅称为mimetype,但是由于它实际上是HTTP Content-Type标头中包含的值,因此它还可以包含字符集编码,这使其不仅限于MIME类型规范。如果指定了mimetype(不是None),则使用该值。否则,将使用content_type。如果两者都不给出,则使用DEFAULT_CONTENT_TYPE设置。

但是,我认为它不够清楚。为什么我们为(几乎相同的)事物使用2种不同的命名?“ Content-Type”只是浏览器请求中使用的名称,而在其外部很少使用吗?

两者之间的主要区别是什么,什么时候可以打电话给对方mimetype而不是content-type?我是卑鄙的语法纳粹吗?

Answers:


54

为什么我们为(几乎相同的)事物使用2种不同的命名?“ Content-Type”只是浏览器请求中使用的名称,而在其外部很少使用吗?

两者之间的主要区别是什么,何时称呼某种mimetype而不是content-type才是正确的?我是可怜的纳粹语法吗?

原因不仅是向后兼容,而且恐怕通常出色的Django文档对此有些不易理解。MIME(至少值得阅读Wikipedia条目确实很值得)起源于扩展Internet邮件,尤其是SMTP。从那里开始,MIME和受MIME启发的扩展设计已经在许多其他协议(例如此处的HTTP)中找到了应用,当需要在现有协议中传输新型元数据或数据时,它仍在使用。有数十个RFC讨论了用于多种目的的MIME。

具体来说,Content-Type:是几个MIME标头之一。“ Mimetype”确实确实过时了,但是对MIME本身的引用却不是。如果可以的话,将该部分称为后向兼容性。

[BTW,这纯粹是一个术语问题,与语法无关。提出“语法”下的每个用法问题都是我的宠儿。咕rr


49

我一直将contentType视为mimeType的超集。唯一的区别是可选字符集编码。如果contentType不包含可选字符集编码,则它与mimeType相同。否则,mimeType是字符集编码序列之前的数据。

例如 text/html; charset=UTF-8

text/html是mimeType
;是附加参数指示符
charset=UTF-8是字符集编码参数

例如 application/msword

application/msword是mimeType,
它不能具有字符集编码,因为它描述的格式octet-stream不直接包含字符。


1
这是正确的答案。设置响应mime_type(不是content_type)不会覆盖字符集,并且保持为UTF-8。
Mikko Ohtamaa 2014年

MIME类型有时简称为“媒体类型”,正如您所说的媒体类型。在某些规范中,我们将看到术语“可解析的MIME类型”,其中包括对Content-Type标头中属性的使用。的语法Content-Type可以在这里找到:tools.ietf.org/html/rfc2045#section-5.1
Josh Habdas '17

但是,在我看来,mime-type是一个非常狭义的术语,仅用于邮件本身,而content-type是“内容类型”的通俗英语。因此,在我看来text/html,即使人们倾向于将其称为MIME,也是一种内容类型。此外,media-type由于媒体是100种不同的事物,因此较新的名称甚至更加模糊。英国广播公司是一种媒体!DVD是媒体!有人会争辩说,数据流不是“媒体”,而是“媒介”。
user2173353

4

如果您想了解详细信息,请参阅票证3526

引用:

向HttpResponse构造函数添加了content_type作为mimetype的别名。这是一个稍微准确的名称。基于Simon Willison的补丁。完全向后兼容。


0

为什么我们为(几乎相同的)事物使用2种不同的命名?

向后兼容性,基于您在文档中的报价。


好的,我已经了解在Django上添加该标签的实际原因。但是,问题的核心是为什么每个人都使用如此混合的两个词,以及毕竟是否真的有所不同。
Frangossauro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.