CSDN助手源碼剖析(三)--自制Web Service客戶端組件SoapClient

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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章