gsoap使用

下载gSoap

http://sourceforge.net/projects/gsoap2

1.下载完成后直接解压缩,在目录gsoap-2.8\gsoap\bin下面有编译工具,支持多个平台,我们使用的是win32平台的工具

    wsdl2h.exe  解析WebService的wsdl文件

    soapcpp2.exe 编译WebService代码

2.接下来需要先获得WebService的wsdl文件,访问WebService时,http://XXXX/XXXX.asmx?wsdl这个地址就是需要的wsdl文件,选择查看源文件,然后另存为的方式,获取到wsdl文件,例如:另存为webs.wsdl文件。

3.解析wsdl文件

    执行wsdl2h.exe -o webs.wsdl命令,就会生成一个webs.h的头文件 wsdl2h -s –o x:\xxx\TestWebService.h

用法:
wsdl2h -o 头文件名 WSDL文件名或URL
wsdl2h常用选项
  • -o 文件名,指定输出头文件
  • -n 名空间前缀 代替默认的ns
  • -c 产生纯C代码,否则是C++代码
  • -s 不要使用STL代码
  • -t 文件名,指定type map文件,默认为typemap.dat
  • -e 禁止为enum成员加上名空间前缀

type map文件用于指定SOAP/XML中的类型与C/C++之间的转换规则,比如在wsmap.dat里写


4.编译

soapcpp2 头文件
例:
soapcpp2 ayandy.h

将生成下面这些文件

  • soapStub.h    // soap的存根文件,定义了ayandy.h里对应的远程调用模型
  • soapC.c soapH.h  // soap的序列和反序列代码,它已经包含了soapStub.h,服务器端与客户端都要包含它
  • soapClient.c soapClientLib.c // 客户端代码,soapClientLib.c文件则只是简单地包含soapClient.c和soapC.c
  • soapServer.c soapServerLib.c // 服务器端代码,soapServerLib.c文件则只是简单地包含soapServer.c和soapC.c
  • ServiceSoap.nsmap ServiceSoap12.nsmap // 名空间定义,服务器端与客户端都要包含它
  • soapServiceSoapProxy.h soapServiceSoap12Proxy.h // 客户端的C++简单包装(如果头文件是纯C代码,这两个文件就不会生成)

综上所述

  • 如果编写服务器端,项目里应该加入soapServerLib.c,代码里包含头文件soapH.h
  • 如果编写客户端,项目里应该加入soapClientLib.c,代码里包含头文件SoapH.h(或xxxxProxy.h)
  • 当然,还要加入gsoap库里的stdsoap2.cpp文件(如果是写C代码,则加入stdsoap2.c)

如果看到soapcpp2提示:”Critical error: #import: Cannot open file "stlvector.h" for reading.“, 那是因为我们的头文件使用了STL(wsdl2h 没用-s选项),这时要使用-I选项指定gSOAP的 import文件路径,这个路径是"$gsoap\gsoap\import":

soapcpp2 ayandy.h -I D:\gsoap-2.7\gsoap\import
 
 

    执行soapcpp2.exe webs.h,会生成很多个文件,这里同样可以加一些参数,具体不解释了,可以通过soapcpp2.exe /?命令来查看。

    我们找出需要的以下几个文件:

    soapC.cpp

    soapClient.cpp

    soapH.h

    soapStub.h

    WebsSoap.nsmap

    再加上另外两个文件(不在bin目录下,在gsoap-2.8\gsoap目录下):

    stdsoap2.h

    stdsoap2.cpp

    一共7个文件,就是我们最终访问WebService所需要的soap访问调用文件。这里是C++的代码,根据需要,也可以生成C的代码,stdsoap2.cpp更换为stdsoap2.h文件。

    把上述7个文件,加入到自己的工程中编译即可,接下来就是如何调用的问题了。


soapcpp2常用选项
  • -C 仅生成客户端代码
  • -S 仅生成服务器端代码
  • -L 不要产生soapClientLib.c和soapServerLib.c文件
  • -c 产生纯C代码,否则是C++代码(与头文件有关)
  • -I 指定import路径(见上文)
  • -x 不要产生XML示例文件
  • -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。

------------------------------------------

这些文件没把我给弄崩溃了,简要说一下吧:

工程中所要包含的文件(不是include的)有:

soapStub.h  soapH.h     stdsoap2.h      AbysalEmail.h (这个文件时第一步生成的头文件)

            soapC.cpp   stdsoap2.cpp    soapClient.cpp (客户端) soapServer.cpp

这个要搞清楚。

程序中include的头文件有

#include "soap/ServiceSoap.nsmap"//命名空间,这个必不可少
#include "soap/soapH.h

#include "soap/soapServiceSoapProxy.h" //如果使用代理类

调用哪些方法 可以去 soapStub.h 去找


ps:

很重要的是 如果在vc中开发的话,引入的3个cpp文件要进行设置

方法:工程 -》设置 -》选择cpp文件 -》预编译头 -》选择不使用

另一方面 ,soap也是使用socket通信的 所以链接的时候还要加上wsock32.lib

方法: 工程-》设置-》链接 在后面加上wsock32.lib即可


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值