gsoap的wsdl文件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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是端口号,可以指定任意没被使用的端口号。

相关文档
最新文档