第七章.在请求和响应中使用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,而且我们知道需要几年时间(如果不是十几年的话)大部分用户才会改用InternetExplorer7.0或Firefox1.5这些新版本的浏览器,因此这么修改实际上是不可行的。最终我们不得不使用XMLHttpRequest,这就要求开发人员要知道其名不符实的这一事实。在一定程度上讲,对于不支持XMLHttpRequest的浏览器(特别是在Windows上)的最佳回溯方法之一就是使用MicrosoftIFRAME对象。听起来可不像是XML、HTTP或请求,是不是?当然,所有这些都可能涉及到,但是这正清楚地说明了一点——XMLHttpRequest对象更多的是关于在不重新加载页面的情况发出请求,而不会太多地涉及XML甚至HTTP。请求是HTTP而非XML另一种常见的错误是认为XML在幕后使用——坦白地说,我也曾这么认为!但是,持这种观点表明您对这种技术还不甚了解。当用户打开浏览器从服务器上请求网页时,会输入这样的东西。即便不输入http://,浏览器也会在地址栏的这部分加上。第一部分,即http://,是关于如何通信的很直观的线索:通过超文本传输协议HTTP。在网页中编写代码与服务器通信时,无论使用Ajax还是普通的表单POST,甚至超链接,打交道的都是HTTP。既然浏览器和服务器之间的所有Web通信都通过HTTP进行,认为XML是XMLHttpRequest幕后所用的某种传输技术的想法就毫无道理了。当然在HTTP请求中可以发送XML,但是HTTP是一个精确定义的协议,短时间内不可能消失。除了在请求中明确使用XML,或者服务器用XML发送响应之外,XMLHttpRequest对象使用的只是普普通通的HTTP。因此,当再有人对您说“哦,称为XMLHttpRequest是因为在幕后使用XML”的时候,您最好一笑了之,并耐心地解释什么是HTTP,告诉他们虽然XML可以通过HTTP发送,但XML是一种数据格式而不是传输协议。通过这样的讨论,加深对它的理解。使用XML(真正)到目前为止,我说的只是Ajax在哪些地方不使用XML。但Ajax中的x和XMLHttpRequest中的XML仍然有其实际意义,在Web应用程序中使用XML有多种选择。这一节将讨论基本的选择,剩下的部分再深入探讨细节问题。XML选项在异步应用程序中XML有两种基本的用法:以XML格式从网页向服务器发送请求以XML格式在网页中从服务器接收请求其中第一种用法,即用XML发送请求,需要将请求的格式设置为XML,可以使用API来完成,也可以与文本连成字符串,然后将结果发送到服务器。按照这种思路,主要的任务就是通过既符合XML规则又能被服务器理解的方式构造请求。因此这里的关键实际上是XML格式,得到需要发送的数据之后,只需要用XML语法将其包装起来。本文后面讨论XML在Ajax应用程序中的这种用法。第二种用法,即用XML接收请求,需要从服务器上接收响应,然后从XML提取数据(同样,可以用API或者采用蛮力方法)。这种情况下,关键在于来自服务器的数据,而您恰好需要从XML中提取这些数据以便使用。这是本系列下一期文章的主题,到那时候我们再详加讨论。一点忠告再详细讨论使用XML的细节之前,首先给您一句忠告:XML不是一种简洁、快速和节省空间的格式。在后面几节以及本系列的下一期文章中将看到,在上下文中使用XML确实有一些很好的理由,XML与普通文本的请求和响应(特别是响应)相比也确实有一些长处。但是,和普通文本相比,XML通常总会占用更多的空间,速度也更慢,因为需要在消息中增加XML所需要的标签和语义。如果需要编写速度很快、看起来像桌面应用的程序,XML可能不是最佳选择。如果从普通文本开始,然后发现确实需要XML,那么就使用它;但是如果从一开始就使用XML,基本上可以肯定一定会降低应用程序HTTPS:仍然是HTTP那些刚接触Web的人可能对感到奇怪。https表示安全的HTTP,只是使用了比一般Web请求更安全的HTTP协议形式。因此即便是HTTPS,实际上用的仍然是HTTP,虽然增加了某些安全层来挡住那些好奇的眼睛。回页首的响应性。多数情况下,与将文本转化成下面这种XML相比,发送普通文本会更快一些(使用类似name=jennifer的名/值对):namejennifer/name看看哪些地方使XML增加了处理时间:将文本包装成XML;发送额外信息(要注意我没有包含任何包围元素、XML头或者可能出现在实际请求中的其他任何内容);让服务器解析XML、生成响应、用XML包装响应,并将它发送回网页;让网页解析响应,最后使用它。因此要清楚什么时候使用XML,不要一开始就认为它在很多情况下都能够加快应用程序;但,它可以增强灵活性,这就是我们现在要讨论的。从客户机到服务器的XML我们来看看将XML作为从客户机向服务器发送数据的格式。我们首先讨论技术上的实现,然后花些时间分析什么时候适合什么时候不适合使用它。发送名/值对在您编写的90%Web应用程序中,最终都会使用名/值对发送到服务器。比方说,如果用户在网页表单中输入姓名和地址,可能希望数据采用下列形式:firstName=LarrylastName=Gullahornstreet=9018HeatherhornDrivecity=Rowlettstate=TexaszipCode=75080如果使用普通文本把这些数据发送到服务器,可以使用清单1所示的代码。类似于本系列第一期文章中使用的那个例子。请参阅参考资料。清单1.使用普通文本发送名/值对functioncallServer(){//GetthecityandstatefromtheWebformvarfirstName=document.getElementById(firstName).value;varlastName=document.getElementById(lastName).value;varstreet=document.getElementById(street).value;varcity=document.getElementById(city).value;varstate=document.getElementById(state).value;回页首varzipCode=document.getElementById(zipCode).value;//BuildtheURLtoconnecttovarurl=/scripts/saveAddress.php?firstName=+escape(firstName)+&lastName=+escape(lastName)+&street=+escape(street)+&city=+escape(city)+&state=+escape(state)+&zipCode=+escape(zipCode);//OpenaconnectiontotheserverxmlHttp.open(GET,url,true);//Setupafunctionfortheservertorunwhenit'sdonexmlHttp.onreadystatechange=confirmUpdate;//SendtherequestxmlHttp.send(null);}将名/值对转化成XML如果希望这样使用XML作为数据格式,首先要做的是找到一种基本XML格式来存储数据。显然,名/值对可以全部转化成XML元素,以其中的名称作为元素名,值作为元素的内容:firstNameLarry/firstNamelastNameGullahorn/lastNamestreet9018HeatherhornDrive/streetcityRowlett/citystateTexas/statezipCode75080/zipCode当然,XML要求有一个根元素;如果使用文档片段(XML文档的一部分)的话则需要一个封闭元素。因此可能需要将上述XML转化成下面的形式:addressfirstNameLarry/firstNamelastNameGullahorn/lastNamestreet9018HeatherhornDrive/streetcityRowlett/citystateTexas/statezipCode75080/zipCode/address现在基本上可以准备在Web客户机上创建这种结构并发送到服务器了。通信,口头上的在网络上传输XML之前,需要保证服务器以及发送数据的脚本能够接受XML。现在对很多人来说这么强调似乎有点多余,认为这是理所当然的,但是很多新手往往认为只要通过网络发送XML,就能够被正确地接收和解释。实际上,需要两个步骤来保证发送的XML的数据能够被正确地接收:1.保证向其发送XML的脚本能够接受XML数据格式。2.保证脚本认可发送数据所采用的特定XML格式和结构。这两方面都可能要求您进行人际沟通,必须明确地告知对方!严格地说,如果确实需要发送XML数据,多数脚本作

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功