在論壇裡看到有人問使用wsdl2cpp產生代碼,才知道原來symbian提供了一個協助工具輔助來產生webservice client的代碼,比起我上回折騰的自己參考AddressBook例子做的webservice用戶端要簡單多了,類似於gSOAP的使用。
首先,去forum.nokia.com.cn搜一下WSDL-to-C++_for_S60,這是用於Carbice Vs的工具,不過也可以獨立安裝,用命令列來產生所需要的代碼。下載安裝即可。
第二步,運行它的wsdl2cpp工具,得到一些原始碼,不過它比gSOAP弱智一點點,不能直接給出一個wsdl的URL,所以最好將wsdl下載到本地,給它一個檔案名稱即可:
wsdl2cpp --callback-class PServiceConsumer --include-dir ./work/inc --source-dir ./work/src pservice.wsdl
這樣我們會在目前的目錄下的work/src和work/inc下得到它產生的頭與源檔案,實現的原理仍是用的Symbian內建的Web Service API來做的。將這些代碼弄到工程裡去。
第三步,工程裡新增了代碼,修改mmp,與直接使用這些API一樣,總之,這個工具只是協助我們產生了源碼架構,比較方便罷了。不過額外有一點增加的地方是:
LIBRARY XmlDataBinding.lib
USERINCLUDE /epoc32/include/libc
USERINCLUDE /epoc32/include/xmldatabinding
這裡的xmldatabinding是新的東西,所以之前需要安裝,在安裝wsdl-to-c++工具後,有一個XmlDataBinding.zip在它的目錄下,開啟解到相應的epoc32目錄裡去即可。它包括了lib和一些標頭檔。
並且,在手機跑,應該將XmlDataBinding.sis也安裝一下,從這一點看,似乎比gSOAP要麻煩一點了。
第四步,現在開始動手修改代碼,很簡單了。
private:// DataCHelloWSThreeAppView* iAppView;CPServiceService * iService;CPServiceConsumer * iObserver;
在標頭檔裡增加iService和iObserver就可以了,CPP中有兩步,一是初始化串連,二是遠程調用方法:
//這裡初始化代碼CSenXmlServiceDescription *pServiceDesc = CSenXmlServiceDescription::NewLC(KServiceEndpoint, KNullDesC8()); pServiceDesc->SetFrameworkIdL(KDefaultBasicWebServicesFrameworkID); iObserver = CPServiceConsumer::NewLC(); iService = CPServiceService::NewLC(*iObserver,*pServiceDesc);_LIT(KStr,"Init service.");LOG(KStr);//這裡遠程調用代碼if(iObserver->iStatus==KSenConnectionStatusReady){RHelloWorld aHello;RHelloWorldResponse aHelloResp;TRAPD(error,aHelloResp=iService->HelloWorldL(aHello));if(error){RDebug::Printf("error %d",error);}TBuf<64> buf;buf.Copy(aHelloResp.iHelloWorldResult);_LIT(KStr,"result is %S");LOG_FORMAT((KStr,buf));}
這樣就好了,當然析構時要刪除這些成員變數。
總結一下,其實我用三種方法來調用web service,都是最簡單的HelloWorld,比較而言,還是gSOAP比較方便。