2010-03-25 116 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