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助手”而言,生成的安装包也过于庞大。
- 此发行包共包含三个合并包:Soap3_core.msm、Isapi3_files.msm、Winhttp.msm
对于所有的安装模式,Soap3_core.msm和winhttp.msm都是必须的。而这两个包加起来有1.4M。 - 该工具必须首先安装MSXML4 SP1。
- 欲使用此发行包,必使用最新版本的Microsoft Windows® Installer,而这又不是每台机器上都有的。
二、自制Web Service客户端组件的功能需求
- 支持同步和异步调用
- 支持多种参数类型的打包,主要有:s:base64Binary、s:boolean、s:int、s:long、s:float、s:double、s:datetime。这可以满足绝大多数的函数调用要求。
- 支持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协议进行解释,就显得有些多余和繁琐的了。下面列出相关的资源,可以对照学习和研究。
- javascript脚本中定义的参数数组,如何在VC++中访问。
- XMLSOAP应用简介
- JavaScript脚本实现的SOAP Client
- CSDN助手源码剖析(二)--URL Moniker的封装
- “CSDN助手”源代码下载,请转到http://blog.csdn.net/seasol/archive/2006/07/04/873747.aspx
- CSDN助手源码剖析(三)--自制Web Service客户端组件SoapClient
- CSDN助手源码剖析(一)--缓存优化
- CSDN助手源码剖析(二)--URL Moniker的封装
- Tomcat源码解析(三):service服务组件
- Azureus源码剖析(三)
- chromium源码剖析(三)
- chromium源码剖析(三)
- Atlas源码剖析(三)
- Hessian源码剖析(三)
- 深入剖析Spring Web源码(三) - Spring Web MVC工作流
- 深入剖析Spring Web源码(三) - Spring Web MVC工作流
- phphub_iOS客户端源码剖析
- RESTful Web Service(三):使用ajax创建客户端
- Android 组件 — Service 剖析
- 12306——(三)在线订票助手工具源码
- 应用Web Service组件
- Android Service Manager源码剖析
- Web bench源码剖析
- 开心词典—王小丫与拉登的问答!够汗~~~~
- 常见内存错误
- SCJP考试之套题1(SCJP_104)
- RedHat AS4(X86) + Oracle9204 服务器安装说明(成功运行)
- javascript脚本中定义的参数数组,如何在VC++中访问
- CSDN助手源码剖析(三)--自制Web Service客户端组件SoapClient
- 数组指针与函数指针
- 常见的内存错误(转)
- SQL语句总结一(MS SQL Server)
- 雨一直下
- 心经
- 项目和组织中的两个黄金三角
- 关于HOOK截获中文输入
- SCJP考试之套题2(SCJP_147)