CSDN助手源码剖析(三)--自制Web Service客户端组件SoapClient

来源:互联网 发布:剑灵杀生丸捏脸数据 编辑:程序博客网 时间:2024/04/29 14:01

很幸运的是,在这次开发“CSDN助手”的时候,CSDN已经发布了帐户登录的Web Service,并且提供了演示代码。需要的请点击http://passport.csdn.net/demo/CSDNLoginDemo.rar。要是没有这个登录Web Service,我们实现登录的方法就很可能是非常繁琐的。如先下载登录页面,然后输入用户名、密码、验证码,模拟提交页面,再分析响应的页面中的字符串特征,判断是否登录成功,如果不成功,原因何在。而使用Web Service,我们需要做的仅仅是调用函数,通过返回值就可以知道登录的状态了。

在.net中,通过引用web,可以快速的封装一个客户端类,调用Web Service是很简单的。但在VC++中,就没有这么便利的封装手段了。微软针对Web Service的应用,发布了一个工具叫“Microsoft SOAP Toolkit 3.0”。通过它提供的COM组件,我们也可以方便的调用Web Service。但查看“Microsoft SOAP Toolkit 3.0”发行包的说明之后,我还是决定自制一个简易的Web Service调用组件。

一、为什么不使用“Microsoft SOAP Toolkit 3.0”发行包

该发行包要求的先决条件太多,对于“CSDN助手”而言,生成的安装包也过于庞大。

  1. 此发行包共包含三个合并包:Soap3_core.msm、Isapi3_files.msm、Winhttp.msm
    对于所有的安装模式,Soap3_core.msm和winhttp.msm都是必须的。而这两个包加起来有1.4M。
  2. 该工具必须首先安装MSXML4 SP1。
  3. 欲使用此发行包,必使用最新版本的Microsoft Windows® Installer,而这又不是每台机器上都有的。

二、自制Web Service客户端组件的功能需求

  1. 支持同步和异步调用
  2. 支持多种参数类型的打包,主要有:s:base64Binary、s:boolean、s:int、s:long、s:float、s:double、s:datetime。这可以满足绝大多数的函数调用要求。
  3. 支持javascript脚本的调用。

三、调用举例

下面是用javascript调用SoapClient组件的范例。

//生成SoapClient组件
var oSoapClient=new ActiveXObject("CuteSoap.SoapClient");

//使用WSDL文件初始化SoapClient组件
var oWSDLFile="cie://{151BCE69-A4E7-4D44-ABB6-EC8FFDAE6398}/images/UserLoginService.wsdl";
oSoapClient.SoapInit(oWSDLFile,"","");

//登录
function fn_login()
{
//准备参数数组
var oParams=new Object();
oParams["LoginName"]=document.all["UserName"].value;
oParams["Password"]=document.all["Password"].value;
oParams["VerifyCode"]=document.all["VerifyCode"].value;
oParams["ClientKey"]=oClientKey;

//执行“UserLogin”方法
oSoapClient.Execute("UserLogin",oParams,fn_login_result,null);

return false;
}

//回调函数,当UserLogin方法调用完毕时返回
function fn_login_result(oResult,oError)
{
 if(oError==null && oResult!=null)
 {
  var oResultArray=new VBArray(oResult);  
  if(!oResultArray.getItem(0))
  {
   alert(oResultArray.getItem(1));
  }
  else
  {
   //成功
   
   //将当前用户名及密码加入
   fn_saveUserInfo();
   
   //更新"我感兴趣的社区"
   var oUserName=document.all["UserName"].value;
   oShell.Notify("151BCE69-A4E7-4D44-ABB6-EC8FFDAE6398",1,"1_9001",oUserName,true,false);
   
   //尝试进入前一页
   if(!checkPrev())
   {
    //进入功能页面
    document.URL="http://passport.csdn.net/Passport.aspx"; 
   }
   
  }
 }
 else
 {
  alert("登录失败!");
 }
}

四、相关资源

然而,实现SoapClient组件的代码也不是太复杂(目前版本的主体代码为674行)。如果对Soap协议比较熟悉的话,那么通过列出源代码对Soap协议进行解释,就显得有些多余和繁琐的了。下面列出相关的资源,可以对照学习和研究。

  1. javascript脚本中定义的参数数组,如何在VC++中访问。
  2. XMLSOAP应用简介
  3. JavaScript脚本实现的SOAP Client
  4. CSDN助手源码剖析(二)--URL Moniker的封装
  5. “CSDN助手”源代码下载,请转到http://blog.csdn.net/seasol/archive/2006/07/04/873747.aspx