服务器(有时)不能响应太多请求
在深入钻研从服务器获取 XML 响应技术的前您需要理解为什么说使服务器发送 XML 来响应请求是个好主意(以及这和客户机发送 XML 请求区别原因所在)
客户机以名称/值对发送请求
回忆下上篇文章就会知道在大多数情况下客户机不需要使用 XML他们会使用名称/值对发送请求因此您可能会发送个这样名称:name=jenner只需简单地在连续名称/值对的间添加个 “和” 符号(&)即可将其放在起就像这样:name=jenner&job=president使用简单文本和这些名称值对客户机即可轻松向服务器请求多个值很少需要用到 XML 提供额外结构(及其带来额外开销)
实际上需要向服务器发送 XML 所有理由都差不多可以归入以下两个基本类别中:
服务器仅 接受 XML 请求在这类情况下您别无选择
您正在个仅接受 XML 或 SOAP 请求远程 API这实际上就是上种情况特例但值得单独拿出来提下如果您希望在个异步请求中使用来自 Google 或 Amazon API就会有些特殊考虑事项
服务器无法(以种标准方式)发送名称/值对
在您发送名称/值对时Web 浏览器会发送请求平台会响应该请求并承载个服务器配合它将那些名称/值对转换成服务器可以轻松处理数据实际上每种服务器端技术 —— 从 Java? servlet 到 PHP、再到 Perl、Ruby _disibledevent=> 对于您来说这就意味没有任何简单思路方法在响应中使用纯文本、使客户机以种标准思路方法获取并解释响应至少在响应包含多个值时是如此假设您服务器只是要发回数字 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 格式)
< ratings> < show>
< title>Alias< /title>
< rating>6.5< /rating>
< /show>
< show>
< title>Lost< /title>
< rating>14.2< /rating>
< /show>
< show>
< title>Six Degrees< /title>
< rating>9.1< /rating>
< /show>
< /ratings>
在特定分号或撇号含义方面清单 2 中代码没有任何隐晦的处
从服务器接收 XML
由于本系列重点在于 Ajax 应用模式客户端因此我不会深入探讨有关服务器端如何才能生成 XML 响应细枝末节但在您客户机接收 XML 时您需要了解些特殊考虑事项
首先您可使用两种基本方式处理个来自服务器 XML 响应:
作为碰巧被格式化为 XML 纯文本
作为个 XML 文档由个 DOM Document 对象表示
其次举例来说假设有个来自服务器简单 XML 响应清单 3 展示了和上面介绍内容相同收视率清单(实际上是和 清单 2 相同 XML在这里再次给出只是为了使您便于查看)我将在这部分讨论中使用这段样本 XML
清单 3. XML 格式收视率举例
< ratings> < show>
< title>Alias< /title>
< rating>6.5< /rating>
< /show>
< show>
< title>Lost< /title>
< rating>14.2< /rating>
< /show>
< show>
< title>Six Degrees< /title>
< rating>9.1< /rating>
< /show>
< /ratings>
将 XML 作为纯文本处理
处理 XML 最简单选择(至少就学习新编程技术而言)就是用和处理服务器返回其他文本片段相同思路方法来处理它换言的基本上就是忽略数据格式只关注服务器响应
在这种情况下您要使用请求对象 responseText 属性就像在服务器向您发送非 XML 响应时样(参见 清单 4)
清单 4. 将 XML 作为普通服务器响应处理
function updatePage { (request.readyState 4) {
(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 变量值
< ratings>< show>< title>Alias< /title>< rating>6.5< /rating> < /show>< show>< title>Lost< /title>< rating>14.2< /rating>< /show>< show>
< title>Six Degrees< /title>< rating>9.1< /rating>< /show>< /ratings>
这里要注意最重要地方就是 XML 是作为整体运行在大多数情况下服务器不会使用空格和回车来格式化 XML而是将切串联在起就像您在 清单 5 中看到那样当然您应用不会过于在意空格所以这算不上什么问题但确实会使代码阅读起来较为困难
在这里您可以使用 JavaScript split 来拆分此数据并通过基本串操作来获得元素名称和值毫无疑问这是个令人头疼过程它无视于您花费了大量时间来阅读前几期文章中 DOM(Document Object Model)相关内容这事实因此我要强调您应该牢记:利用 responseText可以轻松使用和输出服务器 XML 响应但我不会为您展示太多代码在能够使用 DOM 时您不应选择这种思路方法来获得 XML 数据下面您会看到这点
将 XML 当成 XML
尽管可以 将服务器 XML 格式响应视同为其他任何文本响应来处理但这样做没有很好理由首先如果您直忠实地阅读这个系列那么您已经学会了如何使用 DOM 这种对 JavaScript 友好 API 来操纵 XML还有更好事情JavaScript 和 XMLHttpRequest 对象提供了个属性它能完美地获取服务器 XML 响应并且是以 DOM Document 对象形式来获取它
清单 6 给出了个例子这段代码和 清单 4 类似但没有使用 responseText 属性回调使用是 responseXML 属性该属性在 XMLHttpRequest 上可用它以 DOM 文档格式返回服务器响应
清单 6. 将 XML 当作 XML
function updatePage { (request.readyState 4) {
(request.status 200) {
var xmlDoc = request.responseXML;
// work with xmlDoc using the DOM
}
}
}
现在您有了个 DOM Document可以像处理其他任何 XML 样处理它例如随后可能要获取所有 show 元素如 清单 7 所示
清单 7. 获取所有 show 元素
function updatePage { (request.readyState 4) {
(request.status 200) {
var xmlDoc = request.responseXML;
var showElements = xmlDoc.getElementsByTagName("show");
}
}
}
如果您熟悉 DOM从这儿开始看起来就应该有几分熟悉了您可以使用您所了解全部 DOM 思路方法轻松操纵从服务器处接收到 XML
当然您也可以混用普通 JavaScript 代码例如可以遍历所有 show 元素如 清单 8 所示
清单 8. 遍历所有 show 元素
function updatePage { (request.readyState 4) {
(request.status 200) {
var xmlDoc = request.responseXML;
var showElements = xmlDoc.getElementsByTagName("show");
for (var x=0; x< showElements.length; x) {
// We know that the first child of show is title, and the second is rating
var title = showElements[x].childNodes[0].value;
var rating = showElements[x].childNodes[1].value;
// Now do whatever you want with the show title and ratings
}
}
}
}
通过这段非常简单代码您正是将 XML 响应作为 XML 而不是无格式纯文本进行了处理还使用了点 DOM 和简单 JavaScript 来处理服务器响应更重要是您使用了标准化格式 —— XML而不是以逗号分隔值或以竖线分隔名称/值对换句话说您将 XML 用在了最适合它地方避免了在不适合地方使用它(比如说向服务器发送请求时)
服务器端 XML:个简单举例
我不会谈太多有关如何在服务器上生成 XML 内容但花点儿时间看个简单举例是值得我没有给出过多注释以便您自行研究如何应对这样场景清单 9 展示了个简单 PHP 脚本假设有个异步客户机发出了请求该脚本将输出 XML 来应答此请求
这是种强力(brute force)思路方法PHP 脚本实际上是手动生成 XML 输出您可以找到许多工具包和 API用于 PHP 和其他众多允许您生成 XML 响应服务器端语言无论您情况如何这都至少能让您了解生成 XML 并以的应答请求服务器端脚本看上去是什么样子
清单 9. 返回 XML PHP 脚本
< ?php // Connect to a MySQL database
$conn = @mysql_connect("mysql.myhost.com", "username", "secret- password");
(!conn)
die("Error connecting to database: " . mysql_error);
(!mysql_select_db("television", $conn))
die("Error selecting TV database: " . mysql_error);
// Get ratings for all TV shows in database
$select = 'SELECT title, rating';
$from = ' FROM ratings';
$queryResult = @mysql_query($select . $from);
(!$queryResult)
die("Error retrieving ratings for TV shows.');
// Let the client know we're sending back XML
header("Content-Type: text/xml");
echo "< ?xml version=\"1.0\" encoding=\"utf-8\"?>";
echo "< ratings>";
while ($row = mysql_fetch_.gif' />($queryResult)) {
$title = $row['title'];
$rating = $row['rating'];
echo "< show>
echo "< title>" . $title . "< /title>";
echo "< rating>" . $rating . "< /rating>";
echo "< /show>";
}
echo "< /ratings>";
mysql_close($conn);
?>
您应能够使用您偏爱服务器端语言以类似方式输出 XMLIBM developerWorks 上有许多文章可以帮助您了解如何使用您喜爱服务器端语言生成 XML 文档(相关链接请参见 参考资料)
解释 XML 其他可选思路方法
除将 XML 作为无格式文本处理或使用 DOM 处理的外还有种非常流行选择很重要值得提那就是 JSON(JavaScript Object Notation)这是种绑定在 JavaScript 内自由文本格式这篇文章中没有足够空间介绍 JSON在后续文章中将探讨相关内容;只要提起 XML 和 Ajax 应用您就很可能会听到有人谈论 JSON因此现在我将告诉您您工作伙伴们在谈论究竟是什么
大体上可以用 JSON 做事用 DOM 都可以完成反的亦然;选择主要取决于偏好当然也要为特定应用选择正确思路方法就现在而言您应坚持使用 DOM在接收服务器响应过程中熟悉 DOM我将占用几期文章篇幅、用大量时间去探讨 JSON的后您就可以随意选择在下个应用中使用那种技术了请继续关注本系列:后续文章中将介绍有关 XML 更多内容
最新评论