很幸运的是,在这次开发“优快云助手”的时候,优快云已经发布了帐户登录的Web Service,并且提供了演示代码。需要的请点击http://passport.youkuaiyun.com/demo/优快云LoginDemo.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”发行包
该发行包要求的先决条件太多,对于“优快云助手”而言,生成的安装包也过于庞大。
- 此发行包共包含三个合并包: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.youkuaiyun.com/Passport.aspx";
}
}
}
else
{
alert("登录失败!");
}
}
四、相关资源
然而,实现SoapClient组件的代码也不是太复杂(目前版本的主体代码为674行)。如果对Soap协议比较熟悉的话,那么通过列出源代码对Soap协议进行解释,就显得有些多余和繁琐的了。下面列出相关的资源,可以对照学习和研究。