很幸運的是,在這次開發“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