XML 是编程中最常用的数据格式之一,对于异步应用程序中的服务器响应能够带来切实的好处。在Ajax中也不例外。
Ajax 应用程序就表现在其核心对象所选的名称 —— XMLHttpRequest,这个名称不是很好,因为它并没有反映技术上的实际情况。换句话说,多数人之所以认为 XML 是 Ajax 的核心组成部分,仅仅是因为他们想当然地以为 XMLHttpRequest 对象在任何时候都使用 XML。但实情并非如此,本文第一部分给出了原因。实际上,您将看到在多数 Ajax 应用程序中 XML 很少出现。 XML 确实有应用在 Ajax 中,而且 XMLHttpRequest 也支持这种用法。也确实没有什么能阻挡您向服务器发送 XML。
XML在Ajax中的使用
在异步应用程序中 XML 有两种基本的用法:
1.以 XML 格式从网页向服务器发送请求
2.以 XML 格式在网页中从服务器接收请求
其中第一种用法,即用 XML 发送请求,需要将请求的格式设置为 XML,可以使用 API 来完成,也可以与文本连成字符串,然后将结果发送到服务器。按照这种思路,主要的任务就是通过既符合 XML 规则又能被服务器理解的方式构造请求。因此这里的关键实际上是 XML 格式,得到需要发送的数据之后,只需要用 XML 语法将其包装起来。本文后面讨论 XML 在 Ajax 应用程序中的这种用法。
第二种用法,即用 XML 接收请求,需要从服务器上接收响应,然后从 XML 提取数据(同样,可以用 API 或者采用蛮力方法)。这种情况下,关键在于来自服务器的数据,而您恰好需要从 XML 中提取这些数据以便使用。
客户机到服务器的 XML
在您编写的 90% Web 应用程序中,最终都会使用名/值对发送到服务器。比方说,如果用户在网页表单中输入姓名和地址,可能希望数据采用下列形式:
firstName=Larry
lastName=Gullahorn
street=9018 Heatherhorn Drive
city=Rowlett
state=Texas
zipCode=75080
清单 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 的数据能够被正确地接收:
1.保证向其发送 XML 的脚本能够接受 XML 数据格式。
2.保证脚本认可发送数据所采用的特定 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 类似,只有两点不同:
1. 来自客户机的 XML 封装在 address 元素,但是服务器要求数据封装在 profile 元素中。
2. 来自客户机的 XML 使用了 zipCode 元素,而服务器希望邮政编码放在 zip-code 元素中。
从大的层面上来说,这些小问题仅仅是服务器接收和处理数据的区别,但是服务器会彻底失败,在网页上(可能向其用户)显示意义含糊的错误消息。因此必须明确服务器的期望的格式,并把要发送的数据塞进那种格式。然后,只有在这时才会涉及到从客户机向服务器发送 XML 数据的真正的技术问题。
向服务器发送 XML
当向服务器发送 XML 的时候,更多的代码用于获取数据和包装成 XML,而不是真正的传输数据。实际上,只要准备好发送到服务器的 XML 字符串,发送工作就和普通文本一样。用 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.aspx";
// 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 可能很长,可以看到代码段中把 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做出什么样的相应,在下篇文章中将介绍。
分享到:
相关推荐
### Ajax与XML:深入理解XML在Ajax中的角色 在探讨Ajax与XML的深层次关系之前,让我们首先澄清一个普遍存在的误解。尽管“Ajax”这个术语中包含“XML”,但这并不意味着XML是实现Ajax功能的必要条件。实际上,...
### 掌握 Ajax 第 8 部分:在请求和响应中使用 XML #### 一、引言 本文档是“掌握 Ajax”系列的第八部分,重点讨论了在Ajax应用中利用XML作为数据交换格式的技术。作者Brett McLaughlin在前文中提到,虽然XML在...
2. **选择数据格式**:在决定是否使用XML作为Ajax请求和响应的数据格式时,应考虑几个因素。XML适合于复杂、结构化的数据,但解析和生成XML可能会比其他格式如JSON更复杂,导致更高的CPU和内存使用。此外,XML的大小...
掌握 Ajax第 1 部分-Ajax 简介 掌握 Ajax第 2 部分-使用 JavaScript 和 Ajax 发出...掌握 Ajax第 7 部分-在请求和响应中使用 XML 掌握 Ajax第 10 部分--使用 JSON 进行数据传输 掌握 Ajax第 11 部分--服务器端的 JSON
### AJAX中的高级请求和响应详解 #### 深入理解HTTP就绪状态 在探讨AJAX中的高级请求和响应之前,我们首先需要回顾一下HTTP就绪状态及其在AJAX编程中的作用。AJAX(Asynchronous JavaScript and XML)的核心是`...
在Ajax应用程序中,使用XML作为发送数据的格式的理由很少,但使服务器向 客户机回发XML的理由很多。因此,您在上一篇文章中学到的关于XML的知识最终将在这篇文章中体现出某些价值。这篇文章主要探讨在大多数情况下...
`jq.js`中可能包含使用jQuery的Ajax方法,如`$.get()`, `$.post()`, 或者更通用的`$.ajax()`,它们简化了创建和处理Ajax请求的过程。jQuery还提供了方便的DOM操作方法,如`$(selector).html()`用于更新页面元素的...
在深入研究这个项目时,开发者首先需要了解JSF和Ajax的基础知识,然后可以查看源码以理解Ajax4jsf如何处理Ajax请求和响应,以及如何在JSF组件中集成Ajax功能。此外,通过运行示例或测试代码,开发者能够快速上手并...
`_doRequest(anEvent, aQuery)`是发送请求的关键,它根据当前状态和事件决定是否发起请求,同时使用回调函数`_onResponse`处理响应。`_getWebRoot`方法获取项目根目录,确保请求URL的正确性。`_getXML`方法则负责...
无论考虑转向 XHTML 的网页设计人员、使用 JavaScript 的 Web 程序员、使用部署描述文件和数据绑定的服务器端程序员,还是研究基于 XML 的数据库的后端开发人员,都在使用这种可扩展标记语言。因此,XML 被认为是 ...
下面我们将详细讨论Ajax的基本使用和XML的解析方式。 1. Ajax基本使用: - 创建XMLHttpRequest对象:在JavaScript中,首先需要创建一个XMLHttpRequest对象,这是Ajax的核心。 - 配置请求:设置HTTP请求的类型...
1. **跨域问题**:默认情况下,AJAX请求受到同源策略限制。可以通过CORS(Cross-Origin Resource Sharing)或其他技术解决跨域问题。 2. **缓存控制**:可以设置HTTP头来决定是否缓存请求,以优化性能。 3. **错误...
**Ajax(Asynchronous JavaScript and XML)技术是一种在无需重新...通过分析这些文件,你可以深入学习如何在实际项目中使用Ajax与服务器进行XML数据交换,以及如何在前端解析和处理这些数据,从而提升网页的用户体验。
9. **Promise和async/await**:在现代浏览器中,可以使用Promise和async/await语法处理AJAX请求,使异步编程更加简洁和易读。 10. **错误处理**:确保添加适当的错误处理机制,如检查请求状态、捕获异常,以及使用...
通过研究和实践这个压缩包中的示例代码,开发者可以了解如何处理API请求、处理响应数据、以及如何在实际项目中整合和展示搜索结果。这对于想要在网站上添加定制化搜索功能的开发者来说是非常宝贵的资源。
Ajax Interceptor 是一款专为谷歌浏览器(Chrome)设计的插件,它允许开发者在Ajax请求发送后和响应返回前进行干预,从而实现对AJAX请求数据的修改。这款插件对于前端开发、调试以及测试来说是一个强大的工具,特别...
在开发过程中,还需要注意Chrome的安全策略和权限设置,确保扩展在获取Ajax请求记录时不侵犯用户隐私,并遵循Chrome的扩展开发指南。 总之,Chrome扩展插件获取Ajax请求记录是一项重要的Web开发技能,它可以帮助...
- **事件处理**:Ajax请求过程中有多个关键事件,如`onreadystatechange`,当服务器响应状态改变时触发,通过检查`readyState`和`status`属性判断请求是否完成。 ### 3. Ajax在ASP.NET中的应用 - **ASP.NET AJAX**...
1. 减轻服务器的负担:Ajax 的根本理念是“按需取数据”,因此可以最大限度地减少冗余请求和响应对服务器造成的负担。 2. 无刷新更新页面:Ajax 可以实现在不刷新整个页面的情况下更新页面内容,减少用户实际和心理...