2010-03-25 65 views
11

我試過使用gSOAP訪問Web服務(例如使用提供的WSDL生成C存根,然後在應用程序中使用它們)。但是,我發現生成的.c和目標文件非常大(幾兆字節),這是我工作的嵌入式環境中的一個問題。gSOAP是否有輕量級的替代品?

你是否知道任何簡單的SOAP庫,還是必須退回到通用XML生成器和解析器(如ezXML)?

+7

歡迎來到(不那麼)的「簡單對象訪問協議」 - 臃腫大象解決方案的SOA(面向服務的體系結構)。 – 2010-03-25 18:10:43

+0

我不明白爲什麼要在這裏指責SOAP。這是服務定義的大小,與SOAP無關。 REST上的XML或JSON在大小上是相同的。但最終可能會更糟糕,因爲您必須自己編寫** all **序列,而沒有方便的數據綁定來爲您生成所有代碼。我使用gSOAP進行自動數據綁定,明確贏家。否則,如果沒有gSOAP,讓程序員長時間工作在繁瑣的XML或JSON API上,那麼大型服務的編碼就是過去了。 – 2017-07-05 16:37:12

+0

[https://www.genivia.com/dev.html#performance](https://www.genivia.com/dev.html#performance)一個非常標準的用於與gSOAP進行XML消息交換的應用程序需要100k以下的代碼,並且每秒運行10k條消息。主要由工具自動編碼,沒有辛苦的工作。歡迎來到自動編碼的未來。 – 2017-07-05 20:47:17

回答

5

我最近也看到了這個問題,我發現的最好的選擇是gSOAP,它非常成熟並且經過了很好的測試。但是,我決定採用非SOAP路由,因爲我在客戶端和服務器端都是一種選擇。在使用gSOAP之前,請確保您可以使用他們的許可證,您可能有義務釋放您的代碼或付款,具體取決於您如何使用它。

另一種選擇是Apache Axis2/C,雖然我沒有經驗(我猜它的尺寸與gSOAP相似)。他們的客戶端API是here。關於客戶端API的教程是here

如果您決定轉到解析XML路由,您可能會對this SO問題感興趣(請參閱答案)。

您也可以爲解析後的路線結帳boost :: spirit。如果你習慣於C++(它們可以寫成可重入的,所以通過一個帶有extern「C」接口的靜態對象調用它們的方法就是kosher),它有能力製作小型的,快速的,專用的(和通用的)解析器。 )。我可以在一般意義上證明它(不特定於XML)。陡峭的學習曲線,但很大的回報。

1

通常我們會回頭直接創建XML(主要是通過字符串連接),在這裏沒有好的SOAP庫可以使用。

另一種解決方案可能是您切換到JSON,它通常具有較小的開銷和請求/響應大小,因此在嵌入式程序中可能會更好。如果您只有可用的SOAP WebService,則可以在服務器上使用代理腳本,將JSON請求轉換爲SOAP請求,並將SOAP響應轉換爲JSON響應。

2

這是您正在創建的Web服務嗎?如果是這樣,請考慮使用REST而不是SOAP。 REST非常簡單,您可以使用現有的,經過測試的,現在可用的HTTP處理程序,而不是通過巨大的HTTP-XML-SOAP轉換層。

如果您正在使用其他人的Web服務,請檢查SOAP模式和/或響應示例。我不敢相信我在倡導這一點,但如果模式不是可擴展的或遞歸的,那麼最好在原始HTTP響應中使用簡單的LALR解析器甚至字符串匹配,而不是試圖解析SOAP或XML。這在嵌入式C中實現起來要簡單得多。

+0

我必須使用某人的網絡服務。到目前爲止,我們有可用的XML解析器(上面提到的ezXML工作非常好),所以除非出現一些奇蹟般的SOAP庫,否則我可能必須這麼做:-) – che 2010-05-13 20:12:54

+1

REST還有一個額外的缺點:它不適合面向事件的Web服務,這是最真實的世界Web服務。 – rkellerm 2010-05-16 16:32:54

1

你看過Apache CXF。它有幾個代碼生成功能

* Java to WSDL 
* WSDL to Java 
* XSD to WSDL 
* WSDL to XML 
* WSDL to SOAP 
* WSDL to service 

更加有用的指南建立一個消費者here

+0

這看起來不錯,但它似乎只支持Java,而且我沒有選擇在客戶端使用Java運行時。 – che 2010-05-17 07:33:29