冷风.NET

    ---默默無聞
posts - 27, comments - 234, trackbacks - 5, articles - 56
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

XMLHTTP---介绍

Posted on 2004-12-03 16:42 冷风.net 阅读(34166) 评论(47) 编辑 收藏
MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。
创建XMLHTTP对象的语句如下:
Set objXML = CreateObject("Msxml2.XMLHTTP") 或
Set objXML = CreateObject(“Microsoft.XMLHTTP”)
' Or, for version 3.0 of XMLHTTP, use:
' Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP")
对象创建后调用Open方法对Request对象进行初始化,语法格式为:
poster.open http-method, url, async, userID, password
Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示: 
http-method: HTTP的通信方式,比如GET或是 POST
url: 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序
async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作
userID 用户ID,用于服务器身份验证
password 用户密码,用于服务器身份验证
XMLHTTP对象的Send方法
用Open方法对Request对象进行初始化后,调用Send方法发送XML数据:
poster.send XML-data
Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。
XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
值 说明
0 Response对象已经创建,但XML文档上载过程尚未结束
1 XML文档已经装载完毕
2 XML文档已经装载完毕,正在处理中
3 部分XML文档已经解析
4 文档已经解析完毕,客户端可以接受返回消息
客户机处理响应信息
客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的:
● responseTxt:将返回消息作为文本字符串;
● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用;
● responseStream:将返回消息视为Stream对象

------就是下面这个很简单的JAVASCRIPT函数SEND(STR,URL)---------------
使用到的是XMLDOM和XMLHTTP对象.用这种技术的好处是:全JS控制,方便/简单,比RDS
或者remote好多了.(前提:服务器端和客户端都必须安装IE5或者更高版本),在俺贴的
那个无刷新在线信息功能使用的也是这种技术.有兴趣的朋友可以看看..
function Send(Str,URL)
//STR参数是传入的XML数据,你也可以传入其他文本数据.
//不过这个函数需要服务器端处理之后返回XML数据,你也可以修改一下
//URL参数表示你所要处理数据的ASP文件地址
{
var Http = new ActiveXObject("Microsoft.XMLHTTP") //建立XMLHTTP对象
var Dom = new ActiveXObject("Microsoft.XMLDOM") //建立XMLDOM对象
Http.open("POST",URL,false)
//第一个参数的意思是,用"POST"方式发送数据.可以大到4MB,也可以换为"GET".只能256KB
//第2个参数的意思是数据发送到哪个文件处理
//第3个参数意思是同步或异步方式.TRUE为异步,FALSE为同步
Http.send(Str) //开始发送数据.............嘟嘟..
Dom.async=false //设置为同步方式获取数据
Dom.loadXML(Http.responseText)
//开始获取服务器端处理后返回的数据.我在这里设置必须为XML数据,否则出错.
//你也可以自己修改.使返回的是2进制或者记录集数据.................................
if(Dom.parseError.errorCode != 0) //检查是否发生获取数据时错误
{
delete(Http)
delete(Dom)
return(false)
}
else
{
var Back = Dom.documentElement.childNodes.item(0).text
//得到返回的XML数据,我这里假设处理程序只返回一行XML数据(一个节点)
delete(Http)
delete(Dom)
return(Back) //函数返回数据.......................结束
}
}
 
VAR CAT = Send("<用户资料><姓名>谢柠檬</姓名></用户资料>","HTTP://WWW.CHINAASP.COM/VIVA.ASP") //执行函数
IF(CAT == FALSE)
{
ALERT("对不起.处理程序返回的是FALSE.数据处理已经失败........")
}
ELSE
{
IF(EVAL(CAT))
{
ALERT("OK.数据已经发送成功.兼以处理完成!!!!!!")
}
ELSE
{
ALERT("对不起.处理程序返回的是FALSE.数据处理已经失败........")
}
}
 
===============================VIVA.ASP============================
ON ERROR RESUME NEXT
DIM BOBO
DIM MOMO
SET BOBO = SERVER.CREATEOBJECT("MICROSOFT.XMLDOM")
BOBO.ASYNC = FALSE
BOBO.LOAD REQUEST
IF BOBO.PARSEERROR.ERRORCODE <> 0 THEN
RESPONSE.WRITE("<程序处理结果><最终结果>FALSE</最终结果></程序处理结果>")
ELSE
SET MOMO = BOBO.DOCUMENTELEMENT
IF MOMO.CHILDNODES.ITEM(0).TEXT = "谢柠檬" THEN
RESPONSE.WRITE("<程序处理结果><最终结果>TRUE</最终结果></程序处理结果>")
ELSE
RESPONSE.WRITE("<程序处理结果><最终结果>FALSE</最终结果></程序处理结果>")
END IF
END IF
SET BOBO = NOTHING

Feedback

#1楼  回复 引用   

2005-03-16 12:05 by todi[未注册用户]
好文章,俺也改改试试。 http://www.brianrealestate.com

#2楼  回复 引用   

2005-04-21 21:43 by popo[未注册用户]
用了,都说好

#3楼  回复 引用   

2005-04-23 22:35 by popo[未注册用户]
收下

#4楼  回复 引用   

2005-04-29 15:08 by CHSoft
好文章,谢谢!

#5楼  回复 引用   

2005-06-21 17:39 by aaa
好..我喜欢

#6楼  回复 引用   

2005-06-21 17:41 by aaa
因为刚接触....感觉很好....但是没介绍到xmldom???而文章有提及....这里希望作者能改改

#7楼  回复 引用   

2005-07-05 21:42 by 学没有[未注册用户]
哎,我也觉得好,但是看了还是不懂得用,对我菜鸟说有深奥,晕啊,谁能和我一起研究交流,请加我QQ:55124531谢谢,加了请了告诉我说你是xmlhttp交流我就加入,谢谢

#8楼  回复 引用   

2005-07-30 11:17 by dongdong[未注册用户]
用xmlhttp 怎样写 每隔几分钟执行某些代码

#9楼  回复 引用 查看   

2005-08-11 16:48 by meteor      
大侠,能不能弄个可以运行的程序放在上面啊?我敲了N久你的代码,结果不能运行

#10楼  回复 引用   

2005-08-11 18:24 by 123[未注册用户]
文章虽好,但是你的学生好差.:)

#11楼  回复 引用 查看   

2005-08-23 15:25 by 西门子乌      
你好,我也好。

#12楼  回复 引用   

2005-08-27 23:12 by 新手[未注册用户]
我想请教一点:

#13楼  回复 引用   

2005-08-27 23:18 by 新手[未注册用户]
我想请教一点:在OPEN方法包含了用于服务器验证的userID和password参数,但如果服务器验证还需要验证码,那怎么办?请加我QQ:12696964,告诉我说你是xmlhttp交流我就加入,谢谢

#14楼  回复 引用   

2005-09-16 01:59 by xiao3[未注册用户]
请教一下,我在使用如下的代码时:(javascript中)

var objXML = new ActiveXObject("MSXML2.DOMDocument");
objXML.async = false;
objXML.load("data1.xml");
alert("d:"+objXML.xml);

如果 装载的 data1.xml文件的第一句是:<?xml version="1.0" encoding="utf-8" ?>
alert出来就是空的。
而如果把第一句修改成<?xml version="1.0" encoding="gb2312" ?>
alert出来的内容是data1.xml的内容。
请教一下,如何在保持<?xml version="1.0" encoding="utf-8" ?> 的情况下,在javascript中能正确装载 xml文件? 现在是要把编码修改成 gb2312才可以。
谢谢。

#15楼[楼主]  回复 引用 查看   

2005-09-16 18:35 by 冷风.net      
to xiao3 :
  在WEB。config將編碼改為GB2312就行了

#16楼[楼主]  回复 引用 查看   

2005-09-16 18:37 by 冷风.net      
我想请教一点:在OPEN方法包含了用于服务器验证的userID和password参数,但如果服务器验证还需要验证码,那怎么办?请加我QQ:12696964,告诉我说你是xmlhttp交流我就加入,谢谢

這些參數可是是多個的,這與XMLHTTP無關,,XMLHTTP只負責發送與結收HTTP數據.

#17楼  回复 引用   

2005-09-17 01:51 by xiao3[未注册用户]
非常感谢楼主的回复!谢谢。
我在 asp代码中嵌入了那一段 load xml的 javascript代码,
不知道您说的 web.config在哪里设置?我在站点目录和 系统盘都没有搜索到。

谢谢~

#18楼  回复 引用   

2005-10-09 09:14 by 小新[未注册用户]
我想问一下,这个功能能否在php程序中实现呢?如果能实现,如何在php当中实现这个功能,大家也帮我解答一下吗?

#19楼  回复 引用   

2005-10-09 09:14 by 小新[未注册用户]
我想问一下,这个功能能否在php程序中实现呢?如果能实现,如何在php当中实现这个功能,大家也帮我解答一下吗?

#20楼  回复 引用   

2005-10-10 17:06 by sdd330[未注册用户]
XMLHTTP对象的使用 是不是受到浏览器安全设置的限制,安全级别设高了就用不了了

#21楼  回复 引用   

2005-11-08 15:16 by 阿爸擦[未注册用户]
是个好文章

#22楼  回复 引用   

2005-11-08 19:59 by smile9961[未注册用户]
如下代碼在win2000下正常,但在xp或win2003下就沒有回應,請指教:
function DisplayCodeContent(objContent, varCode)
{
if (objContent == null)
return;

var xmlStates = GetData('varCode',varCode,'');
//alert(xmlStates);

var objXmlDom = new ActiveXObject("Microsoft.XMLDOM");
if (!objXmlDom.loadXML(xmlStates))
{
var sErr = "Response XML String is messed up\n" + xmlStates;
alert(sErr);
}
else
{
var nodesContent = objXmlDom.selectNodes("/Response/CodeContent");
for (var n = 0; n < nodesContent.length; n++)
{
document.getElementById(objContent).value = nodesContent[n].text;
}
}
}

function GetData(varName,varMain,varAttach)
{
var objHTTP = new ActiveXObject("Microsoft.XMLHTTP");
var szURL

if (varName=='varCode')
{
szURL="GetMoldMachCodeContent.aspx?varCode=" + varMain;
}

var szHttpMethod = "POST";

//alert(szURL);
objHTTP.Open(szHttpMethod, szURL, false);
objHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
objHTTP.Send();

var szReply = objHTTP.ResponseText;

if (objHTTP.status != 200)
{
//failure
//alert('failure');
szReply = "";
}
//alert(szReply);
return szReply;
}

#23楼  回复 引用   

2006-01-06 09:55 by njh[未注册用户]
很好,但我试的时候老是不行....
我太菜了...努力学习中

#24楼  回复 引用   

2006-01-15 15:40 by liuyong[未注册用户]
我很喜欢这篇文章,老大有QQ没有啊,我想加你呢

#25楼  回复 引用   

2006-01-17 20:39 by keke[未注册用户]
好东西要收藏

#26楼  回复 引用   

2006-03-28 11:06 by guoludeyouke[未注册用户]
error line: Dom.loadXML(Http.responseText)
错误代码: -107296748

#27楼  回复 引用   

2006-03-28 11:07 by guoludeyouke[未注册用户]
viva.asp中需要加入

<meta http-equiv="Content-Type" content="text/javascript; charset=utf-8">

#28楼  回复 引用   

2006-03-28 13:07 by 湖南菜[未注册用户]
他好,,我也好。。

#29楼  回复 引用   

2006-03-28 14:09 by 第六世纪[未注册用户]
不错,好文

#30楼  回复 引用 查看   

2006-04-03 03:27 by 晓风残月      
我想请教一点:在OPEN方法包含了用于服务器验证的userID和password参数,但如果服务器验证还需要验证码,那怎么办?请加我QQ:12696964,告诉我说你是xmlhttp交流我就加入,谢谢

這些參數可是是多個的,這與XMLHTTP無關,,XMLHTTP只負責發送與結收HTTP數據.

可能是XmlHttp本身机制导致的问题,详细信息与解决方案可以参考 旁观者 的blog:
http://blog.csdn.net/zhengyun_ustc/archive/2002/05/20/12657.aspx

#31楼  回复 引用   

2006-04-20 19:50 by 慕白[未注册用户]
我的网站使用XMLHTTP写了一段代码实现远程验证,也就是说注册我的网站(A网站)的新用户必须先注册成为别人的网站(B网站)的会员,B网站没有给A网站专门的接口,我就只有找朋友帮助使用XMLHTTP写了一个ASP页面用来验证注册A网站的人是否已经在B网站注册成功,如果经过验证该用户名已经在B网站注册成功,那么我们才允许他继续注册A网站。

经过朋友的努力,以上用XMLHTTP写出来的代码已经有效了,但现在我很纳闷的是,他写的这段ASP代码只在对放在我当前这个服务器上的网站有效果,如果把网站放到其他人的服务器上,XMLHTTP写的内容就没有效果了?请问这是为什么?为什么一模一样的XMLHTTP代码在其他服务器上都无效(我起码找了5个服务器测试,他们都说没有效果!),我的QQ:123456555,信箱:123456555@qq.com,希望你能回复我,谢谢!


#32楼  回复 引用   

2006-07-12 13:13 by jexica2006[未注册用户]
好!

#33楼  回复 引用   

2006-08-03 12:27 by 边城[未注册用户]
不错

#34楼  回复 引用   

2006-08-12 15:28 by 小智[未注册用户]
------------------------------
非刷新异步取得服务端信息;
不使用框架;
不使用XmlHttp。
------------------------------
QQ:30496329

#35楼  回复 引用   

2006-08-24 10:38 by algos[未注册用户]
垃圾文章,只介绍MS,非MS的怎么办 ?

#36楼  回复 引用   

2006-12-04 17:23 by 林阿牛[未注册用户]
我是菜鸟,请大家指教一下几个问题
1、返回的数据有中文会出现乱码要怎么处理。
2、服务端如何接收XML数据

#37楼  回复 引用   

2006-12-22 21:26 by www[匿名][未注册用户]
http://www.immagini-auto-ccxxzz.oussi18.info asino http://www.crissy-moran-foto-gratis.oussi18.info belle fighe che trombano http://www.gay-gratis.pejkut18.info grande pecorina http://www.cazzi-molli.pejkut18.info rumene sfondate http://www.ludicrous-operaio.oydomen18.info lingue calde http://www.sesso-bdsm.oydomen18.info bellezza cazzo http://www.tiava-pornostar.oukuru18.info vecchie tette http://www.studentesse-hard.oukuru18.info gloryholes http://www.messaggi-erotici.phoo18.info fiche rotte http://www.video-gretis.phoo18.info pompini gara

#38楼  回复 引用   

2007-04-01 15:08 by asp[未注册用户]
我需要用ajax,请与我联系,研究QQ:498555351

#39楼  回复 引用   

2007-06-08 11:38 by 星雨[未注册用户]
问一下 xmlhttp 多个系统同步登录可以的吗?

#40楼  回复 引用   

2007-07-16 14:01 by ga[未注册用户]
http://www.powerleveling-game.com

#41楼  回复 引用   

2007-08-08 16:34 by 小吴[未注册用户]
文章很不错,顶你一下

#42楼  回复 引用   

2007-10-10 09:20 by xman5566[未注册用户]
本人也发两句下面是我做的一个提交form的方法,希望对大家有帮助
这部会是使用url提交的方法,很简单
function retrieveURL(url,spanId) {
span=spanId;
if (window.XMLHttpRequest) {
// Non-IE browsers
req = new XMLHttpRequest();
req.onreadystatechange = processStateChange;
try {
req.open("GET", url, true);
} catch (e) {
alert(e);
}
req.send(null);
} else if (window.ActiveXObject) {
// IE
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = processStateChange;
req.open("GET", url, true);
req.send();
}
}
}

#43楼  回复 引用   

2007-10-10 09:29 by xman5566[未注册用户]
下面是一个提交 form的方法,不好意思我全部粘过来得了,稍微写一下注释,有点乱,大家凑合着看吧,
var req;
var which;
var span;
// 使用URL提交的方法
function retrieveURL(url,spanId) {
span=spanId;
//创建xmlhttprequest对象
if (window.XMLHttpRequest) {
// Non-IE browsers
req = new XMLHttpRequest();
//这个是设置请求响应之后的方法,具体实现在下面了
req.onreadystatechange = processStateChange;
try {
req.open("GET", url, true);
} catch (e) {
alert(e);
}
req.send(null);
} else if (window.ActiveXObject) {
// IE
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = processStateChange;
req.open("GET", url, true);
req.send();
}
}
}
//这个是请求被响应之后所执行的动作,根据你的要求你可以写你的业务需求
function processStateChange(spanId) {
var loading_msg='<img src=/image/sablier.gif>';
//如果响应的状态为4的话,证明服务器已经做出响应
if (req.readyState == 4) {
//如果状态码是200证明响应正常
if (req.status == 200) {
setInnerHTML(document.getElementById(span),req.responseText);
} else {
setInnerHTML(document.getElementById(span),loading_msg);
}
}
}

////////////////////////
if (!window.XMLHttpRequest) {
window.XMLHttpRequest=function (){
return new ActiveXObject("Microsoft.XMLHTTP");
}
}

// 这个方法就是向服务器发送请求
function ajaxLoadPage(url,request,method,container)
{
method=method.toUpperCase();
var loading_msg='<img src=/image/sablier.gif>';
var loader=new XMLHttpRequest;//require Cross-Browser XMLHttpRequest
if (method=='GET')
{
urls=url.split("?");
if (urls[1]=='' || typeof urls[1]=='undefined')
{
url=urls[0]+"?"+request;
}
else
{
url=urls[0]+"?"+urls[1]+"&"+request;
}

request=null;//for GET method,loader should send NULL
}
loader.open(method,url,true);
if (method=="POST")
{
loader.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
}
loader.onreadystatechange=function(){
if (loader.readyState==1)
{
setInnerHTML(document.getElementById(container),loading_msg);
}
if (loader.readyState==4)
{
setInnerHTML(document.getElementById(container),loader.responseText);
}
}
loader.send(request);
}
//这个方法是将form中所有属性的值做为参数向服务器传递
function formToRequestString(form_obj)
{
var query_string='';
var and='';
//alert(form_obj.length);
for (i=0;i<form_obj.length ;i++ )
{
e=form_obj[i];
if (e.name!='' && e.name!=null)
{
if (e.type=='select-one')
{
element_value=e.options[e.selectedIndex].value;
}
else if (e.type=='checkbox' || e.type=='radio')
{
if (e.checked==false)
{
continue;
}
element_value=e.value;
}
else
{
element_value=e.value;
}
query_string+=and+e.name+'='+element_value.replace(/\&/g,"%26");
and="&"
}

}
return query_string;
}
//这个方法是调用form提交的方法
function ajaxFormSubmit(form_obj,container)
{
ajaxLoadPage(form_obj.getAttributeNode("action").value,formToRequestString(form_obj),form_obj.getAttributeNode("method").value,container);

}

//这个方法是form提交后的响应方法
var setInnerHTML = function (el, htmlCode) {
var ua = navigator.userAgent.toLowerCase();

if (ua.indexOf('msie') >= 0 && ua.indexOf('opera') < 0) {
htmlCode = '<div style="display:none">for IE</div>' + htmlCode;
htmlCode = htmlCode.replace(/<script([^>]*)>/gi,
'<script$1 defer>');
el.innerHTML = '';
el.innerHTML = htmlCode;
el.removeChild(el.firstChild);
} else {
var el_next = el.nextSibling;
var el_parent = el.parentNode;
el_parent.removeChild(el);
el.innerHTML = htmlCode;
if (el_next) {
el_parent.insertBefore(el, el_next)
} else {
el_parent.appendChild(el);
}
}
}


写的比较粗糙请大家凑合着看吧,解析服务器的响应有两种,一种是解析成纯文本的方式,另一种就是解析成xml文本的方式,如果是xml的方式,服务器端返回的必须是规范的xml文档.
那么怎么在 open 的那个URL页面中send(str)的值呢?

#45楼  回复 引用 查看   

2007-11-11 17:41 by 林松斌      
大概看了下,感觉挻好的,收藏了~

#46楼  回复 引用   

2008-01-11 19:38 by jizhisen[未注册用户]
好就一个字,谁用谁知道!!