写点什么

MIME 给 REST 的采用带来了问题?

2009 年 8 月 28 日

随着 REST(和 REST/HTTP)被人们越来越多地用于除了运行Web 服务器之外的更多工作,我们看到越来越多的人将现实世界的经验带入到这一个更广阔的社区(网络和REST 的世界)。在这种背景下, Benjamin Carlyle 提出了 MIME 是否阻碍了 REST 的采用的问题。

我认为 HTTP 的一个重大缺点是它依赖于 MIME 标准及相关的 IANA(Internet 号分配机构)注册库对多媒体类型进行识别。该注册库是一个瓶颈,因为它对于那些仅限于个别企业或域的那些多媒体类型的定义无能为力。以计算机为中心的环境比以人为中心的环境对语义的依赖性更大。为使计算机有效地挖掘信息以及多媒体类型能够被个性化地标识,多媒体类型信息中的任何唯一的格式都应该标准化。随着计算机在分布式计算环境中的地位越来越重要,加上独特计算环境的数目的增长,多媒体类型的数量也随之增长。

正如 Benjamin 所指出的,问题是对各式各样的 MIME 类型的全盘采用是极其困难的,而且不能扩展。如果没能理解某多媒体类型是什么以及它怎么工作,仅仅要达成如“为什么需要某种特定类型的多媒体”这样的协议都是非常困难的。

在 Web 之外通过实验的方法定义和发展这些标准的能力对于健康采用 REST 风格以及相关的超出 Web 范围的风格是至关重要的。

随后 Benjamin 提出了一些替代方法。第一个应该是使用统一资源名称(URN,Uniform Resource Name),特别当它们现在已经提供分散的注册表。但是它又指出这个做法也有问题。 “首先是 HTTP 不允许它们在合适的 HTTP 头中使用;第二个是当 URN 被读取时,不能进一步被解释;第三是 URN 不能作为 MIME 类型而被参数化。” MIME 类型提供了跨越不同类型进行一致性和合规性定义的强大支持,而仅用 URN 就很难做到这点。他继续对 HTTP 作一些的修改的建议,从而可能对使用 URN 替换 MIME 类型有所帮助,例如:

对 HTTP 进行修改可能是解决这些问题的方法,让其包含对多媒体类型的 URI 语法的支持,还需要一个协议使得处理器可以了解一个多媒体类型是否继承自另一类型.[ ……] 可以选择在对某一个 URI 的 GET 操作的响应中使用 HTTP 头,也可以为多媒体类型的描述指定一个新的多媒体类型。使用链接头的显而易见的做法可能是形如这样的链接: rel=&rel=“inherits”。然而,这个方法有些局限。一个实际的描述多媒体类型的多媒体类型可能使用一小段 XML 文档或简单的人工可读的微格式(译注:是一种对 Web 网页进行语义注解的方法,参考微格式),而且更加通用且经得起时间的考验。

当然,如他所言,向后兼容性在 Web 的世界是非常重要的,所以,要做任何修改都必须要仔细考虑这个方面。然而,Benjamin 还真提供了另一种解决方法:一个遵循 MIME 语法分散的注册表。

URN 的替代方法是仅将 DNS 系统作为多媒体类型标识符的一部分。比如在 MIME 中注册一个“dns”子树。这个子树使得企业 / 组织能够安全地维护一组从应用 dns.com.example 开始的标识符,根本不需要 IANA 的协作。任何出现在该 DNS 树下的企业 / 组织都可以这么做。

这样就在尽可能不影响 HTTP 的情况下解决了向后兼容性的问题。它似乎同时还保留了 MIME 语法的优势,如继承。但是它仍然存在负面影响:

也许对这种方式对强列的反驳意见就是它失去了对标准文档的发现能力。URL 可以很容易地找到他所指向的规约文档,而这种混杂版的 DNS 和 MIME 还需要更多帮助才能具有这个能力。也许有必要某种机制把诸如此类的 MIME 标识符翻译成合适的 URL,从而能够很方便地找到它(URL)所引用的文档(如 robots.txt)及企业 URL 结构。

Benjamin 还提出了这些方法的一些变体,不过他总结到:

它伤透了我的心。我不想每次在公司里发布一种多媒体类型时都要联系 IANA。我喜欢 URL,但是它需要一个直接明了的方式去发现重要的继承关系。我不喜欢破坏 HTTP 的向后兼容性,而且没有更好的协议去支持 REST 的工作。该何去何从呢?

因此,就像文章中说的那样,目前的 MIME 的方式是有限制的?或者有其他可用的替代方法吗?或许 MIME 使用的问题还没有 MIME 协议作为新类型控制的方式时的问题那么多。


查看英文原文: Is MIME a problem for REST?

2009 年 8 月 28 日 04:101168
用户头像

发布了 184 篇内容, 共 65.8 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

# 模块1作业

灯火阑珊

test

大肚皮狒狒

Flink程序结构与数据流

大数据技术指南

flink 4月日更

第一周作业

Damon

2021版最新!字节跳动3面+腾讯6面一次过,谈谈我的大厂面经

Java成神之路

Java 程序员 架构 面试 编程语言

HW Y7 2018

无名

架构实战营模块1第1课-学习总结

吴建中

架构实战营

2021金三银四程序员面试必问总结

Java架构师迁哥

架构实战营模块一 作业

我叫大法师

刚火了的中台转头就拆,一大波公司放不下又拿不起来!

小傅哥

Java 架构 中台 小傅哥 海盗奇兵

二本渣渣辛酸面试之旅:5面阿里Java岗侥幸上岸,定级P6

神奇小汤圆

Java 编程 程序员 架构 面试

微信业务架构图&学生管理系统

刘敏

Web安全

Machine Gun

聪明人的训练(七)

Changing Lin

四月日更

c语言思维地基搭建(c语言介绍)

-jf.

学习笔记 大学作业 四月日更

抖音春晚幕后 | 支撑 12 亿红包雨的云原生基础设施

火山引擎

数据库 分布式 云原生 边缘计算

微信业务架构和学生管理系统架构设计

鹿洺

架构实战营

架构实战营 作业1

solider

架构实战营模块一作业

梦寐凯旋

什么!?金三银四,2021年阿里最新面试题惨遭泄露?

Java成神之路

Java 程序员 架构 面试 编程语言

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

阿里巴巴云原生

Java 云原生 监控 存储 消息中间件

数字签名在信息安全是什么?

Machine Gun

网络安全 信息安全 WEB安全 数字签名

架构实战营 | 模块一 | 作业

curtis

由 JVM Attach API 看跨进程通信中的信号和 Unix 域套接字

AI乔治

Java 架构 jdk JVM

保护云管理控制台的5个最佳实践

龙归科技

云计算 安全 风险管理

企业与员工的三种共同体关系

石云升

28天写作 职场经验 管理经验 4月日更

​程序员的二十多个防猝死指南小妙招

Java架构师迁哥

如何在 Mac 下用 Clion 调试 MySQL 源码

AI乔治

Java MySQL 架构 调优

遭GitHub连夜封杀下架?被泄露的阿里内部Java面试手册到底有多强?

Java架构师迁哥

架构实战营模块 1 作业

Lukefang

架构实战营

再聊 TCP backlog

AI乔治

Java 架构 TCP TCP/IP

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

MIME给REST的采用带来了问题?-InfoQ