如何在Ajax请求和响应中使用XML(1)
服务器(有时)不能响应太多的请求
在深入钻研从服务器获取 XML 响应的技术之前,您需要理解,为什么说使服务器发送 XML 来响应请求是一个好主意(以及这与客户机发送 XML 请求不同的原因所在)。
客户机以名称/值对发送请求
回忆一下上一篇文章,就会知道,在大多数情况下,客户机不需要使用 XML,因为他们会使用名称/值对发送请求。因此,您可能会发送一个这样的名称:name=jennifer。只需简单地在连续的名称/值对之间添加一个 “与” 符号(&),即可将其放在一起,就像这样:name=jennifer&job=president。使用简单的文本和这些名称值对,客户机即可轻松向服务器请求多个值。很少需要用到 XML 提供的额外结构(及其带来的额外开销)。
实际上,需要向服务器发送 XML 的所有理由都差不多可以归入以下两个基本的类别中:
- 服务器仅 接受 XML 请求。在这类情况下,您别无选择。上一期文章中介绍的基础知识应已使您掌握了发送此类请求所必需的工具。
- 您正在调用一个仅接受 XML 或 SOAP 请求的远程 API。这实际上就是上一种情况的特例,但值得单独拿出来提一下。如果您希望在一个异步请求中使用来自 Google 或 Amazon 的 API,就会有一些特殊的考虑事项。在下一期的文章中,我将介绍这些考虑事项,还会给出一些向 API 发送此类请求的示例。
服务器无法(以一种标准方式)发送名称/值对
在您发送名称/值对时,Web 浏览器会发送请求,平台会响应该请求,并承载一个服务器程序,配合它将那些名称/值对转换成服务器程序可以轻松处理的数据。实际上,每一种服务器端技术 ―― 从 Java™ servlet 到 PHP、再到 Perl、Ruby on Rails ―― 都允许您调用多种方法来根据名称获取值。因此,获取 name 属性只是小事一桩。
这种情况并不会将我们引向另外一个方向。如果服务器使用字符串 name=jennifer&job=president 应答一个应用程序,客户机没有任何标准化的简便方法来将每个对拆分成名称和值。您必须手动解析所返回的数据。如果服务器返回一个由名称/值对构成的响应,这样的响应的解释难度与使用分号、竖线或其他任何非标准格式化字符相同。
对于您来说,这就意味没有任何简单的方法在响应中使用纯文本、使客户机以一种标准的方法获取并解释响应,至少在响应包含多个值时是如此。假设您的服务器只是要发回数字 42,那么纯文本是很好的选择。但如果服务器要一次性发回电视剧 Lost, Alias 和 Six Degrees 的近期收视率又该怎么办呢?尽管可以选择许多种方法来使用纯文本发送这一响应(清单 1给出了一些示例),但没有一种是不需客户机进行某些处理的极其简单的方法,也没有一种是标准化的方法。
清单 1. 收视率的服务器响应(不同版本)
show=Alias&ratings=6.5|show=Lost&ratings=14.2|show =Six%20Degrees&ratings=9.1 Alias=6.5&Lost=14.2&Six%20Degrees=9.1 Alias|6.5|Lost|14.2|Six%20Degrees|9.1 |
尽管不难找到拆分这些响应字符串的方法,但客户机将不得不根据分号、等号、竖线和与符号解析并拆分这些字符串。这不是编写使其他开发人员能够轻松理解和维护的健壮代码的方法。
进入 XML
意识到没有任何标准的方法可以使服务器使用名称/值对响应客户机之后,使用 XML 的原因也就显而易见了。向客户机发送数据时,名称/值对是非常好的选择,因为服务器和服务器端语言可以轻松解释名称/值对;向客户机返回数据时使用 XML 也是如此。在本系列前几期的文章中,您已经看到了利用 DOM 来解析 XML,在后续的文章中,还会看到 JSON 怎样提供了解析 XML 的另一种选择。在所有这一切之上,您可以将 XML 作为纯文本处理,并以这种方式获取其值。因此,有几种方法可从服务器获得 XML 响应,并使用较为标准的代码提取数据,在客户机中使用这些数据。
还有一个额外的好处,XML 非常易于理解。比如说,大多数编写程序的人都能理解清单 2中的数据。
清单 2. 收视率的服务器响应(XML 格式)
|
在特定分号或撇号的含义方面,清单 2中的代码没有任何隐晦之处。
从服务器接收 XML
由于本系列的重点在于 Ajax 应用模式的客户端,因此我不会深入探讨关于服务器端程序如何才能生成 XML 响应的细枝末节。但在您的客户机接收 XML 时,您需要了解一些特殊的考虑事项。
首先,您可使用两种基本的方式处理一个来自服务器的 XML 响应:
- 作为碰巧被格式化为 XML 的纯文本
- 作为一个 XML 文档,由一个 DOM Document 对象表示。
其次,举例来说,假设有一个来自服务器的简单 XML 响应。清单 3展示了与上面介绍的内容相同的收视率程序清单(实际上,是与清单 2相同的 XML,在这里再次给出只是为了使您便于查看)。我将在这部分的讨论中使用这段样本 XML。
清单 3. XML 格式的收视率示例
|
将 XML 作为纯文本处理
处理 XML 的最简单的选择(至少就学习新的编程技术而言),就是用与处理服务器返回的其他文本片段相同的方法来处理它。换言之,基本上就是忽略数据格式,只关注服务器的响应。
在这种情况下,您要使用请求对象的 responseText 属性,就像在服务器向您发送非 XML 响应时一样(参见清单 4)。
清单 4. 将 XML 作为普通服务器响应处理
function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var response = request.responseText;
// response has the XML response from the server
alert(response);
}
}
}
|
在这个代码片段中,updatePage() 是回调方法,request 是 XMLHttpRequest 对象。最终,您将得到把所有一切串联在一起的 XML 响应,位于 response 变量之中。如果输出此变量,您会得到类似于清单 5 的结果。(请注意,清单 5中的代码在正常情况下应该是连续的一个代码行。这里采用多行形式是为了显示正常。)
清单 5. response 变量的值
|
这里,要注意的最重要的地方就是 XML 是作为整体运行的。在大多数情况下,服务器不会使用空格和回车来格式化 XML,而是将一切串联在一起,就像您在清单 5中看到的那样。当然,您的应用程序不会过于在意空格,所以这算不上什么问题,但确实会使代码阅读起来较为困难。
在这里,您可以使用 JavaScript split 函数来拆分此数据,并通过基本的字符串操作来获得元素的名称和值。毫无疑问,这是个令人头疼的过程,它无视于您花费了大量时间来阅读前几期文章中 DOM(Document Object Model)相关内容这一事实。因此,我要强调,您应该牢记:利用 responseText,可以轻松使用和输出服务器的 XML 响应,但我不会为您展示太多的代码,在能够使用 DOM 时,您不应选择这种方法来获得 XML 数据,下面您会看到这一点。






