1. 程式人生 > >libcurl + libxml2 + soapUI開發SOAP客戶端程式

libcurl + libxml2 + soapUI開發SOAP客戶端程式

2010年,我寫過一些使用gSOAP開發SOAP應用程式的系列文章,共8篇,詳情請參考以前的博文:

(1) 股票資訊客戶端程式

(2) 股票資訊服務端程式

(3) iconv解決中文亂碼問題

(4) iconv解決中文亂碼問題(續)

(5) libxml2解析SOAP響應訊息

(6) 在HP-UX下編譯gSOAP-2.7.17

(7) 基於HTTPS的基本認證(Basic Authentication)

(8) 自定義header實現使用者名稱令牌認證(Usernametoken Authentication)


使用gSOAP,基本上可以實現傻瓜相機式的快速開發。不過,大部分作業系統,即使是Linux,都沒有自帶gSOAP,要使用它就必須首先下載、編譯、安裝。另外,雖然gSOAP本身是跨平臺的,但是它必須基於一系列GNU的元件,如果不滿足條件的話,恭喜你啦,可以看看我在HP-UX下使用gSOAP有多麼的麻煩。再次,gSOAP封裝得太多,使用起來太簡單,可能也不能滿足部分人士(比如我這種人啦)學習的需要。

那麼,Linux下有沒有免安裝的、更容易實現跨平臺的、比gSOAP輕量級的、能夠進一步學習和理解HTTP、SOAP的開發工具呢?

答案是肯定的。curl就是RHEL Linux自帶的、功能強大的客戶端工具,它支援許多協議:HTTP、FTP、TELNET、SMTP、POP3等等,基於HTTP和HTTPS的SOAP更是不在話下了。更妙的是,它同時還提供一套程式設計介面libcurl,可以把curl命令的各項功能嵌入到你自己的C程式中。所以,除了SOAP客戶端,使用libcurl,還可以開發出下載工具和郵件客戶端,這是gSOAP無法相比的。

由於SOAP和XML的天然聯絡,最好使用同樣是Linux自帶的libxml2來生成SOAP請求和解析SOAP響應。即使有的Unix系統、甚至Windows系統,沒有libcurl或者libxml2,下載原始碼編譯安裝基本上也不會遇到什麼麻煩,比編譯gSOAP的過程輕鬆多了。Windows下編譯libxml2的過程及可能遇到的問題,請參考以前的博文:

http://blog.csdn.net/yui/archive/2011/01/02/6112622.aspx

此外,我們還需要soapUI進行輔助開發,我覺得soapUI最實用的功能是能夠測試一個SOAP連線是否成功,並且一字不漏地呈現它的請求格式,包括其HTTP頭資訊。這樣,我們就可以根據一個在soapUI裡測試成功的範例,依樣畫葫蘆,使用libcurl把它重現出來。soapUI的官方網站是:http://www.soapui.org/

那麼,libcurl+libxml2是否就可以取代gSOAP呢?當然也不是,首先,libcurl只是一個客戶端工具,開發不了服務端程式,其次,使用libxml2生成SOAP請求和解析SOAP響應,在大部分場合都比呼叫gSOAP的介面麻煩,這個也是必須承認的事實。僅僅進行SOAP客戶端開發的話,如果是在GNU Linux下,還是推薦gSOAP。libcurl+libxml2方案的亮點是:支援多種協議、有利於跨平臺。總之,多備一把刀,總是好的,免得殺雞的時候被迫用了把牛刀,砍樹的時候又被迫用了把小刀。

以下是基於HTTP的SOAP客戶端程式的例子,用了
http://www.webxml.com.cn/zh_cn/web_services.aspx
提供的Web Service,應該很容易看懂。中文亂碼的問題就不在這裡多說了,上面gSOAP的系列文章有解釋。



程式需要讀取stock.xml作為SOAP請求模板,也就是從soapUI測試過程中抓取的內容:



如果需要開發基於HTTPS的SOAP客戶端的話,首先要在libcurl新增openssl支援,我的前一篇博文也有介紹:http://blog.csdn.net/yui/archive/2011/01/31/6170889.aspx

使用的方法基本與前面的程式一樣,不過可能需要多加一句:


另外,如果在Code::Blocks下,編譯的關鍵是庫檔案連結次序,請見上一篇博文最後的圖。