gsoap的wsdl文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wsdl是通过gsoap自动生成的。也就是说再没有wsdl文件的时候可以先定义xxxx.h文件,xxxx.h
的定义里面要包括
//gsoap ns service nam e: severName 等项。然后通过soapcpp2.exe xxxx.h来生成wsdl文件等。
如果有可以利用的wsdl文件则可以先生成.h文件再生成soap依赖文件,如:soapStub.h等。
;;;;;;;;;;;;;;;;;;;;;
准备:
到/projects/gsoap2/files/下载gsoap最新版本,笔者写此文章时最新版本是gsoap_2.7.13.tar.gz,解压缩,笔者解压缩到了D:/software下。Step1:创建要发布的C++头文件,指定服务操作(calcu.h)
在头文件中定义了三个操作:加、减和开方。参数a和b是输入型参数,result 用来保存结果,返回值说明调用是否成功。为图方便,笔者将此文件建在gsoap RPC编译器同一目录下,即D:/software/gsoap-2.7.13/gsoap/bin/win32,文件内容如下:
//gsoap ns service name: calc
//gsoap ns service style: rpc
//gsoap ns service namespace: /calc.wsdl
//gsoap ns service location: /calc.cgi
//gsoap ns schema namespace: urn:calc
int ns__add(double a, double b, double *result);
int ns__sub(double a, double b, double *result);
int ns__sqrt(double a, double *result);
说明:service name:提供的服务的名称。
service style:Web Service绑定类型。
service namespace:命名空间,对应于wsdl中的targetNamespace和xmlns:tns的值。
Service location:服务定位,对应于wsdl中的
Step2:用gsoap RPC编译器生成相应文件
在命令行中执行soapcpp2.exe calcu.h,执行情况如下图所示,执行完成后生成如图18个文件。
Step3:创建工程编译服务器程序
1.笔者用的是VS2008,创建一个空项目,取名mycalc。
2.将刚刚生成的18个文件以及D:\software\gsoap-2.7.13\gsoap目录下
的stdsoap2.h和stdsoap2.cpp拷贝至项目目录下,这里是mycalc\mycalc。
3.添加如图所示文件至项目
4.添加wsock32.lib至项目
项目—>属性—>配置属性—>连接器—>输入—>额外依赖项,输入wsock32.lib。确定。
5.soapC.cpp、soapServer.cpp、stdsoap2.cpp不使用预编译
选中这三个文件,属性—>配置属性—>C/C++—>预编译头,第一个选不使用预编译头。(笔者建的工程默认的就是不使用)
6.创建calc.h的实现文件calcServer.cpp,内容如下
#include"soapH.h"/* get the gSOAP-generated definitions */
#include"calc.nsmap"/* get the gSOAP-generated namespace bindings */ #include
int main(int argc, char* argv[])
{
int m, s; /* master and slave sockets */
struct soap *soap = soap_new();
if (argc < 2)
soap_serve(soap); /* serve as CGI application */
else
{
m = soap_bind(soap, NULL, atoi(argv[1]), 100); /* bind to the port supplied as command-line argument */
if (m < 0)
{
soap_print_fault(soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
for (;;)
{
s = soap_accept(soap);
fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
if (s < 0)
{
soap_print_fault(soap, stderr);
exit(1);
}
soap_serve(soap);
soap_end(soap);
}
}
soap_done(soap);
free(soap);
return 0;
}
int ns__add(struct soap *soap, double a, double b, double *result) {
*result = a + b;
return SOAP_OK;
}
int ns__sub(struct soap *soap, double a, double b, double *result) {
*result = a - b;
return SOAP_OK;
}
int ns__sqrt(struct soap *soap, double a, double *result)
{
if (a >= 0)
{
*result = sqrt(a);
return SOAP_OK;
}
else
return soap_sender_fault(soap, "Square root of negative value", "I can only take the square root of non-negative values");
}
Step4:发布
编译成功后,在debug目录下生成一个可执行文件mycalc.exe。通过在命令行中执行mycalc.exe 9000,发布C++服务,9000是端口号,可以指定任意没被使用的端口号。