看到标题,是不是感觉很有意思呢?的确很这样的。本文来教你实现通过调用 Web 服务和使用 Ajax 技术来实现查询某个 QQ 的在线状态。先作一下本次实例的相关介绍: 使用技术:Ajax、PHP 调用 Web 服务 目的:实时查询指定 QQ 号的在线状态,程序会每 10 秒检测一次该 QQ 的状态信息 思路:通过 Ajax 来请求 PHP 程序, PHP 程序再去调用查询 QQ 状态的 Web 服务,并将返回的结果以 Ajax 请求的响应文本送回到原始请求页面。 效果图: 本例要调用的 Web 服务信息如下: 腾讯QQ在线状态 WEB 服务 Endpoint: http://www./webservices/qqOnlineWebService.asmx Disco: http://www./webservices/qqOnlineWebService.asmx?disco WSDL: http://www./webservices/qqOnlineWebService.asmx?wsdl 要想了解如果何用该 Web 服务,您可以打开上面的 Endpoint 查看它的使用方法。如果您对 PHP 调用 Web 服务还不太了解,请查看我之前写的这篇文章:在 PHP 中使用 SOAP 协议调用 Web服务(WebService)。 OK,万事俱备,来看编码。本例一共包括两个文件,一个是 qq.htm,另外是一个是 qq.php。qq.htm 负责显示表单以及查询结果,而 qq.php 则负责后台请求。qq.htm 的代码如下: <head> <style type="text/css"> body{font-family:Tahoma;font-size:13px;} input,button{border:1px solid gray;} .tip{color:gray} p{line-height:5px} </style> <script type="text/javascript"> var timer=null; //定义一个计时器
function runajax(objId,serverPage){ var xmlhttp=false; if(window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); } else{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET",serverPage); xmlhttp.onreadystatechange=function(){ if(xmlhttp.readyState==4 && xmlhttp.status==200){ //将返回的结果不断添加到显示结果列表中。 document.getElementById(objId).innerHTML +="<p>" + xmlhttp.responseText + "</p>"; } } xmlhttp.send(null); } //进行查询 function doquery(){ var qqNo=document.getElementById("qq").value; if(qqNo == ""){ alert("请先输入QQ号!"); return false; } runajax("showStatus","qq.php?qqNo=" + qqNo); //每 10 秒会检测一次,这里的 第二个参数是以毫秒为单位的 timer=setTimeout("doquery()",10000); } //停止查询 function stopquery(){ window.clearTimeout(timer); } </script> </head> <body> <form method="GET" action="qq.php" onsubmit="doquery(); return false" > 请输入要查询的 QQ 号:<input type="text" name="qq" /> <input type="submit" value="查询" /> <button id="stopbtn" onclick="stopquery();">停止</button><span class="tip" style="margin-left:20px">程序会每隔 10 秒检测一次该 QQ 号的状态</span> </form> <div id="showStatus"> </div> </body> 由于程序要实现每隔 10 秒检测一次这样的功能。所以使用 window.setTimeout 这个函数来解决这个问题。另外,由于程序要记录一个列表,所以需要将每次查询的结果添加到状态列表中,并且不能覆盖原来的文本,所以在显示 Ajax 响应时,需要注意源码中的这一句: document.getElementById(objId).innerHTML +="<p>" + xmlhttp.responseText + "</p>"; 来看 qq.php 的代码: <?php //前三行代码的作用是禁用 PHP 的缓存 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache");
//各种状态码及它们对应代码的意义(这里还加入了 HTML 标记,以加上颜色信息) $status=array("Y"=>"<font color=green>Online</font>", "N"=>"<font color=blue>Offline</font>", "E"=>"<font color=red>Error QQ NO</font>", "V"=>"<font color=red>Your free times have been ran out!</p>" ); if(isset($_GET['qqNo'])==TRUE){ //实例化并开始请求远程 Web 服务 $client=new SoapClient("http://www./webservices/qqOnlineWebService.asmx?wsdl"); $resultObj=$client->qqCheckOnline(array('qqCode'=>$_GET['qqNo']));
//获取状态码 $resultCode=$resultObj->qqCheckOnlineResult; $curTime=date("H:i:s", time()); //时间信息
switch($resultCode){ case "Y": echo $curTime." This QQ now is ".$status["Y"]; break; //当前在线 case "N": echo $curTime." This QQ now is ".$status["N"]; break; //当前离线 case "E": echo $curTime." This QQ is an ".$status["E"]; break; //错误的QQ号 case "V": echo $curTime." ".$status["V"]; break; //免费用户超过数量 default: echo $curTime." Other error has occured!!"; //其它错误 } } ?> 该程序首先禁用了 PHP 的缓存功能,如果不禁用,那么“即时”这种效果就无法实现。在判断过 GET 变量之后,程序开始请求远程 Web 服务,之后对返回的状态码进行了判断,并作出了相应的显示。 您已经看到了,由于该 Web 服务的返回结果中,有一个 V 的状态码,它说明了“免费用户超过数量”,我在测试时,也发现了这一点。它的意思应该是这样的:针对某个 IP 而言,使用该服务的数量是有限的,一旦你的免费次数用完了,再访问时,就会返回这样的信息。 如果您对本文中介绍的方法有何意见或建议,请留下您的高见,欢迎交流。本文由 NBWD 原创,请放心转载。
|