从客户机到服务器的 XML
我们来看看将 XML
作为从客户机向服务器发送数据的格式。我们首先讨论技术上的实现,然后花些时间分析什么时候适合什么时候不适合使用它。
发送名/
值对
在您编写的 90% Web
应用程序中,最终都会使用名/
值对发送到服务器。比方说,如果用户在网页表单中输入姓名和地址,可能希望数据采用下列形式:
firstName=Larry
lastName=Gullahorn
street=9018 Heatherhorn Drive
city=Rowlett
state=Texas
zipCode=75080
|
如果使用普通文本把这些数据发送到服务器,可以使用清单 1
所示的代码。类似于本系列第一期文章中使用的那个例子。请参阅参考资料
。
清单 1.
使用普通文本发送名/
值对
function callServer() {
// Get the city and state from the Web form
var firstName = document.getElementById("firstName").value;
var lastName = document.getElementById("lastName").value;
var street = document.getElementById("street").value;
var city = document.getElementById("city").value;
var state = document.getElementById("state").value;
var zipCode = document.getElementById("zipCode").value;
// Build the URL to connect to
var url = "/scripts/saveAddress.php?firstName=" + escape(firstName) +
"&lastName=" + escape(lastName) + "&street=" + escape(street) +
"&city=" + escape(city) + "&state=" + escape(state) +
"&zipCode=" + escape(zipCode);
// Open a connection to the server
xmlHttp.open("GET", url, true);
// Set up a function for the server to run when it's done
xmlHttp.onreadystatechange = confirmUpdate;
// Send the request
xmlHttp.send(null);
}
|
将名/
值对转化成 XML
如果希望这样使用 XML
作为数据格式,首先要做的是找到一种基本 XML
格式来存储数据。显然,名/
值对可以全部转化成 XML
元素,以其中的名称作为元素名,值作为元素的内容:
<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
<city>Rowlett</city>
<state>Texas</state>
<zipCode>75080</zipCode>
|
当然,XML
要求有一个根元素;如果使用文档片段
(XML
文档的一部分)的话则需要一个封闭元素。因此可能需要将上述 XML
转化成下面的形式:
<address>
<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
<city>Rowlett</city>
<state>Texas</state>
<zipCode>75080</zipCode>
</address>
|
现在基本上可以准备在 Web
客户机上创建这种结构并发送到服务器了。
通信,口头上的
在网络上传输 XML
之前,需要保证服务器以及发送数据的脚本能够接受 XML
。现在对很多人来说这么强调似乎有点多余,认为这是理所当然的,但是很多新手往往认为只要通过网络发送 XML
,就能够被正确地接收和解释。
实际上,需要两个步骤来保证发送的 XML
的数据能够被正确地接收:
- 保证向其发送 XML
的脚本能够接受 XML
数据格式。
- 保证脚本认可发送数据所采用的特定 XML
格式和结构。
这两方面都可能要求您进行人际沟通,必须明确地告知对方!严格地说,如果确实需要发送 XML
数据,多数脚本作者都会帮助您,因此寻找能够接受 XML
的脚本应该不难。但是,仍然需要保证格式是脚本所希望的格式。比方说,假设服务器接受下列格式的数据:
<profile>
<firstName>Larry</firstName>
<lastName>Gullahorn</lastName>
<street>9018 Heatherhorn Drive</street>
<city>Rowlett</city>
<state>Texas</state>
<zip-code>75080</zip-code>
</profile>
|
看起来和上面的 XML
类似,只有两点不同:
- 来自客户机的 XML
封装在 address
元素,但是服务器要求数据封装在 profile
元素中。
- 来自客户机的 XML
使用了 zipCode
元素,而服务器希望邮政编码放在 zip-code
元素中。
从大的层面上来说,这些小问题仅仅是服务器接收和处理数据的区别,但是服务器会彻底失败,在网页上(可能向其用户)显示意义含糊的错误消息。因此必 须明确服务器的期望的格式,并把要发送的数据塞进那种格式。然后,只有在这时才会涉及到从客户机向服务器发送 XML
数据的真正的技术问题。
向服务器发送 XML
当向服务器发送 XML
的时候,更多的代码用于获取数据和包装成 XML
,而不是真正的传输数据。实际上,只要准备好发送到服务器的 XML
字符串,发送工作就和普通文本一样了,如清单 2
所示。
清单 2.
用 XML
发送名/
值对
function callServer() {
// Get the city and state from the Web form
var firstName = document.getElementById("firstName").value;
var lastName = document.getElementById("lastName").value;
var street = document.getElementById("street").value;
var city = document.getElementById("city").value;
var state = document.getElementById("state").value;
var zipCode = document.getElementById("zipCode").value;
var xmlString = "<profile>" +
"
<firstName>" + escape(firstName) + "</firstName>" +
"
<lastName>" + escape(lastName) + "</lastName>" +
"
<street>" + escape(street) + "</street>" +
"
<city>" + escape(city) + "</city>" +
"
<state>" + escape(state) + "</state>" +
"
<zip-code>" + escape(zipCode) + "</zip-code>" +
"</profile>";
// Build the URL to connect to
var url = "/scripts/saveAddress.php";
// Open a connection to the server
xmlHttp.open("POST", url, true);
// Tell the server you're sending it XML
xmlHttp.setRequestHeader("Content-Type", "text/xml");
// Set up a function for the server to run when it's done
xmlHttp.onreadystatechange = confirmUpdate;
// Send the request
xmlHttp.send(xmlString);
}
|
大部分代码都很简单,只有少数地方值得提一下。首先,请求中的数据必须手工格式化为 XML
。阅读了三篇关于使用文档对象类型的文章之后,再来讨论它是不是很简单了?虽然不禁止在 JavaScript
中使用 DOM
创建 XML
文档,但是在通过 GET
或 POST
请求发送到网络上之前必须将 DOM
对象转化成文本。因此使用常规字符串操作来格式化数据更简单一些。当然,这样很容易出现错误和误输入,因此在编写处理 XML
的代码时必须非常小心。
建立 XML
之后,按照和发送文本基本相同的方式打开连接。对于 XML
最好使用 POST
请求,因为有些浏览器限制了 GET
请求字符串的长度,而 XML
可能很长,可以看到清单 2
中把 GET
改成了 POST
方法。此外,XML
通过 send()
方法发送,而不是附加在请求 URL
最后的参数。这些都是非常细微的区别,很容易修改。
但是必须编写一行新的代码:
xmlHttp.setRequestHeader("Content-Type", "text/xml");
|
看起来很难理解,它只不过是告诉服务器要发送的是 XML
而不是一般的名/
值对。无论哪种情况,发送的数据都是文本,但这里使用 text/xml
或者 XML
作为普通文本发送。如果使用名/
值对,对应的行应该是:
xmlHttp.setRequestHeader("Content-Type", "text/plain");
|
如果忘记告诉服务器发送的是 XML
,就会出现问题,因此不要忘掉这一步骤。
完成这些之后,剩下的就是调用 send()
并传入 XML
字符串了。服务器将收到您的 XML
请求,并(假设已经做好了准备工作)接受 XML
,解释它,然后返回响应。实际上要做的只有这么多 —— XML
请求只需要稍微修改代码。
<!----><!---->
<!---->
<!----><!---->
<!---->
|
<!----><!---->
<!---->
<!----><!---->
<!---->
|
回页首
|
|
发送 XML
:好还是不好?
在结束 XML
响应的 XML
请求(以及本文)之前,我们花点时间讨论一下在请求中使用 XML
的感受。前面已经提到,就传输而言 XML
完全不是最快的方式,但是还有更多因素要考虑。
构造 XML
不是简单的事情
首先必须认识到,对于请求来说构造 XML
不是简单的事。如清单 2
所示,数据很快就会和 XML
语义纠缠在一起:
var xmlString = "<profile>" +
"
<firstName>" + escape(firstName) + "</firstName>" +
"
<lastName>" + escape(lastName) + "</lastName>" +
"
<street>" + escape(street) + "</street>" +
"
<city>" + escape(city) + "</city>" +
"
<state>" + escape(state) + "</state>" +
"
<zip-code>" + escape(zipCode) + "</zip-code>" +
"</profile>";
|
似乎还不坏,但是要知道这是只有六个字段的 XML
片段。开发的多数 Web
表单都有十到十五个字段,虽然不一定所有的请求都使用 Ajax
,但是应该考虑这种情况。至少要花和实际数据同样多的时间来处理尖括号和标签名称,有可能使本来很少的输入变得非常大。
这里的另一个问题前面已经提到,即必须手工创建 XML
。使用 DOM
不是一种好的选择,因为没有简单易行的办法将 DOM
对象转化成在请求中发送的字符串。因此像这样使用字符串处理是最好的办法,不过也是一种维护起来最困难和新开发人员最难理解的方法。在这个例子中,所有 XML
都在一行中构造完成,如果分为多步只会更加混乱。
XML
没有为请求增加任何东西
除了复杂性的问题之外,和普通文本以及名/
值对相比,在请求中使用 XML
实际上没有多少好处(如果有的话)。要注意,本文坚持使用前面用名/
值对发送的同一些数据(请参阅清单 1
)来用 XML
发送。我没有提什么数据能用 XML
但是不能
用普通文本发送,这是因为实际上没有
任何东西可用 XML
而不能用普通文本发送。
事实上这就是 XML
和请求的底线:不是一定非要这么做不可。在本系列的下一期文章中将看到服务器可以使用 XML
实现普通文本很难做到的一些事情,但请求不属于这种情况。因此除非和只
接受 XML
的脚本(确实存在这样的脚本)打交道,在请求中最好使用普通文本。
服务器无法(以一种标准方式)发送名称/
值对
在您发送名称/
值对时,Web
浏览器会发送请求,平台会响应该请求,并承载一个服务器程序,配合它将那些名称/
值对转换成服务器程序可以轻松处理的数据。实际上,每一种服务器端技术 ——
从 Java™ servlet
到 PHP
、再到 Perl
、Ruby on Rails ——
都允许您调用多种方法来根据名称获取值。因此,获取 name
属性只是小事一桩。
这种情况并不会将我们引向另外一个方向。如果服务器使用字符串 name=jennifer&job=president
应答一个应用程序,客户机没有任何标准化的简便方法来将每个对拆分成名称和值。您必须手动解析所返回的数据。如果服务器返回一个由名称/
值对构成的响应,这样的响应的解释难度与使用分号、竖线或其他任何非标准格式化字符相同。
<!----><!---->
<!---->
|
给我一点空间!
在绝大多数 HTTP
请求中,转义序列 %20
用于表示一个空格,文本 “Live Together, Die Alone”
将以 Live%20Together,%20Die%20Alone
的形式通过 HTTP
发送。
|
|
对于您来说,这就意味没有任何简单的方法在响应中使用纯文本、使客户机以一种标准的方法获取并解释响应,至少在响应包含多个值时是如此。假设您的服务器只是要发回数字 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>
|
分享到:
相关推荐
### 掌握 Ajax 第 8 部分:在请求和响应中使用 XML #### 一、引言 本文档是“掌握 Ajax”系列的第八部分,重点讨论了在Ajax应用中利用XML作为数据交换格式的技术。作者Brett McLaughlin在前文中提到,虽然XML在...
**Ajax与XML在请求和响应中的应用** Ajax(Asynchronous JavaScript and XML)技术允许Web应用程序在不刷新整个页面的情况下与服务器进行交互,提高了用户体验。在Ajax应用程序中,XMLHttpRequest对象扮演着关键...
尽管XML在Ajax中并不是不可或缺的,但在某些情况下,使用XML仍然是一个明智的选择: 1. **数据结构复杂度高**:当需要传输的数据具有复杂的层次结构时,XML因其自描述性和良好的结构化能力成为首选。 2. **跨平台和...
以下是一些关于在Ajax中使用XML的关键点: 1. **XMLHttpRequest对象的误解**:XMLHttpRequest这个名字可能会误导开发者,让人误以为它只能处理XML。然而,这个对象的主要功能是发起HTTP请求,而不关心请求或响应的...
在Ajax应用程序中,使用XML作为发送数据的格式的理由很少,但使服务器向 客户机回发XML的理由很多。因此,您在上一篇文章中学到的关于XML的知识最终将在这篇文章中体现出某些价值。这篇文章主要探讨在大多数情况下...
无论考虑转向 XHTML 的网页设计人员、使用 JavaScript 的 Web 程序员、使用部署描述文件和数据绑定的服务器端程序员,还是研究基于 XML 的数据库的后端开发人员,都在使用这种可扩展标记语言。因此,XML 被认为是 ...
在本文中,您将看到服务器如何在请求响应中发送XML。 现在如果不使用XML就不能进行任何有意义的编程。无论考虑转向XHTML的网页设计人员、使用JavaScript的Web程序员、使用部署描述文件和数据绑定的服务器端程序员,...
第 1 部分: Ajax 入门...第 7 部分: 在请求和响应中使用 XML 80 第 8 部分: 在请求和响应中使用 XML 87 第 9 部分: Web 2.0 用户界面技术 95 第 10 部分: 使用 JSON 进行数据传输 100 第 11 部分: 服务器端的 JSON 105
在给定的代码片段中,主要展示了如何使用Java中的Apache HttpClient库发送一个包含XML数据的POST请求,并接收响应。下面是对关键部分的详细分析: 1. **导入必要的库**:代码首先导入了处理网络请求、输入输出流...
第 7 部分: 在请求和响应中使用 XML 第 8 部分:在请求和响应中使用 XML 第 9 部分: 使用 Google Ajax Search API 第 10 部分: 使用 JSON 进行数据传输 第 11 部分:将 Ajax 带入 Eclipse 的 Ajax Toolkit ...
本资源压缩包“请求响应案例资源xml”显然是为了帮助开发者理解如何在JavaWeb应用中处理XML格式的数据,特别是在请求和响应过程中。以下是对这一主题的详细讲解。 1. **HTTP协议基础** - HTTP(超文本传输协议)是...
掌握 Ajax第 1 部分-Ajax 简介 掌握 Ajax第 2 部分-使用 JavaScript 和 Ajax 发出...掌握 Ajax第 7 部分-在请求和响应中使用 XML 掌握 Ajax第 10 部分--使用 JSON 进行数据传输 掌握 Ajax第 11 部分--服务器端的 JSON
内容简要给大家说明一下:Ajax简介、使用Javascript和Ajax发出异步请求、Ajax中的高级请求响应、利用Dom进行Web响应、操作dom、建立基于Dom的Web应用程序、在请求和响应中使用XML、使用Json进行数据传输、...
资源名称:掌握Ajax chm格式内容简介:Ajax新手的入门手册,全部是基础简单的理论,深入学习AJAX的基础,整个教程总七个... 7、在请求和响应中使用XML;资源 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
"掌握 Ajax,第 7 部分 在请求和响应中使用 XML.mht"及"掌握 Ajax,第 8 部分 在请求和响应中使用 XML.mht"讨论了XML在Ajax中的应用。尽管现代Ajax更常使用JSON格式,但XML仍然是传输和解析结构化数据的一种方式。这...
这份课件详细介绍了如何在Ajax请求和响应过程中使用XML(可扩展标记语言)。XML是一种数据交换格式,常用于Web服务和跨平台的数据传输。课件中可能会涵盖如何创建XML文档,解析XML数据,以及如何通过Ajax将XML数据...
在C++中,开发人员可以使用STL库来处理Http请求和响应格式。例如,使用std::string来处理请求体和响应体的文本数据,使用std::map来处理请求头和响应头的键值对。同时,C++11中的std::regex库也可以用于解析Http请求...
在 Spring Boot 中,我们可以使用消息转换器来处理 XML 格式的请求和响应。消息转换器是 Spring MVC 中的一个概念,主要负责处理各种不同格式的请求数据进行处理,并包转换成对象,以提供更好的编程体验。 在 ...
压缩包“ajax.rar”内含:“《掌握...掌握 Ajax,第 7 部分: 在请求和响应中使用 XML(1) http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro7.html ( 缺: 掌握 Ajax,第 8 部分:在请求和响应中使用 XML(2) ...