gsoap中文文档
linux gsoap 用法
linux gsoap 用法gSOAP 是一个用于开发Web 服务和SOAP 客户端/服务器应用程序的开源工具包。
它可以让开发者通过创建C/C++ 代码来构建基于SOAP 的Web服务和客户端。
在Linux 上使用gSOAP,你需要遵循以下步骤:1. 下载gSOAP 工具包:- 前往gSOAP 官方网站("gSOAP Toolkit" 下载最新版本的gSOAP 工具包。
- 解压下载的压缩包。
2. 编写服务定义文件(.wsdl 文件):- 使用你喜欢的文本编辑器,编写一个包含要实现的Web 服务的定义的 .wsdl 文件。
这个文件描述了服务的数据类型、操作和消息。
3. 生成源代码:- 打开终端,进入gSOAP 工具包的解压目录。
- 运行命令`./soapcpp2 -C -I path_to_gsoap_toolkit your_service.wsdl`,其中`path_to_gsoap_toolkit` 是gSOAP 工具包的路径,`your_service.wsdl` 是你编写的 .wsdl 文件的路径。
- 这将使用gSOAP 工具根据你的 .wsdl 文件生成C/C++ 源代码。
4. 实现Web 服务:- 在生成的源代码中,找到`your_serviceService.cpp` 文件。
- 在这个文件中,你可以实现Web 服务的操作。
你需要编辑操作的函数实现,处理接收到的请求,并返回响应。
5. 编译生成的源代码:- 在终端中,使用适当的编译器(如gcc)编译生成的源代码。
- 运行命令`gcc -o your_service your_serviceService.cpp soapC.cpp soapServer.cpp stdsoap2.cpp -lgsoap++`,其中`your_service` 是生成的可执行文件名。
- 如果编译成功,将生成一个可执行文件。
6. 启动Web 服务:- 运行命令`./your_service` 来启动Web 服务。
gsoap编译
gsoap编译GSOAP是一款开源的C/C++软件,是一种基于SOAP的Web服务开发工具。
它可以让用户通过简单的代码,实现创建SOAP消息、IPC、Web服务和Web应用程序等功能。
用户可以使用gSOAP开发部署服务器端和客户端的应用程序。
本文将向您介绍gSOAP编译,并告诉您如何使用该工具。
第一步:下载gSOAP软件包在编译gSOAP之前,我们需要从官方网站下载gSOAP软件包。
该网站提供了多种版本的gSOAP,您可以根据自己的需要选择不同的版本。
建议您下载最新版本的gSOAP。
第二步:解压缩gSOAP软件包下载完成后,将gSOAP 软件包解压缩到您的计算机上。
如果您使用的是Linux和Unix操作系统,可以利用tar命令实现解压缩操作。
例如:$ tar xzf soapsource.tgz第三步:配置gSOAP 进入gSOAP软件包目录。
在该目录中会看到一个名为configure的文件。
Connectors目录中有可选的连接器。
可以使用的连接器有:Stdio连接器SSL连接器HTTPS连接器zlib连接器接下来,我们通过执行configure脚本来生成Makefile,执行以下命令: $ ./configure如果您需要配置gSOAP的全部选项,可以使用以下命令: $ ./configure --help第四步:编译gSOAP 在配置完gSOAP后,我们可以进入soapcpp2目录并使用make命令进行编译。
以下是命令:$ cd gsoap-<version>/gsoap$ make这会生成一个名为soapcpp2的可执行文件。
我们可以使用该文件来生成SOAP客户端和服务器端的代码。
第五步:测试gSOAP 完成编译后,您可以使用gSOAP 测试Web服务和Web应用程序。
您可以使用以下命令测试gSOAP:$ ./soapcpp2该命令将告诉gSOAP要生成客户端和服务器端代码的相关选项。
gSOAP
gSOAPLinux 宝库- 用C实现WebService一.系统环境 2二.gSOAP的简要使用例子 2三.图示说明 6四.要注意的问题 6五.参考文档 7六.备注 7一.系统环境linux操作系统kernel2.4.2,安装gsoap2.6到目录/usr/local/gsoap二.gSOAP的简要使用例子下面是一个简单的例子,实现一个加法运算的WebService,具体功能是cli端输入num1和num2,server端返回一个num1和num2相加的结果sum。
1.首先,我们需要做的是写一个函数声明文件,来定义接口函数ns__add,文件名字为add.h,内容如下://gsoap ns service name: add//gsoap ns service namespace: /add.wsdl //gsoap ns service location: //gsoap ns service executable: add.cgi//gsoap ns service encoding: encoded//gsoap ns schema namespace: urn:addint ns__add( int num1, int num2, int* sum );2.然后我们需要创建文件Makefile,从而利用gsoapcpp2工具由add.h生成一些.xml文件、.c文件和.h文件,这些文件均为自动生成,Makefile的内容如下:GSOAP_ROOT=/usr/local/gsoapWSNAME=addCC=g++ -g -DWITH_NONAMESPACESINCLUDE=-I $(GSOAP_ROOT)SERVER_OBJS=$(WSNAME)C.o $(WSNAME)Server.o stdsoap 2.oCLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME)Clie ntLib.o stdsoap2.oALL_OBJS=${WSNAME}server.o $(WSNAME)C.o $(WSNAME )Server.o ${WSNAME}test.o ${WSNAME}client.o $(WSNAME)Clie ntLib.o#总的目标all:server${WSNAME}.wsdl:${WSNAME}.h$(GSOAP_ROOT)/soapcpp2 -p$(WSNAME) -i -n -c ${WSNAME}.hstdsoap2.o:$(GSOAP_ROOT)/stdsoap2.c$(CC) -c $?#编译一样生成规则的.o文件$(ALL_OBJS):%.o:%.c$(CC) -c $? $(INCLUDE)#编译服务器端server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SER VER_OBJS)$(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server#编译客户端client:Makefile ${WSNAME}.wsdl ${WSNAME}client.c ${WSN AME}test.c $(ALL_OBJS) stdsoap2.o$(CC) ${WSNAME}test.o ${WSNAME}client.o $(CLIENT_OBJS ) -o ${WSNAME}testcl:rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME)H.h $(WSNAME)C.c $( WSNAME)Server.c $(WSNAME)Client.c $(WSNAME)Stub.* $(WS NAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(W SNAME)ServerLib.c $(WSNAME)ClientLib.c $(WSNAME)server ns .xsd $(WSNAME)test3.我们先来做一个server端,创建文件addserver.c文件,内容如下:#include "addH.h"#include "add.nsmap"int main(int argc, char **argv){int m, s; /* master and slave sockets */struct soap add_soap;soap_init(&add_soap);soap_set_namespaces(&add_soap, add_namespaces);if (argc < 2){printf("usage: %s <server_port> \n", argv[0]);exit(1);}else{m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);if (m < 0){soap_print_fault(&add_soap, stderr);exit(-1);}fprintf(stderr, "Socket connection successful: master socket = %d\n", m);for ( ; ; ){s = soap_accept(&add_soap);if (s < 0){soap_print_fault(&add_soap, stderr);exit(-1);}fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);add_serve(&add_soap);//该句说明该server的服务soap_end(&add_soap);}}return 0;}//server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数int ns__add(struct soap *add_soap, int num1, int num2, int * sum){*sum = num1 + num2;return 0;}4.让我们的server跑起来吧:shell>makeshell>./addserver 8888如果终端打印出“Socket connection successful: master socket = 3”,那么你的server已经在前台run起来了,应该是值得高兴的。
C++中gSOAP的使用详解
C++中gSOAP的使⽤详解⽬录SOAP简介gSOAP准备⼯作头⽂件构建客户端应⽤程序⽣成soap源码建⽴客户端项⽬构建服务端应⽤程序⽣成SOAP源码建⽴服务端项⽬打印报⽂SOAP测试项⽬源码总结本⽂主要介绍C++中gSOAP的使⽤⽅法,附带介绍SOAP协议的基础知识,适⽤于第⼀次使⽤gSOAP的开发⼈员。
gSOAP官⽹上的⽰例代码存在⼀些错误,对初次接触的⼈不太友好,本⽂是在官⽅⽰例的基础上进⾏了⼀些补充、改动。
SOAP简介SOAP 是⼀种简单的基于 XML 的协议,它使应⽤程序通过 HTTP 来交换信息,具体内容可以参考教程。
SOAP的本质是通过HTTP协议以XML格式进⾏数据交互,只不过这个XML格式的定义是⼤家公认的。
使⽤SOAP时需注意,SOAP的XML命名空间由于版本的不同可能存在差异(如soapevn、SOAP-ENV),在调⽤SOAP服务前最好确认服务器的XML格式。
gSOAPgSOAP 有商业版、开源版两个版本,开源版使⽤GPLv2开源协议,⽀持多个操作系统,具体内容参考或者。
gSOAP提供了⼀组编译⼯具(可以认为是代码⽣成器)和⼀些库⽂件,简化C/C++语⾔开发web服务或客户端程序的⼯作,开发⼈员可以专注于实现应⽤程序的逻辑:编译⼯具提供了⼀个SOAP/XML 关于C/C++ 语⾔的实现,能够⾃动完成本地C或C++数据类型和XML数据结构之间的转换。
库⽂件提供了SOAP报⽂⽣成、HTTP协议通讯的实现,及相关的配套设施,⽤于最终的SOAP报⽂的⽣成、传输。
本⽂使⽤的库⽂件主要是以下⼏个:stdsoap2.h、stdsoap2.cpp:HTTP协议的实现、最终的SOAP报⽂⽣成,如果是C语⾔则使⽤stdsoap2.h、stdsoap2.ctypemap.dat: wsdl2h⼯具根据wsdl⽂件⽣成头⽂件时需要此⽂件,可以更改项⽬的xml命名空间(后⾯再细说)threads.h:实现⾼性能的多线程服务器需要的⽂件,可以并发处理请求,并且在服务操作变得耗时时不会阻塞其他客户端请求准备⼯作先进⼊官⽹的,然后选择开源版本:将下载的压缩包解压(本⽂使⽤的是gsoap_2.8.117.zip),解压后的⽂件放到⾃⼰习惯的位置(推荐放到C盘)。
基于gSOAP的WebService开发指导说明文档
基于gSOAP的WebService开发指导说明书1简介1.1目的本文通过给出gSOAP库的基本使用样例,帮助开发人员进行WebService相关的开发1.2范围本文只包含gSOAP库C++版本的基本使用样例,不包含其他高级使用或C版本的使用方式1.3名词解释1.4参考资料2准备工作2.1gSOAP库很显然,要想基于gSOAP库开发WebService应用,你需要首先获取gSOAP库。
gSOAP库是一个开源库,你可以在以下网址进行下载:/project/showfiles.php?group_id=52781如果链接失效,也可以去一个介绍gSOAP的网站上查看最新下载地址:/~engelen/soap.html本文所用的版本为(soapcpp2):下载下来以后解压缩,你会得到这么一个目录:其中gsoap目录有以下结构:注意这两个文件:stdsoap2.h和stdsoap2.cpp,我们编写gSOAP程序的时候是需要它们的。
还要注意的是bin\win32目录下的两个可执行文件:soapcpp2.exe和wsdl2h.exe,目前我们只需要soapcpp2.exe。
也就是说,要使用gSOAP,我们需三个文件:解压目录\gsoap-2.8\gsoap\ stdsoap2.h解压目录\gsoap-2.8\gsoap\ stdsoap2.cpp解压目录\gsoap-2.8\gsoap\bin\win32\ soapcpp2.exe使用gSOAP不需要在程序中添加额外的库,而是要通过工具生成并包含额外的文件。
接下来,我们通过一个实例去了解如何使用gSOAP提供的这三个文件。
3创建一个WebService服务端工程gSOAP使用了代码生成器帮助我们生成一些辅助性的框架与类,所以我们想要使用gSOAP,则需要做一些额外的工作。
下面我们就从零开始构建一个使用gSOAP的服务端工程。
3.1新建一个工程这一步没什么难度,使用VS直接新建一个工程即可。
qt gsoap用法
qt gsoap用法Qt gSOAP是一个在Qt框架下使用gSOAP工具包的库。
gSOAP可以通过使用Web服务定义语言(WSDL)生成SOAP服务端和客户端的代码。
在本篇文章中,我将介绍如何在Qt中使用gSOAP库。
首先,要在Qt项目中使用gSOAP,需要先安装gSOAP工具包。
可以在gSOAP官方网站上下载并安装最新版本的gSOAP。
安装完成后,打开Qt项目,将gSOAP的头文件和库文件添加到项目中。
可以通过以下步骤来实现:1. 在Qt Creator中打开项目,选择“项目”菜单,然后选择“属性”选项。
2. 在属性对话框中,选择“构建和运行”选项,然后选择“构建设置”选项卡。
3. 在"C++"部分中,选择“包含路径”选项,点击“添加”按钮,将gSOAP头文件所在的目录添加进来。
4. 在"链接器"部分中,选择“库路径”选项,点击“添加”按钮,将gSOAP库文件所在的目录添加进来。
5. 在"链接器"部分中,选择“附加库”选项,点击“添加”按钮,将gSOAP库文件添加进来。
完成上述步骤后,就可以在Qt项目中使用gSOAP了。
首先,我们需要编写一个WSDL文件来定义我们的SOAP服务。
可以使用gSOAP自带的wsdl2h工具来生成C++头文件。
在终端中运行以下命令:```shellwsdl2h -o HelloWorld.h HelloWorld.wsdl```这将生成一个名为HelloWorld.h的C++头文件,其中包含了定义我们的SOAP 服务所需的类和对象。
接下来,我们可以使用soapcpp2工具来生成主要的gSOAP源文件。
在终端中运行以下命令:```shellsoapcpp2 -i -C HelloWorld.h```这将生成一系列的C++源文件,其中包括用于编写我们的服务代码的skeleton 文件和stub文件。
现在,我们可以在Qt项目中创建一个新的类来实现我们的SOAP服务。
gsoap使用方法及心得(二)
gsoap使用方法及心得(二)1、server端可以编译成CGI方式执行,而并不是绑定到某个端口。
if (argc < 2)// no args: assume this is a CGI application{soap_serve(&soap); // serve request, one thread, CGI stylesoap_destroy(&soap); // dealloc C++ datasoap_end(&soap); // dealloc data and clean up}2、在编译服务器及客户端程序时一开始把add.h生成的文件添加到工程,经常出现问题,需要自己调试。
特别是链接时段,server/client要与其生成的文件相对应,server调用生成的soapserver.cpp,client调用生成的soapclient.cpp文件。
3、多线程方式,在windows下建议用pthread_win32库,这里给出多线程下的例子。
(1) gSOAP需要的头文件://gsoap ns service name: calc//gsoap ns service style: rpc//gsoap ns service encoding: encoded//gsoap ns service namespace://gsoap ns service location://gsoap ns schema namespace: urn:calcint ns__add(double a, double b, double *result);int ns__sub(double a, double b, double *result);int ns__mul(double a, double b, double *result);int ns__div(double a, double b, double *result);int ns__pow(double a, double b, double *result);(2) 多线程服务器关键代码#include "calc.nsmap"#include "soapH.h"//宏与全局变量的定义#define BACKLOG (100)#define MAX_THR (10)#define MAX_QUEUE (1000)pthread_mutex_t queue_cs;//队列锁pthread_cond_t queue_cv;//条件变量SOAP_SOCKET queue[MAX_QUEUE];//数组队列int head =0, tail =0;//队列头队列尾初始化void * process_queue(void *);//线程入口函数int enqueue(SOAP_SOCKET);//入队列函数SOAP_SOCKET dequeue(void);//出队列函数//线程入口函数void * process_queue(void * soap){struct soap * tsoap = (struct soap *)soap;for(;;){tsoap->socket = dequeue();if (!soap_valid_socket(tsoap->socket)){break;}soap_serve(tsoap);soap_destroy(tsoap);soap_end(tsoap);}return NULL;}//入队列操作int enqueue(SOAP_SOCKET sock) {int status = SOAP_OK;int next;pthread_mutex_lock(&queue_cs); next = tail +1;if (next >= MAX_QUEUE){next = 0;}if (next == head){status = SOAP_EOM;}else{queue[tail] =sock;tail = next;}pthread_cond_signal(&queue_cv); pthread_mutex_unlock(&queue_cs); return status;}//出队列操作SOAP_SOCKET dequeue(){SOAP_SOCKET sock;pthread_mutex_lock(&queue_cs);while (head == tail ){pthread_cond_wait(&queue_cv,&queue_cs);}sock = queue[head++];if (head >= MAX_QUEUE){head =0;}pthread_mutex_unlock(&queue_cs);return sock;}//加法的实现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__mul(struct soap *soap, double a, double b, double *result){*result = a * b;return SOAP_OK;}//除法的实现int ns__div(struct soap *soap, double a, double b, double *result){if (b){*result = a / b;}else{char *s = (char*)soap_malloc(soap, 1024);sprintf(s, "Can't">/">Can't divide %f by %f", a, b);return soap_sender_fault(soap, "Division by zero", s);}return SOAP_OK;}//乘方的实现int ns__pow(struct soap *soap, double a, double b, double *result){*result = pow(a, b);if (soap_errno == EDOM) //oap_errno 和errorno类似, 但是和widnows兼容{char *s = (char*)soap_malloc(soap, 1024);sprintf(s, "Can't take the power of %f to %f", a, b);sprintf(s, "Can't">/">Can't take power of %f to %f", a, b);return soap_sender_fault(soap, "Power function domain error", s);}return SOAP_OK;}//主函数int main(int argc,char ** argv){struct soap ServerSoap;//初始话运行时环境soap_init(&ServerSoap);//如果没有参数,当作CGI程序处理if (argc <2){//CGI 风格服务请求,单线程soap_serve(&ServerSoap);//清除序列化的类的实例soap_destroy(&ServerSoap);//清除序列化的数据soap_end(&ServerSoap);}else{struct soap * soap_thr[MAX_THR];pthread_t tid[MAX_THR];int i,port = atoi(argv[1]);SOAP_SOCKET m,s;//锁和条件变量初始化pthread_mutex_init(&queue_cs,NULL);pthread_cond_init(&queue_cv,NULL);//绑定服务端口m = soap_bind(&ServerSoap,NULL,port,BACKLOG);//循环直至服务套接字合法while (!soap_valid_socket(m)){fprintf(stderr,"Bind port error! ");m = soap_bind(&ServerSoap,NULL,port,BACKLOG);}fprintf(stderr,"socket connection successful %d ",m);//生成服务线程for(i = 0; i <MAX_THR; i++){soap_thr[i] = soap_copy(&ServerSoap);fprintf(stderr,"Starting thread %d ",i);pthread_create(&tid[i],NULL,(void*(*)(void*))process_queue, (void*)soap_thr[i]);}for(;;){//接受客户端的连接s = soap_accept(&ServerSoap);if (!soap_valid_socket(s)){if (ServerSoap.errnum){soap_print_fault(&ServerSoap,stderr);continue;}else{fprintf(stderr,"Server timed out ");break;}}//客户端的IP地址fprintf(stderr,"Accepted connection from IP= %d.%d.%d.%d socket = %d ",((ServerSoap.ip)>>24)&&0xFF,((ServerSoap.ip)>>16)&0xFF,( (ServerSoap.ip)>>8)&0xFF,(ServerSoap.ip)&0xFF,(ServerSoap.so cket));//请求的套接字进入队列,如果队列已满则循环等待while(enqueue(s) == SOAP_EOM){Sleep(1000);}}//服务结束后的清理工作for(i = 0; i < MAX_THR; i++){while (enqueue(SOAP_INVALID_SOCKET) == SOAP_EOM){Sleep(1000);}}for(i=0; i< MAX_THR; i++){fprintf(stderr,"Waiting for thread %d to terminate ..",i);pthread_join(tid[i],NULL);fprintf(stderr,"terminated ");soap_done(soap_thr[i]);free(soap_thr[i]);}pthread_mutex_destroy(&queue_cs); pthread_cond_destroy(&queue_cv); }//分离运行时的环境soap_done(&ServerSoap);return 0;}。
gsoap使用小结
gsoap使用小结gSoap使用小结分类:开发路上的点点滴滴 2012-03-30 11:33 3564人阅读评论(2) 收藏举报webservicesoapauthorizationnull工具c下载gSoap1.下载完成后直接解压缩,在目录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的头文件这里简单说一下参数,主要常用的是-o和-c,-o后面跟的文件名是需要生成的文件名。
-c表示生成纯C的头文件,否则默认是C++。
具体参数可以运行wsdl2h.exe /?查看帮助。
4.编译执行soapcpp2.exe webs.h,会生成很多个文件,这里同样可以加一些参数,具体不解释了,可以通过soapcpp2.exe /?命令来查看。
我们找出需要的以下几个文件:soapC.cppsoapClient.cppsoapH.hsoapStub.hWebsSoap.nsmap再加上另外两个文件(不在bin目录下,在gsoap-2.8\gsoap目录下):stdsoap2.hstdsoap2.cpp一共7个文件,就是我们最终访问WebService所需要的soap访问调用文件。
这里是C++的代码,根据需要,也可以生成C的代码,stdsoap2.cpp更换为stdsoap2.h文件。
把上述7个文件,加入到自己的工程中编译即可,接下来就是如何调用的问题了。
gsoap用户手册
gsoap用户手册gSOAP是一个用于开发Web服务和XML数据处理的开源工具包。
它支持多种编程语言,包括C和C++,并提供了丰富的功能和工具来简化Web服务的开发和集成。
gSOAP用户手册是一个详细的文档,涵盖了gSOAP工具包的安装、配置、使用和高级特性等方面的内容。
用户手册通常包括以下内容:1. 安装指南,用户手册会提供安装gSOAP工具包的详细步骤,包括下载源代码、编译安装和配置环境等内容。
这部分内容通常会针对不同的操作系统和开发环境进行说明。
2. 快速入门,用户手册会介绍如何快速上手使用gSOAP工具包,包括创建一个简单的Web服务、生成客户端代码、编译和部署等内容。
这部分内容通常会包括示例代码和详细的步骤说明。
3. gSOAP基础,用户手册会介绍gSOAP工具包的基本概念和核心功能,包括如何定义和发布Web服务、如何处理XML数据、如何进行SOAP通信等内容。
这部分内容通常会涵盖gSOAP工具包的核心API和使用方法。
4. 高级特性,用户手册会介绍gSOAP工具包的高级特性和扩展功能,包括如何处理安全性、如何进行性能优化、如何集成其他协议等内容。
这部分内容通常会提供一些实际的应用场景和最佳实践。
5. 参考资料,用户手册通常会包括一些附录和参考资料,如API参考、配置文件说明、常见问题解答等内容,以方便开发者查阅和深入理解gSOAP工具包。
总的来说,gSOAP用户手册是开发者学习和使用gSOAP工具包的重要参考资料,它提供了全面而详细的内容,帮助开发者快速上手并深入理解gSOAP工具包的各项功能和特性。
希望这些信息能够对你有所帮助。
linux下gsoap使用及移植
Linux下gsoap的使用及移植1、下载gsoap在gsoap的官网中可以找到最新的gsoap安装包及相关文档gsoap官网:/~engelen/soap.html下载地址:/projects/gsoap2/files/2、安装gsoapa、解压zip压缩包命令:unzip gsoap_2.8.1.zipb、进入解压后生成的文件夹gsoap-2.8命令:cd gsoap-2.8/c、切换到root用户命令:su输入密码d、配置编译环境在gsoap-2.8/文件夹下执行configure文件,自动配置编译环境命令:./configuree、编译连接命令:makef、安装gsoap命令:make install安装完毕可用wsdl2h或soapcpp2查看gsoap是否已经安装成功看到上述两个命令的返回说明安装成功3、应用实例wsdl2h -o outfile.h infile.wsdl 实现wsdl文件到h文件的数据映射soapcpp2 -c outfile.h生成相应的底层通信stub,strech程序首先新建一个文件夹名为gsoap;然后(1)不使用wsdl2ha、不使用wsdl2h我们可以直接从.h文件来生成代码。
我们先定义一个函数声明文件,用来定义接口函数,名称为add.h,内容如下://gsoapopt cw//gsoap ns2 schema namespace: urn:add//gsoap ns2 schema form: unqualified//gsoap ns2 service name: add//gsoap ns2 service type: addPortType//gsoap ns2 service port:/~engelen/addserver.cgi//gsoap ns2 service namespace: urn:add//gsoap ns2 service transport: /soap/http//gsoap ns2 service method-style: add rpc//gsoap ns2 service method-encoding:add /soap/encoding///gsoap ns2 service method-action: add ""int ns2__add( int num1, int num2, int* sum );b、执行soapcpp2 –c add.h,自动生成一些远程调用需要的文件c、接下来写一个服务端,创建文件addserver.c#include "add.nsmap"int main(int argc, char **argv){int m, s;struct soap add_soap;soap_init(&add_soap);soap_set_namespaces(&add_soap, namespaces);if (argc < 2) {printf("usage: %s <server_port> \n", argv[0]);exit(1);}else{m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);if (m < 0){soap_print_fault(&add_soap, stderr);exit(-1);}fprintf(stderr, "Socket connection successful: master socket = %d\n", m);for (;;){s = soap_accept(&add_soap);if (s < 0){soap_print_fault(&add_soap, stderr);exit(-1);}fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);soap_serve(&add_soap);soap_end(&add_soap);}}return 0;}int ns2__add(struct soap *add_soap, int num1, int num2, int *sum){*sum = num1 + num2;return 0;}d、接着写一个客户端,文件名为addclient.c#include "soapStub.h"int add(const char *server, int num1, int num2, int *sum){struct soap add_soap;int result = 0;soap_init(&add_soap);soap_set_namespaces(&add_soap, namespaces);soap_call_ns2__add(&add_soap, server, NULL, num1, num2, sum);printf("server is %s, num1 is %d, num2 is %d\n", server, num1, num2);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_end(&add_soap);soap_done(&add_soap);return result;}e、最后写一个测试代码,addtest.c#include <stdio.h>#include <stdlib.h>#include <string.h>int add(const char *server, int num1, int num2, int *sum);int main(int argc, char **argv){int result = -1;char server[128] = {0};int num1;int num2;int sum;if (argc < 4) {printf("usage: %s <ip:port> num1 num2 \n", argv[0]);exit(1);}strcpy(server,argv[1]);num1 = atoi(argv[2]);num2 = atoi(argv[3]);result = add(server, num1, num2, ∑);if (result != 0){printf("soap error, errcode=%d\n", result);}else{printf("%d + %d = %d\n", num1, num2, sum);}return 0;}f、到目前为止,自己的代码编写完毕,接下来编译服务端和客户端注意:编译的时候要把gsoap包里的源代码文件stdsoap2.c和stdsoap2.h拷贝到当前目录Makefile文件:GSOAP_ROOT = gsoap的解压路径/gsoapWSNAME = addCC = g++ -g -DWITH_NONAMESPACESINCLUDE = -I$(GSOAP_ROOT)SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.oCLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.oall: serverserver: $(SERVER_OBJS)$(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS)client: $(CLIENT_OBJS)$(CC) $(INCLUDE) -o $(WSNAME)test $(CLIENT_OBJS)cl:rm -f *.o *.xml *.a *.wsdl *.nsmap soapH.h $(WSNAME)Stub.* $(WSNAME)server ns.xsd $(WSNAME)test然后执行make,即可生成addserver程序;执行make client,生成addtest程序g、运行程序执行./addserver 7777终端打印出:Socket connection successful: master socket = 3这是sever已经在前台运行起来了运行客户端./addtest ip地址:port num1 num2 返回加法的结果第一个简单的例子到此结束(2)使用wsdl2ha、建立一个新的目录,命名为weather命令:mkdir weatherb、利用gsoap 工具生成webserice 协义代码,wsdl2h从服务器下载头文件,soapcpp2相当于代码生成品,根据头文件生成相应的.c 文件和.nsmap 文件。
gSOAP快速使用步骤
gSOAP快速使用步骤用WebXml提供的“腾讯QQ在线状态WEB 服务”做示范。
Web 服务链接如下:[plain] view plaincopyprint?1.Endpoint: /webservices/qqOnlineWebService.asmx2.Disco : /webservices/qqOnlineWebService.asmx?disco3.WSDL : /webservices/qqOnlineWebService.asmx?wsdl一种简单使用gSOAP的步骤如下:[plain] view plaincopyprint?1.1. 另存/webservices/qqOnlineWebService.asmx?wsdl 为WSCheckQqOnline.wsdl2.2. 在命令行执行:3.wsdl2h -o WSCheckQqOnline.h WSCheckQqOnline.wsdl4.3. 在命令行执行:5.soapcpp2 -C -L -i -IE:\gSOAP\gsoap-2.8\gsoap\import -x WSCheckQqOnline.h6.4. 把第 3 步生成的下列 8 个文件添加到工程中:7.(1) soapStub.h // -> 头文件8.(2) soapH.h // -> 头文件9.(3) soapC.cpp // -> 源文件10.(4) soapqqOnlineWebServiceSoapProxy.h // -> 头文件11.(5) soapqqOnlineWebServiceSoapProxy.cpp // -> 源文件12.(6) qqOnlineWebServiceSoap.nsmap // -> 工程目录(当做 .cpp 文件)13.(7) stdsoap2.h // -> 头文件14.(8) stdsoap2.cpp // -> 源文件15. 5. 在 main.cpp 中先后添加:16.#include "qqOnlineWebServiceSoap.nsmap"17.#include "soapqqOnlineWebServiceSoapProxy.h"18. 6. 再补充。
gsoap编程-概述说明以及解释
gsoap编程-概述说明以及解释1.引言1.1 概述在编程领域中,gSOAP是一个常用的开源工具包,用于构建基于标准协议的Web服务。
通过gSOAP编程,开发人员可以轻松地创建和部署跨平台的Web服务,实现不同系统之间的通信和数据交换。
本文将深入探讨gSOAP编程的概念、优势以及基本原理,帮助读者了解如何利用这一强大工具进行Web服务开发。
无论是初学者还是有经验的开发人员,都可以通过学习gSOAP编程,提升自己在Web服务领域的技术水平,并加速项目的开发进程。
1.2 文章结构文章结构部分:本文主要分为引言、正文和结论三个部分。
在引言部分,将对gSOAP 编程进行概述,介绍文章的结构和目的。
正文部分将详细讨论什么是gSOAP编程、gSOAP编程的优势以及gSOAP编程的基本原理。
在结论部分,将对整篇文章进行总结,展望gSOAP编程的应用前景,并给出结束语。
通过这样的结构,读者可以系统地了解gSOAP编程的相关知识,从而更好地理解和应用该技术。
1.3 目的本文的目的在于介绍和探讨gSOAP编程的基本概念、优势以及基本原理。
通过深入了解gSOAP编程,读者可以更好地理解如何利用gSOAP 提高代码重用性、简化开发流程并实现跨平台的Web服务通信。
此外,本文也将展望gSOAP编程的未来发展趋势,为读者提供对这一技术领域的更深入了解和应用前景。
希望读者通过本文的阅读,能够更加全面地认识和理解gSOAP编程,并在实际项目中有效地运用这一技术,从而提高软件开发效率和质量。
2.正文2.1 什么是gSOAP编程gSOAP编程是一种用于开发网络通信和Web服务的工具集。
gSOAP 是一个开源的跨平台工具,可以帮助开发人员轻松地创建和部署基于SOAP和WSDL标准的Web服务。
它提供了一组工具和库,使开发人员能够在C和C++中快速地创建SOAP和RESTful风格的Web服务。
通过gSOAP编程,开发人员可以很容易地将现有的C和C++代码转换为Web服务,从而使其能够与其他系统进行通信。
gsoap中文文档
2、符号规定
3.gSoap2.5 版与 gSOAP 2.4 版(或以前版本)的不同
1.介绍...............................................................................................................................................1 2、符号规定 ....................................................................................................................................3 3.gSoap2.5 版与 gSOAP 2.4 版(或以前版本)的不同........................................................3 4.gSoap2.2 版与 gSOAP 2.1 版(或以前版本)的不同........................................................3 5. gSoap2.x 版与 gSOAP 1.x 版的不同 ..................................................................................3 6、 ....................................................................................................................................................6 准备工作...........................................................................................................................................6 快速指南................................................................................................................................个 SOAP/XML 关于 C/C++ 语言的实现,从而让 C/C++语言开发 web 服务或客户端程序的工作变得轻松了很多。绝大多数的 C++web 服务工具包提供一组 API 函数类库来处理特定的 SOAP 数据结构,这样就使得用户必须改变程序结构来适应相关 的类库。与之相反,gSOAP 利用编译器技术提供了一组透明化的 SOAP API,并将与开发无 关的 SOAP 实现细节相关的内容对用户隐藏起来。gSOAP 的编译器能够自动的将用户定义 的本地化的 C 或 C++数据类型转变为符合 XML 语法的数据结构,反之亦然。这样,只用一 组简单的 API 就将用户从 SOAP 细节实现工作中解脱了出来,可以专注与应用程序逻辑的 实现工作了。gSOAP 编译器可以集成 C/C++和 Fortran 代码(通过一个 Fortran 到 C 的接口), 嵌入式系统,其他 SOAP 程序提供的实时软件的资源和信息;可以跨越多个操作系统,语 言环境以及在防火墙后的不同组织。 gSOAP 使编写 web 服务的工作最小化了。gSOAP 编译器生成 SOAP 的代码来序列化或反 序列化 C/C++的数据结构。gSOAP 包含一个 WSDL 生成器,用它来为你的 web 服务生成 web 服务的解释。gSOAP 的解释器及导入器可以使用户不需要分析 web 服务的细节就可以
Gsoap配置及使用——【Team Center 精品培训资料】
4、根据3步骤中生成的头文件,执行soapcpp2.exe命令,如下:
soapcpp2.exe -C test.h
说明:test.h为上述3步骤生成的头文件,若执行报错,则将soapcpp2.exe与test.h文件拷贝到gsoap的Import目录下
执行如下,且会生成相关的文件
调用服务
if(soap_call___ns1__HelloWorld(soap,":localhost:2405/WebService1.asmx","",ns1__HelloWorld,&result)==SOAP_OK){
printf(result.HelloWorldResult);
}
5、将soapC.c soapClient.c soapH.h soapStub.h stdsoap2.h以及(stdsoap2.c【C语言用】/stdsoap2.cpp【C++语言用】) 文件拷贝到工程目录下(不要直接在工程中添加引用,把这些文件拷贝到工程中,然后再添加)
添加后效果如下
6、添加完成后,在soapC.c文件中添加如下.nsmp"内容,注意目录符号为双斜号
7.编写调用代码:
初始化
structsoap *soap = soap_new();
struct_ns1__HelloWorldResponse result;返回值
soap_init1(soap, SOAP_IO_KEEPALIVE);
1、解压gsoap文件到本地(注意解压的目录不要太深,不然解压数据时候存在问题)
2、定位到bin的win32目录下:
3、在当前目录中首先执行wsdl2h.exe程序,如下:
GSoap工具的安装和使用
7.4GSOAP工具的安装和使用7.4.1GSOAP安装GSOAP工具可以在WIN和UNIX两个系统平台下运行,这就使我们的程序在跨平台上有了基础。
工具的安装包可浏览其主页下载。
本DEMO的开发使用的版本为gsoap_win32_2.7.9l,工具的运行环境是Windows系统。
图7.12 Windows下的GSOAP安装包图7.13 LINUX或UNIX下的GSOAP安装包设置系统环境变量,这样可以很方便的使用GSOAP工具,如下为GSOAP的两个工具,我们将他们设置到可以在DOS下可直接使用的程序。
图7.14 GSOAP两个工具程序图7.15 GSOAP使用方法7.4.2生成客户端文件Wsdl2h.exe的参数说明参见7.5.1节图7.16 在DOS下使用wsdl2h.exe工具生成SendSMSClient.h文件图7.17 生成成功图7.18 生成的文件(短信为例)Soapcpp2.exe工具的参数说明参见7.5.2 节图7.19 根据.h生成客户端的文件图7.20 生成成功提示信息图7.21 生成的客户端文件表7.1 生成文件的说明其他文件在项目中没有使用,在此不做介绍,如需了解参看网络资料。
7.4.3生成服务端文件Wsdl2h.exe的参数说明参见7.5.1节图7.22 创建WEB SERVICE的.h文件图7.23 生成的文件Soapcpp2.exe工具的参数说明参见7.5.2 节图7.24 生成WEB SERVICE服务端文件图7.25 生成的服务端文件7.5GSOAP工具的参数soapcpp2.exe: gSOAP编译器,编译头文件生成服务器和客户端都需要的c/c++文件。
wsdl2h.exe: 编译wsdl文件生成c/c++头文件。
7.5.1wsdl2h.exe的使用wsdl2h是将wsdl定义转换成.h文件的工具。
主要有一些选项:-c代表转化成C代码。
-s代表不使用STL,取而代之需要在工程中包含stdsoap2.h和stdsoap2.cpp。
gsoap restful 示例
文章标题:深度解析gsoap在Restful API中的示例应用在当今的软件开发领域,Restful API已经成为了构建Web服务和移动应用程序的标准。
而gsoap作为一种高效的工具和库,被广泛用于实现和部署Web服务和API。
本文将深入探讨gsoap在Restful API 中的示例应用,帮助读者更全面地理解这一技术。
1. gsoap简介让我们简要介绍一下gsoap。
gsoap是基于C/C++的开源工具,可用于开发和部署Web服务和客户端,支持SOAP和REST等Web服务协议。
它提供了一种简单而强大的方法,帮助开发人员创建和使用Web服务。
而在本文中,我们将集中讨论gsoap在Restful API中的应用示例。
2. Restful API概述Restful API是一种基于Rest架构风格的API设计,它的核心理念是以资源为中心,通过HTTP协议进行通信。
Restful API使用HTTP方法来操作资源,如GET、POST、PUT和DELETE等,同时采用JSON 或XML等格式进行数据传输。
它的设计简洁而高效,越来越受到开发者的青睐。
3. gsoap在Restful API中的示例应用现在让我们深入探讨gsoap在Restful API中的示例应用。
假设我们需要实现一个简单的Restful API,用于管理用户信息,包括查询用户、创建用户、更新用户和删除用户等操作。
我们可以使用gsoap来实现这一目标。
我们需要定义接口描述语言(IDL),用于描述API的资源和方法。
我们可以使用gsoap提供的工具来生成服务端和客户端的代码。
通过生成的代码,我们可以轻松地实现Restful API的各种功能。
我们可以使用gsoap生成的代码来实现用户信息的查询功能。
通过定义HTTP的GET方法和对应的URL,我们可以向服务器发送查询用户信息的请求,服务器接收到请求后,调用gsoap生成的代码来执行相应的操作,并将结果以JSON格式返回给客户端。
使用gsoap规避和修改onvif标准类型结构的解析
使用gsoap规避和修改onvif标准类型结构的解析使用gsoap规避和修改onvif标准类型结构的解析在软件开发和集成过程中,我们常常会遇到需要与标准接口进行交互的情况。
然而,有时这些标准接口的数据结构并不完全符合我们的需求,需要对其进行一定的规避和修改。
特别是在使用onvif标准类型结构时,可能出现一些解析上的困难,这时候我们就可以考虑使用gsoap来规避和修改这些结构,以便更好地满足我们的实际需求。
让我们来了解一下gsoap和onvif标准类型结构的基本概念。
1. 什么是gsoap?gsoap是一种用于开发基于web服务的软件的工具。
它可以帮助我们在C/C++中快速创建和部署web服务,同时支持对复杂数据类型进行序列化和反序列化。
通过gsoap,我们可以轻松地与各种标准和定制的接口进行交互,包括onvif标准接口。
2. 什么是onvif标准类型结构?onvif是一种用于网络视频设备的开放性标准,它定义了一系列用于视频监控设备之间通信的接口和数据结构。
在onvif标准中,包含了各种类型的数据结构,用于描述设备的属性、状态和控制信息。
然而,由于不同厂商的设备可能存在一定差异,有时候我们需要对onvif标准类型结构进行一定的规避和修改,以适应实际情况。
接下来,让我们来看看如何使用gsoap来规避和修改onvif标准类型结构。
3. 使用gsoap规避onvif标准类型结构在使用gsoap与onvif标准接口进行交互时,我们可能会遇到一些数据结构无法直接满足我们的需求的情况。
onvif的某个数据结构可能包含了我们不需要的字段,或者缺少我们需要的字段。
这时,我们可以借助gsoap的序列化和反序列化功能,对这些数据结构进行规避。
通过定义一个新的数据结构,并使用gsoap的序列化和反序列化功能,我们可以实现从原始的onvif数据结构到我们需要的数据结构的转换。
在这个过程中,我们可以对字段进行筛选、重命名和重组,以便更好地满足我们的实际需求。
gSOAP在Windows Mobile平台上的使用总结
gSOAP在Windows Mobile平台上的使用总结gSOAP是很好的东西,它弥补了C++库对Webservice支持的不足,让C++的开发者能够轻松使用Webservice,不过说轻松其实也不轻松,到目前为止,我没有用过什么开源的库是一到手就能很顺利地使用的,总是经过了这个那个的折腾,最后才能用,虽然很多问题也都是只差那么一丁点儿,但就是那么一丁点儿却让人焦头烂额。
Windows Mobile没落了……我不止一次提起这话,我甚至怀疑我现在开发的Windows Mobile 程序是不是最后一个获得较多用户的Windows Mobile程序,也许弄完了这个之后,也没什么人再会涉足这个领域了。
ASMX接口定义文件OK,废话不说了,言归正传,Webservice最最最典型的应用是什么?——更新天气,你看看Webservice的入门文章,都是拿天气更新作为范例,而我做的这个正好也是一个天气更新,接口是我定义的,具体就不贴出来了,总而言之我们要从WSDL这个接口文件出发,假设你已经有了这个WSDL文件了,文件名为“SSPWeatherService.asmx”。
(不懂WSDL的话建议先了解下Webservice)获取一份gSOAP并安装接着要去获取一份gSOAP的代码,地址是,我下载的版本是2.8.3,这是2011年6月更新的,在这前我下载了2.8.2,这两个版本用起来还有些微小的差别,哪个更好?当然是新的更好了。
下载完之后当然是解压缩,我是把它解压缩到“D:\gsoap”这个路径下。
然后给系统环境变量“path”增加这么一个路径:“D:\gsoap\gsoap\bin\win32\”,这完全是为了一会儿方便调用到“wsdl2h.exe”和“soapcpp2.exe”,否则你还得输入exe的完整路径。
根据asmx生成相关文件将刚才那个WSDL文件“SSPWeatherService.asmx”放到你的工作目录下,比如“D:\work\SSPWeatherUpdate_WS”,然后使用命令行工具,如下执行:<图1>其中涉及到两个命令:>wsdl2h SSPWeatherService.asmx -o SSPWeatherService.h>soapcpp2 SSPWeatherService.h -ID:\gsoap\gsoap\import -C -x -i第一个命令是根据WSDL文件生成相应的头文件,用-o参数指定生成的头文件的名称。
gsoap中文文档
gsoap中文文档8.1.2 关于命名空间函数ns1__getQuote(上节提到的)中,使用了ns1__作为远程方法的命名空间。
使用命名空间是为了防止远程方法名冲突,比方多个服务中使用同一个远程方法名的情况。
命名空间前缀及命名空间名称同时也被用来验证SOAP信息的内容有效性。
存根例程通过命名空间表中的信息来验证服务返回信息。
命名空间表在运行时被取出用于解析命名空间绑定,反序列化数据结构,解码并验证服务返回信息。
命名空间表不应该包含在gSOAP预编译器所需输入的头文件中。
在18.2节中将会对命名空间表做详细介绍。
Delayed Stock Quote服务客户端的命名空间表如下:struct Namespace namespaces[] ={ // {"命名前缀", "空间名称"}{"SOAP-ENV", "/soap/envelope/"}, // 必须是第一行{"SOAP-ENC", "/soap/encoding/"}, // 必须是第二行{"xsi", "/2001/XMLSchema-instance"}, // 必须是第三行{"xsd", "/2001/XMLSchema"}, // 2001 XML 大纲{"ns1", "urn:xmethods-delayed-quotes"}, // 通过服务描述获取{NULL, NULL} // 结束};第一行命名空间是SOAP1.1协议默认命名空间。
事实上,命名空间表就是用来让程序员可以规定SOAP编码方式,能够用包含命名空间的命名空间前缀来满足指定SOAP服务的命名空间需求的。
举例来说,使用前面命名空间表中定义的命名空间前缀ns1,存根例程就可以对getQuote方法的请求进行编码。
gsoap使用总结
gsoap使⽤总结WebService、soap、gsoap基本概念WebService服务基本概念:就是⼀个应⽤程序,它向外界暴露出⼀个可以通过web进⾏调⽤的API,是分布式的服务组件。
本质上就是要以标准的形式实现企业内外各个不同服务系统之间的互调和集成。
soap概念:简单对象访问协议,是⼀种轻量的、简单的、基于 XML 的协议,它被设计成在WEB 上交换结构化的和固化的信息。
从这⾥的概念可以看得出来,soap是⼀个基于xml格式的web交互协议,⽽webservice是⼀种使⽤web⽅式实现的功能。
就好像是⽹络视频服务器和http的关系,就是这⾥的webservice服务器和soap的关系。
其实从历史上来说,先有的soap这种协议,然后微软⽤基于这种协议制作了webservice这种服务。
gsoap概念:是⼀种能够把C/C++语⾔的接⼝转换成基于soap协议的webservice服务的⼯具。
gSOAP简介gSOAP是⼀个开发SOAP和XML应⽤(它们组成了webservice)的⼯具,在英⽂中叫toolkit。
它是跨平台的,webservice的客户端和服务器端,都可以⽤它来辅助开发。
它主要的功能(特征)如下:C/C++数据绑定⼯具,⽀持XML-RPCfrom/to JSON from/to C/C++ serialization⽀持WSDL 1.1,2.0, SOAP 1.1, 1.2⽀持REST HTTP(S) 1.0/1.1 operations (GET,PUT,POST etc) for XML, JSON,etc⽀持MIME and MTOM 附件⽀持IPv4,IPv6, TCP 和UDP⽀持CGI,FastCGI⽀持嵌⼊到Apache,IIS中发布⾃带了⼀个Web server (multithreaded, SSL, compression)⽤于发布可适⽤于WinCE, Palm, Symbian, VxWorks, Andriod, iPhone等⼩设备...(拣主要的,其余忽略)gsoap下载地址gSOAP结构⽬前gSOAP的版本是2.8.12,作者认为,gSOAP的组织结构以及使⽤的⽅便性,在开源项⽬中是⽐较好的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gsoap中文文档8.1.2 关于命名空间函数ns1__getQuote(上节提到的)中,使用了ns1__作为远程方法的命名空间。
使用命名空间是为了防止远程方法名冲突,比方多个服务中使用同一个远程方法名的情况。
命名空间前缀及命名空间名称同时也被用来验证SOAP信息的内容有效性。
存根例程通过命名空间表中的信息来验证服务返回信息。
命名空间表在运行时被取出用于解析命名空间绑定,反序列化数据结构,解码并验证服务返回信息。
命名空间表不应该包含在gSOAP预编译器所需输入的头文件中。
在18.2节中将会对命名空间表做详细介绍。
Delayed Stock Quote服务客户端的命名空间表如下:struct Namespace namespaces[] ={ // {"命名前缀", "空间名称"}{"SOAP-ENV", "/soap/envelope/"}, // 必须是第一行{"SOAP-ENC", "/soap/encoding/"}, // 必须是第二行{"xsi", "/2001/XMLSchema-instance"}, // 必须是第三行{"xsd", "/2001/XMLSchema"}, // 2001 XML 大纲{"ns1", "urn:xmethods-delayed-quotes"}, // 通过服务描述获取{NULL, NULL} // 结束};第一行命名空间是SOAP1.1协议默认命名空间。
事实上,命名空间表就是用来让程序员可以规定SOAP编码方式,能够用包含命名空间的命名空间前缀来满足指定SOAP服务的命名空间需求的。
举例来说,使用前面命名空间表中定义的命名空间前缀ns1,存根例程就可以对getQuote方法的请求进行编码。
这个过程由gSOAP预编译器通过在getQuote.h文件中定义的包含前缀ns1的ns1__getQuote函数自动完成。
通常,如果要在远程方法名,结构名,类名,字段名等结构或类中使用命名空间前缀,就必须在命名空间表中进行定义。
命名空间表将会被存根例程封装,并按下面的形式输出:...<SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/"xmlns:SOAP-ENC="/soap/encoding/"xmlns:xsi="/2001/XMLSchema-instance"xmlns:xsd="/2001/XMLSchema"xmlns:ns1="urn:xmethods-delayed-quotes"SOAP-ENV:encodingStyle="/soap/encoding/">...这个命名空间绑定将被SOAP服务用来验证SOAP请求。
8.1.3 例子使用命名空间前缀可以解决在不同的服务中使用相同名称的远程方法的问题,看下面的例子:// Contents of file "getQuote.h":int ns1__getQuote(char *symbol, float &Result);int ns2__getQuote(char *ticker, char *"e);这个例子允许客户端程序使用不同的命名空间以便连接到不同的服务程序执行其中的远程方法。
命名空间前缀也可以用在类声明中使用,在XML大纲中区分同名但不同命名空间的SOAP 值。
例如:class e__Address // an electronic address{char *email;char *url;};class s__Address // a street address{char *street;int number;char *city;};在生成的序列化函数中,使用e__Address的一个实例来表示e命名空间前缀的一个地址元素类型。
<e:Address xsi:type="e:Address"><email xsi:type="string">me@home</email><url xsi:type="string"></url></e:Address>用s__Address的一个实例来表示s命名空间前缀的一个地址元素类型。
<s:Address xsi:type="s:Address"><street xsi:type="string">Technology Drive</street><number xsi:type="int">5</number><city xsi:type="string">Softcity</city></s:Address>客户端程序的命名空间表必须有e和s的数据类型定义:struct Namespace namespaces[] ={ ...{"e", "/schemas/electronic-address"},{"s", "/schemas/street-address"},...命名空间表必须作为客户端程序的一部分,使客户端程序在运行时可以对数据进行序列化及反序列化。
8.1.4 如何建立客户端程序代理类用于C++客户端程序的代理类信息是由gSOAP预编译器自动创建的。
为了说明代理类的生成过程,我们在getQuote.h头文件中加入一些信息,以便gSOAP预编译器可以生成代理类。
这些信息就类似于WSDL解析器自动生成的头文件中就已经包含的信息。
//"getQuote.h"的内容://gsoap ns1 service name: Quote//gsoap ns1 service location: /soap//gsoap ns1 service namespace: urn:xmethods-delayed-quotes//gsoap ns1 service style: rpc//gsoap ns1 service encoding: encoded//gsoap ns1 service method-action: getQuote ""int ns1__getQuote(char *symbol, float &Result);前三行指令用于定义代理类的名称,服务地址,命名空间。
第四行、第五行指令定义了使用SOAP RPC编码方式。
最后一行定义了可选的SOAPAction。
当需要SOAPAction时,这行信息将提供给每个远程方法。
使用soapcpp2对该头文件进行编译后,将会产生soapQuoteProxy.h文件。
它包含下面的内容:#include "soapH.h"class Quote{ public:struct soap *soap;const char *endpoint;Quote() { soap = soap_new(); endpoint = "/soap"; };~Quote() { if (soap) { soap_destroy(soap); soap_end(soap); soap_done(soap); free((void*)soap); }};int getQuote(char *symbol, float &Result) { return soap ? soap_call_ns1__getQuote(soap, endpoint, "", symbol, Result) : SOAP_EOM; };};为了能够在运行时刻对gSOAP环境变量及命名空间进行定制,上述两个变量被定义程全局变量。
生成的代理类可以同命名空间表一起包含在客户端程序中,请看下面的例子:#include "soapQuoteProxy.h" // 获得代理类#include "Quote.nsmap" // 获得命名空间绑定int main(){Quote q;float r;if (q.ns1__getQuote("IBM", r) == SOAP_OK)std::cout << r << std::endl;elsesoap_print_fault(q.soap, stderr);return 0;}Quote构造函数定义并初始化了一个gSOAP运行环境实例。
所有的HTTP及SOAP/XML 进程都被隐藏在后台自动执行。
如果你需要多个命名空间表或要联合多个客户端,你可以在执行soapcpp2时添加参数-n及-p来生成命名空间表以防止冲突。
详细信息请看9.1及18.33节。
同时,你可以使用C++代码命名空间来创建一个命名空间限制的代理类,详细信息请看18.32节。
8.1.5 XSD 类型编码许多SOAP服务需要在SOAP负载中使用XML编码。
在gSOAP预编译器中使用的默认编码为SOAP RPC编码。
然而,使用XSD类型编码可以改善互操作性。
XSD类型在头文件中用typedef定义。
举个例子,下面的定义将C/C++类型转换为XSD类型:// Contents of header file:...typedef char *xsd__string; // encode xsd__string value as the xsd:string schema typetypedef char *xsd__anyURI; // encode xsd__anyURI value as the xsd:anyURI schema type typedef float xsd__float; // encode xsd__float value as the xsd:float schema typetypedef long xsd__int; // encode xsd__int value as the xsd:int schema typetypedef bool xsd__boolean; // encode xsd__boolean value as the xsd:boolean schema type typedef unsigned long long xsd__positiveInteger; // encode xsd__positiveInteger value as the xsd:positiveInteger schema type...这些简单的声明告诉gSOAP预编译器当远程方法参数中使用上述定义的类型时,就把相关的C++类型转当作内建的XSD类型进行编码、解码。