gSOAP下载地址
http://cdnetworks-kr-1.dl.sourceforge.net/project/gsoap2/gSOAP/gsoap_2.8.8.zip
wsdl2h常用选项
- -o 文件名,指定输出头文件
- -n 名空间前缀 代替默认的ns
- -c 产生纯C代码,否则是C++代码
- -s 不要使用STL代码
- -t 文件名,指定type map文件,默认为typemap.dat
- -e 禁止为enum成员加上名空间前缀
soapcpp2.exe 的使用:
常用选项
- -C 仅生成客户端代码
- -S 仅生成服务器端代码
- -L 不要产生soapClientLib.c和soapServerLib.c文件
- -c 产生纯C代码,否则是C++代码(与头文件有关)
- -I 指定import路径(见上文)
- -x 不要产生XML示例文件
- -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
解压缩 在“命令窗口” (cmd) 中 进入目录gsoap2.8.8\gsoap\bin\win32
执行:
wsdl2h -o WebClient.h http://192.168.10.11/service.asmx?wsdl //服务地址 +?wsdl
soapcpp2 -C -I ..\..\import WebClient.h //是大写i 不是l
把新生成的文件拷贝到工程目录中
soapClientLib.cpp 不需要拷贝到文件中 否则会产生连接错误
如果执行完这步会在当前目录下生成:
1,stdsoap2.cpp ,soapC.cpp , soapServiceSoapProxy.cpp 不需要预编译。
2. 常见错误示例, error C1010 ,一般是预编译头文件的问题,在主函数中需要选预编译,添加 StdAfx.h
error LNK2001 在网络编程中需要WSOCK32.lib ,添加上即可。
客户端代码
#include "soapServiceSoapProxy.h"
#include "ServiceSoap.nsmap" //不添加这连个文件会产生 namespace 声明错误
#include "soapH.h"
int _tmain(int argc, _TCHAR* argv[])
{
struct soap add_soap;
int result = 0;
soap_init(&add_soap);
//char *pServer = "http://10.10.16.157/DataInput/Service.asmx";
_ns1__AddNewData Data;
Data.sData = "1234";
Data.soap = &add_soap;
_ns1__AddNewDataResponse Response;
Response.soap = &add_soap;
DWORD dwStart = GetTickCount();
//printf("%d", dwStart);
int iErr = soap_call___ns2__AddNewData(&add_soap, NULL, NULL, &Data, &Response);
if(add_soap.error)
{
printf("soap error:%d,%s,%s/n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );
result = add_soap.error;
}
soap_destroy(&add_soap);
soap_end(&add_soap);
soap_done(&add_soap);
getchar();
return 0;
}
AddNewData() 是服务的接口 使用wsdl2h soapcpp2生成文件后
结构体名称前面会添加 _ns1__ 、 _ns2__ 等 是传送和接收服务调用用的。
soap_call___ns2__XXX 即是你调用的服务器接口。
还有个soap_call___ns3__XXX 没有使用 估计与上面的作用是一样的。
有的文章提到使用soap_call___ns1__XXX 我没有找到
服务器是用C#编写的
参考:
http://eggbucket.iteye.com/blog/1140148