8.1 如何使用gSOAP編譯環境來編譯SOAP客戶端程序 通常,一個SOAP客戶端應用的實現需要為每個客戶端需要調用的遠程方法提供一個存根例程(stub routine)。存根例程主要負責編碼參數信息;將包含參數信息的調用請求發送給制定的SOAP服務;等待返回結果;將結果中的參數信息編碼??蛻舳顺绦蛘{用訪問遠程方法的存根例程就像調用本地方法一樣。用C/C++手工別寫一個存根例程是個十分痛苦的差使,尤其當遠程方法的參數中包含特定的數據結構(如:記錄、數組、圖等)時。幸運的是,gSOAP包中的'wsdl2h'WSDL解析器和'soapcpp2’存根及架構編譯器能夠將web服務客戶端及服務端的開發工作自動化。 'soapcpp2’存根及架構編譯器是可以生成構建C++ SOAP客戶端所需的C++源碼的預編譯器。該預編譯器的輸入參數是一個標準的C/C++頭文件。這個頭文件可以由WSDL解析器根據相關的WSDL文檔自動生成。 參見下面的命令: $ wsdl2h -o quote.h http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl 上面的命令根據制定URL提供的WSDL文檔生成一個C++語法結構的頭文件。 假如需要生成一個純C的頭文件,需要一下命令: $ wsdl2h -c -o quote.h http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl 更多關于WSDL解析器及其選項的細節信息,請參見8.2.10節。 執行上述命令后,quote.h文件就生成了。其中包含開發客戶端或服務端程序的存根例程定義。SOAP服務遠程方法以函數聲明的方式在這個頭文件中被定義。C/C++源代碼的存根例程將通過預編譯器自動實現。同時,每個遠程方法的程序框架也被自動生成了,它可以用來建立SOAP服務端程序應用。 SOAP服務的輸入輸出參數可以是簡單的數據類型或復雜的數據結構,可以由WSDL解析器自動生成或手工定義。預編譯器將自動生成序列化/反序列化這些數據的代碼,以便存根例程可以將這些數據以xml的方式編碼或解碼。8.1.1 例子 XMethods Delayed Stock Quote 服務提供一個getQuote方法(由'wsdl2h'WSDL解析器生成的quote.h定義)。這個方法根據提供的股票名稱返回相應的股票價格。下面是這個方法的WSDL文檔信息:Endpoint URL: http://services.xmethods.net:80/soap SOAP action: "" (2 quotes) Remote method namespace: urn:xmethods-delayed-quotes Remote method name: getQuote Input parameter: symbol of type xsd:string Output parameter: Result of type xsd:float
下面是由WSDL解析器生成的getQuote.h頭文件(實際的文件內容與'wsdl2h'版本及生成選項有關): //gsoap ns1 service name: net_DOTxmethods_DOTservices_DOTstockquote_DOTStockQuoteBinding //gsoap ns1 service type: net_DOTxmethods_DOTservices_DOTstockquote_DOTStockQuotePortType //gsoap ns1 service port: http://66.28.98.121:9090/soap //gsoap ns1 service namespace: urn:xmethods-delayed-quotes //gsoap ns1 service documentation: Definitions generated by the gSOAP WSDL parser 1.0 // Service net.xmethods.services.stockquote.StockQuoteService : net.xmethods.services.stockquote.StockQuote web service //gsoap ns1 service method-style: getQuote rpc //gsoap ns1 service method-encoding: getQuote http://schemas.xmlsoap.org/soap/encoding/ //gsoap ns1 service method-action: getQuote urn:xmethods-delayed-quotes#getQuote int ns1__getQuote(char *symbol, float &Result); 這個頭文件用C/C++代碼為gSOAP預編譯器指定了web服務的細節。遠程方法被定義為函數ns1__getQuote,同時指定了客戶端調用web服務所需的所有細節信息。