gsoap 相关使用(wsdl2h 和 soapcpp2)
gsoap 相关介绍
介绍地址:http://blog.csdn.net/darkone/article/details/1442525
gsoap 下载
下载地址:https://www.cs.fsu.edu/~engelen/soap.html
gsoap 代码生成
1. wsdl2h 根据 wsdl 和 xml 等文件生成 *.h 文件 (此文件是一个中间文件,在不程序实现中没有作用-本人看法)
2. soapcpp2 根据 *.h 文件生成 对应的service和client程序代码(生成文件固定包含”soapH.h,soapStub.h,soapC.cpp” 3个文件 和 多组”*Proxy.h,*Proxy.cpp,*.nsmap” client 文件 和 多组”*Service.h,*Service.cpp,*.nsmap” service 文件)
3. 示例:(更具gsoap提供的计数器wdsl编写下面命令)
@echo 下面代码为window(bat)脚本
set path=calc
set serverPath=calcService
mkdir %path%
@echo 根据 calc.wsdl 生成 calc.h 文件
@echo《wsdl文件可以下载到本地使用》
@echo 例子: wsdl2h -s -o calc.h -f -p -n calc %文件路径%\calc.wsdl
wsdl2h -s -o calc.h -f -p -n calc http://www.cs.fsu.edu/~engelen/calc.wsdl
@echo 根据 calc.h 文件生成c++ client客户端代码
soapcpp2 -d %path% calc.h -C -x -i -v -c
@echo 根据 calc.h 文件生成 c++ server服务端代码
soapcpp2 -d %serverPath% calc.h -S -x -i -v -c
注意:本人是在windows下使用的gsoap工具(使用gsoap编译好的程序)。目前gsoap官方编译好的程序无法对 https 公布的wsdl等文件进行在线生成*.h文件(错误提示:Cannot connect to https site: SSL/TLS support not enabled, please rebuild wsdl2h with SSL/TLS enabled using ‘make secure’ or download the WSDL/WADL and XSD files and rerun wsdl2h on these files directly by specifying the file names on the command line.),所以需要下载wsdl等文件或者重新对wsdl2h进行使用openssl编译(本人在windows下没有编译成功,同时也查找了很多资料也没有找到对应的编译方法,希望有在window编译成功带openssl信息的gsoap大牛们可以分享一下) 本人使用的gsoap版本《2.8.55》
4. wsdl2h 和 soapcpp2命令参数
介绍地址:http://blog.csdn.net/wskqw/article/details/78753682
gsoap 代码的使用
1. client 调用过程
- 将生产的代码考入到工程目录下(soapH.h,soapStub.h,soapC.cpp,Proxy.cpp,*Proxy.h,.nsmap 以及gsoap目录下的stdsoap2.cpp,stdsoap2.h 本人生成的C++客户端代码所有需要这两个文件)
- 调用过程
#include “calc-gsoap/calc.nsmap”
#include “calc-gsoap/soapcalcProxy.h”
int main()
{
calcProxy calcPro(“http://websrv.cs.fsu.edu/~engelen/calcserver.cgi“);
double dst = 0;
calcPro.add(3,4,dst);
std::cout<< “calcProxy.add(3,4) = ” << dst << std::endl;
system(“pause”);
}
《注意》:编译错误提示:
1. stdsoap2.obj : error LNK2001: 无法解析的外部符号 _namespaces
原因:没有引用“calc.nsmap”文件
2. soapC.obj : error LNK2019: 无法解析的外部符号 _soap_match_tag,该符号在函数 _soap_getelement 中被引用
原因:没有添加“stdsoap2.cpp”到工程中文件
2. service的实现过程(gsoap官网的事例代码)
#include “soapcalcService.h”
#include “calc.nsmap”
int main(int argc, char **argv)
{
calcService calc;
if (argc < 2)
calc.serve(); /* serve as CGI application */
else
{ int port = atoi(argv[1]);
if (!port)
{ fprintf(stderr, “Usage: calcserver++ \n”);
exit(0);
}
/* run iterative server on port until fatal error */
if (calc.run(port))
{ calc.soap_stream_fault(std::cerr);
exit(-1);
}
}
return 0;
}
int calcService::add(double a, double b, double *result)
{ *result = a + b;
return SOAP_OK;
}
int calcService::sub(double a, double b, double *result)
{ *result = a - b;
return SOAP_OK;
}
int calcService::mul(double a, double b, double *result)
{ result = a b;
return SOAP_OK;
}
int calcService::div(double a, double b, double *result)
{ if (b)
*result = a / b;
else
{ char s = (char)soap_malloc(this, 1024);
(SOAP_SNPRINTF(s, 1024, 100), “http://tempuri.org/\”>Can’t divide %f by %f“, a, b);
return soap_senderfault(“Division by zero”, s);
}
return SOAP_OK;
}
int calcService::pow(double a, double b, double *result)
{ *result = ::pow(a, b);
if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */
{ char s = (char)soap_malloc(this, 1024);
(SOAP_SNPRINTF(s, 1024, 100), “http://tempuri.org/\”>Can’t take power of %f to %f“, a, b);
return soap_senderfault(“Power function domain error”, s);
}
return SOAP_OK;
}
《注意》:在gsoap的源码中包含很多事例。事例在文件“gsoap\samples”下
下一篇: gsoap SO_REUSEADDR
推荐阅读
-
Linux netstat命令详解和使用例子(显示各种网络相关信息)
-
主机商DigitalOcean和ConoHa服务器的相关使用评测
-
Linux netstat命令详解和使用例子(显示各种网络相关信息)
-
gsoap 相关使用(wsdl2h 和 soapcpp2)
-
pandas数据相关性分析_使用Pandas,SciPy和Seaborn进行探索性数据分析
-
使用pycharm开发web——django2.1.5(四)视图和模板相关
-
SpringBoot下lombok不起作用的相关问题解决及@Slf4j和@Data使用
-
各版本中的Excel表格文件菜单和相关功能无法使用的解决方法
-
主机商DigitalOcean和ConoHa服务器的相关使用评测
-
Linux netstat命令详解和使用例子(显示各种网络相关信息)