了解什么时候适合什么时候不适合使用 XML
简介:偶尔使用 Ajax 的开发人员也会注意到 Ajax 中的 x 并意识到它代表 XML。XML 是编程中最常 用的数据格式之一,对于异步应用程序中的服务器响应能够带来切实的好处。在本文中,您将看到服务器 如何在请求响应中发送 XML。
现在如果不使用 XML 就不能进行任何有意义的编程。无论考虑转向 XHTML 的网页设计人员、使用 JavaScript 的 Web 程序员、使用部署描述文件和数据绑定的服务器端程序员,还是研究基于 XML 的数 据库的后端开发人员,都在使用这种可扩展标记语言。因此,XML 被认为是 Ajax 底层的核心技术之一就 不足为奇了。
但是,这种观点反映到 Ajax 应用程序就表现在其核心对象所选的名称 —— XMLHttpRequest,这个 名称不是很好,因为它并没有反映技术上的实际情况。换句话说,多数人之所以认为 XML 是 Ajax 的核 心组成部分,仅仅是因为他们想当然地以为 XMLHttpRequest 对象在任何时候都使用 XML。但实情并非如 此,本文第一部分给出了原因。实际上,您将看到在多数 Ajax 应用程序中 XML 很少出现。
XML 确实有应用在 Ajax 中,而且 XMLHttpRequest 也支持这种用法。也确实没有什么能阻挡您向服 务器发送 XML。在本系列前面的文章中,我们使用普通文本和名/值参数发送数据,但 XML 也是一种可行 的格式。本文将介绍如何来这样做。但最重要的是,我将讨论为何可以使用 XML 作为请求格式,以及为 何在多数情况下不应该使用它。
XML:到底用没用?
对 Ajax 应用程序及它们使用 XML 的情况很容易犯想当然的错误:这种技术的名称(Ajax)及其使用 的核心对象(XMLHttpRequest)都暗示了 XML 的使用,谈到 Ajax 应用程序的时候也经常听到 XML。但 是,这种观点大错特错,如果希望在编写异步应用程序时真正做到胸有成竹,必须知道这种想法是错误的 ,而且最好知道为什么错误。
XMLHttpRequest:糟糕的名称和 HTTP
一项技术可能遇到的最糟的境况之一是它变得太炙手可热以至于无法再改变它的一些基本内容。 XMLHttpRequest 恰恰是这种情形,它是 Ajax 应用程序中使用的基本对象。听起来它似乎是为通过 HTTP 请求发送 XML 或者以某种 XML 格式发出 HTTP 请求而设计的。但不论这个对象的名称听起来像什么,实 际上它要做的只不过是为客户机代码(在网页中通常是 JavaScript)提供一种发送 HTTP 请求的方式。 仅此而已,别无其他。
因此,如果将 XMLHttpRequest 改成某种更准确的名称可能更好一些,比如 HttpRequest,或者简简 单单的 Request。但是,现在成千上万的人在应用程序中使用了 Ajax,而且我们知道需要几年时间(如 果不是十几年的话)大部分用户才会改用 Internet Explorer 7.0 或 Firefox 1.5 这些新版本的浏览器 ,因此这么修改实际上是不可行的。最终我们不得不使用 XMLHttpRequest,这就要求开发人员要知道其 名不符实的这一事实。
在一定程度上讲,对于不支持 XMLHttpRequest 的浏览器(特别是在 Windows 上)的最佳回溯方法之 一就是使用 Microsoft IFRAME 对象。听起来可不像是 XML、HTTP 或请求,是不是?当然,所有这些都 可能涉及到,但是这正清楚地说明了一点 —— XMLHttpRequest 对象更多的是关于在不重新加载页面的 情况发出请求,而不会太多地涉及 XML 甚至 HTTP。
请求是 HTTP 而非 XML
另一种常见的错误是认为 XML 在幕后使用 —— 坦白地说,我也曾这么认为!但是,持这种观点表明 您对这种技术还不甚了解。当用户打开浏览器从服务器上请求网页时,会输入 http://www.google.com 或者 http://www.headfirstlabs.com 这样的东西。即便不输入 http://,浏览器也会在地址栏的这部分 加上。第一部分,即 http://,是关于如何通信的很直观的线索:通过超文本传输协议 HTTP。在网页中 编写代码与服务器通信时,无论使用 Ajax 还是普通的表单 POST,甚至超链接,打交道的都是 HTTP。
既然浏览器和服务器之间的所有 Web 通信都通过 HTTP 进行,认为 XML 是 XMLHttpRequest 幕后所 用的某种传输技术的想法就毫无道理了。当然在 HTTP 请求中可以发送 XML,但是 HTTP 是一个精确定义 的协议,短时间内不可能消失。除了在请求中明确使用 XML,或者服务器用 XML 发送响应之外, XMLHttpRequest 对象使用的只是普普通通的 HTTP。因此,当再有人对您说 “哦,称为 XMLHttpRequest 是因为在幕后使用 XML” 的时候,您最好一笑了之,并耐心地解释什么是 HTTP,告诉他们虽然 XML 可 以通过 HTTP 发送,但 XML 是一种数据格式而不是传输协议。通过这样的讨论,加深对它的理解。