gSOAP学习笔记总结版

gSOAP学习笔记总结版
gSOAP学习笔记总结版

Struct soap add_soap;

Soap_malloc(add_soap, len); // 申请空间,soap_end函数释放

>>gsoap传输中文。我使用utf-8编码格式来支持汉字的传输。

1. 设置gsoap为utf-8传输数据

soap_set_mode( &SmsWBS_soap, SOAP_C_UTFSTRING ); //设置编码

SmsWBS_soap.mode|=SOAP_C_UTFSTRING;

2. 使用下面得函数转换我们的传输内容,即将我们的数据转成UTF-8编码:

int conv_charset( const char *dest, const char *src, char *input, size_t ilen, char *output, size_t olen )

{

int convlen = olen;

iconv_t conv = iconv_open( dest, src );

if( conv == (iconv_t) -1 )

return -1;

memset( output, 0, olen );

if( iconv( conv, &input, &ilen, &output, &olen ) ){

iconv_close(conv);

return -1;

}

iconv_close(conv);

return convlen-olen;

}

例子:conv_charset( "UTF-8", "GBK", "林学任.linxr", strlen("林学

任.linxr"), buf_out->name, 100 );

>>gsoap中返回字符串

1. 下面是一个逆转字符串的函数。

int ns__echo_USCOREreverse( char * buf_in, char ** buf_out );

int ns__echo_USCOREreverse( struct soap *add_soap, char *buf_in, char **buf_out )

{

int i, j, len;

printf( "ns__interface: in=[%s]\n", buf_in );

len = strlen(buf_in);

*buf_out = (char*)soap_malloc( add_soap, len+1 );

for( i=len-1, j=0; i>=0; i--, j++ ){

(*buf_out)[j] = buf_in[i];

}

(*buf_out)[j] = 0;

return 0;

}

其中调用soap_malloc申请空间,并且将他赋给返回参数buf_out。这个空间会在调用soap_end时被释放。

>>接口定义,可参考《GSoap接口定义》。这里我将给出C#引用这个webserver所对应的接口形式。

gsoap是根据我们定义好的.h文件,然后用工具产生了我们所需的.c文件。所以我们必须根据gsoap的要求编写.h。

1. 单个参数的传出:

int ns__add( int a, int b, int *c );

需要说明的是,这里的ns__是必须的,必须以开始注释中的ns加两个下划线开始。返回值必须是int。

但是这里的int并不是接口的返回值,而是gsoap内部的返回值。真正的返回值是int *c。

C#中对应的接口: int add( int a, int b ); 返回值就是上述的int *c参数。

2. 多个参数传出,在接口中必须使用结构体

typedef char * xsd__string;

typedef long xsd__int;

struct ns__personResponse{

xsd__int age;

xsd__string name;

xsd__string address;

};

int ns__person( xsd__string buf_in, struct ns__personResponse * buf_out );

在C#中,并不是我们所声明的这样。而是:int person( string buf_in, out string name, out string address );

即,结构体中的第一个域会变成返回值,其他的变成一个个的输出参数。

3. 返回结构体。如果要返回结构图,那么必须在结构体中再套一层结构体:

typedef char * xsd__string;

typedef long xsd__int;

struct ns__person{

xsd__int age;

xsd__string name;

xsd__string address;

};

struct ns__personResponse{

xsd__int ret;

struct ns__person person;

};

int ns__person( xsd__string buf_in, struct ns__personResponse * buf_out ); 那么在C#中,看到的接口是这样的:int person( string buf_in, person对应的结构类);

4. 接口中的下划线,如果接口中的交易名有下划线,必须这么声明:

int ns__echo_USCOREreverse( char * buf_in, char ** buf_out );

那么,C#中实际上的接口名就是:string echo_reverse( string buf_in );

gsoap2.8.11实现onvif discover详细教程

感谢 以下教程基本是(沙漠之鸽)给予我的指导的整理而来,他非常耐心的提供了帮助,也是受于他的分享精神,所以写下了这遍教程。 前言: 做onvif的过程十分痛苦,什么wsdl,soap,webserver,全部都是没有接触过的,还好有gsoap可以用,在网上和群共享里面只有2.8.3版本实现过程,而且比较麻烦的是要自己实现probe所有细节。 在2.8.11中,wsddapi插件为我们设计好了wsdd的接口,我们要做的就是填充brobe的matches信息就可以了。简化了开发过程,也不必用高手们做的typemap 文件,因为这些看不懂的文件让我们对做出的程序毫无信心。 生成.h文件。 我们需要从onvif官网下载wsdl文件,和onvif.xsd文件。然后生成.h文件 wsdl2h -sck -t /opt/nfshost/gsoap-2.8/gsoap/typemap.dat -o onvif.h analytics.wsdl analyticsdevice.wsdl devicemgmt.wsdl display.wsdl event.wsdl imaging.wsdl media.wsdl ptz.wsdl receiver.wsdl recording.wsdl remotediscovery.wsdl replay.wsdl search.wsdl deviceio.wsdl 这一步你会发现生成速度非常慢,还会提示找不到onvif.xsd,速度慢得原因是wsdl2h会根据wsdl中引用去网上下载一下xsd和wsdl文件,我们可以将这些文件下载到本地,然后修改wsdl中的路径。 修改之前schemaLocation是一个url,如果你放的和你onvif的wsdl文件相同的目录中,这样写就ok了,如果不是,可以写上相对路径。

WSDL文件结构详解

wsdl文件结构分析 WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。本文将详细讲解WSDL文档的结构,并分析每个元素的作用。 一:WSDL定义 WSDL是一个用于精确描述Web服务的文档,WSDL文档是一个遵循WSDL XML模式的XML文档。WSDL 文档将Web服务定义为服务访问点或端口的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;而端口类型,指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web访问地址与可再次使用的绑定相关联,可以定义一个端口,而端口的集合则定义为服务。 一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、 service元素。这些元素嵌套在definitions 元素中,definitions是WSDL文档的根元素。文章的下一部分将会详细介绍WSDL 的基本结构。 二:WSDL的基本结构--概述 如第一部分最后描述的那样,一个基本的WSDL文档包含7个重要的元素。下面将分别介绍这几个元素以及他们的作用。 WSDL 文档在Web服务的定义中使用下列元素: · Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。 · Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。 · Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。 · PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。

SOAP病历

SOAP病历 患者,男性,65岁,因“反复发热、咳嗽1月余”就诊。 现病史:患者于1月前无明显诱因出现发热,体温在37.5~38.5℃,咳嗽,咯少许白痰,无咯血、盗汗、头痛、畏寒,无黄染,无咽痛,无恶心、呕吐,无腰酸、腰痛,无血尿,无尿频、尿急,无关节痛。在社区卫生服务中心就诊检查发现血常规:WBC 12.6×10^9/L,N 82%。胸片提示:右下肺少许斑片状影,诊断“左下肺炎”。给予“头孢呋辛 3.0 ivdrip bid、复方甘草合剂口服”治疗。用药3天后,体温略有下降,37~37.5℃,继续予头孢呋辛静滴治疗1周后,咳嗽症状略有改善,但患者再次出现发热,37.5℃~38℃,伴有咳嗽,无咯血、咳痰,发热时伴有下肢乏力。为进一步诊治来社区服务中心就诊。发病以来,睡眠欠佳,食欲一般,精神尚可,二便正常,体重明显减轻,半年内体重减轻4kg左右。 既往史:否认结核病、伤寒、肝炎等传染病史,否认重大手术史,否认药物食物过敏史。否认高血压、糖尿病等慢性病史。否认冶游史,已婚已育,育有1子,有烟酒史30年,20支/3天,少量饮酒,以饮黄酒为主。出租车司机退休在家,夫妻与儿子分开居住,夫妻关系和睦。平素喜肉食及辛辣食物。否认家族中存在糖尿病、高血压、结肠癌等遗传家族史。 体查:T 38℃,P 91次/分,R 18次/分,BP 126/74mmHg。神清,呼吸平顺,皮肤、黏膜无明显瘀点、瘀斑。浅表淋巴结未见明显肿大。咽无充血。双肺呼吸音粗,左下肺可闻及少许干湿啰音。心率 91次/分,律齐,各瓣膜未闻及杂音。腹平软,无压痛,未见明显包块,肝脾肋下未及,移动性浊音阴性,肠鸣音3~5次/分。四肢关节未见明显肿大及畸形,可见杵状指,四肢肌力肌张力正常,生理反射存在,病理反射未引出。 实验室及辅助检查: 血常规:WBC 12.6×10^9/L,N 82%,L 12%,M 3.1%,E 1.9%,HGB 135g/L,Plt 161×10^9/L; 尿常规:WBC(-),RBC (-),蛋白(-)。 胸片:左下肺少许斑片影,未见占位性病变。

用gSOAP调用Web Services

用gSOAP调用Web Services 1、配置gSOAP 从https://www.360docs.net/doc/612622365.html,/project/showfiles.php?group_id=52781 下载gSOAP,解压后在gsoap\bin\win32里找到wsdl2h.exe 和soapcpp2.exe程序。通过这两个程序可以生成客户端需要的C/C++文件。这两个程序的使用方法: wsdl2h.exe: 编译wsdl文件生成c/c++头文件 -o 文件名,指定输出头文件 -n 名空间前缀代替默认的ns -c 产生纯C代码,否则是C++代码 -s 不要使用STL代码 -t 文件名,指定type map文件,默认为typemap.dat -e 禁止为enum成员加上名空间前缀

soapcpp2.exe: gSOAP编译器,编译头文件生成服务器和客户端都需要的c/c++文件 (如果使用STL,需要从压缩包里找到stlvector.h放到soapcpp2.exe目录下,否则运行失败) -C 仅生成客户端代码 -S 仅生成服务器端代码 -L 不要产生soapClientLib.c和soapServerLib.c文件 -c 产生纯C代码,否则是C++代码(与头文件有关) -I 指定import路径(见上文) -x 不要产生XML示例文件 -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp) 我写了个批处理:

wsdl2h -o xxxService.h "WSDL文件URL" soapcpp2 -C xxxService.h 如果是asmx,可以在URL后加"?WSDL" 来获取WSDL文件,它是一个XML,用来描述接口,它是与语言无关的,类似COM的IDL文件。 2、创建VC工程,把生成的文件拷到工程目录 生成的文件有: soapStub.h 从输入Header 文件生成的经过修改且带标注的Header 文件 soapH.h 主Header 文件,所有客户机和服务源代码都要将其包括在内 soapC.c 指定数据结构的序列化器和反序列化器 soapClient.c 远程操作的客户机存根例程 stdsoap2.h stdsoap2.cpp 运行时库的Header 文件

gsoap

实现高性能gsoap 服务 从队列中获取未处理的 socket,并从队列中移除 服务流程图 代码请参看gSOAP 2.8.14 User Guide 中的7.2.4 How to Create a Multi-Threaded Stand-Alone Service. listen : 监听soap_accept 方法,返回一个SOAP_SOCKET,然后交 SOAP_SOCKET 添加到队列,并发送一个信号通知process(处理线程)处理. process(处理线程)启动后立即阻塞(不是sleep )等待信号,收到信号后才执行相应的任务(soap_serve),执行任务后继续阻塞等待信号.注意:soap_serve 方法如果客户端提交的xml 文档格式不正确或其它数据(恶意攻击)时会一直阻塞到下一个请求,导到服务器性能严重下降,客户端无法收到数据一直等待的情况,因此在初始化处理线程的soap 成功后,应该立即设置处理线程soap 的超时时间,单位为秒: soap_thr[i] = soap_copy(&soap);//在这一行示例代码后一加下面三行代码 soap_thr[i] ->send_timeout = 1; soap_thr[i] ->recv_timeout = 1;

soap_set_mode(soap_thr[i], SOAP_C_UTFSTRING); /*设置采用UTF-8字符编码*/ 例如下列的一个请求就会导致soap_serve阻塞(ns2:login节点没有闭合) 因为mod_gsoap附加到web服务器的方式问题比较多,iis比较复杂, apache只支持C开发模式,所以gsoap做为一个单独的服务运行,通过代理调用服务.iis可用其它插件或自己编写一个代理类,apache直接修改httpd.conf配置代理. gsoap内存管理 尽量采用soap_malloc(用法和malloc一样)方法分析内存, soap_malloc无需释放内存,在gsoap内部采用链表的方式管理分配的内存,在执行 soap_destroy(tsoap); soap_end(tsoap)后会自动回收内存. 自动回收内存的前提是保证你自己编写的方法能正确运行完成,否则还是会导致内存泄露. gsoap输出 为提升服务性能,减少数据传输量,所有输出都采用字符方式的xml(UTF-8), 不要采用结构或对象输出(输入可以),采用结构或对象输出优点是在客户端无需解析,自动生成相关对象和结构,但是会导致服务性能下降和传输的数量增大.例如: int ns2__login(xsd__string username,xsd__string password,xsd__string &rsp); rsp为字符串格式的xml,在客户端需要解析后方可使用.服务器应答只有三种输出格式,所有节点名称都大写,所有属性名称都小写,节点之间无换行,客户端按下面的三种规则编写解析器即可. 第一种为服务器异常消息

Webservice 发布--WSDL,SOAP

本周主要学习了Web service,Web service就是一个个应用程序,它向外界暴露了一个能够通过Web进行调用的API。 首先应该先了解下Webservice用到的技术:WSDL,SOAP。 WSDL(Web Services Description Language)网络服务描述语言。使用XML编写。两台机器进行通信,服务端写了一个java程序而客户端通过远程访问要调用这个java程序,客户端需要了解这个程序的作用以及所调用的方法参数等。这里我们就需要用WSDL 对此java程序进行描述,客户端获取到此描述文件后对文件进行解析,了解此文件的信息,以及调用方式。 SOAP就是一种访问协议,用于规定应用程序之间通信的格式,独立于平台和语言。根据需要生成SOAP请求信息,发到服务端。服务端接收后分析其中的方法和参数调用指定的方法完成此请求,并把返回值放入SOAP回应消息返回给客户。 例:先创建一个名为Web的Web工程在建一个名为com.cxf.web的包,在包下创建两个java文件实现两个数相加的功能: 1. add.java package com.cxf.web; import javax.jws.WebService; @WebService public interface add { public int jia(int a,int b); } 2. addImp.java、 package com.cxf.web; import javax.jws.WebService; @WebService(endpointInterface="com.cxf.web.add") public class addImp implements add{ public int jia(int c,int d){ return (c+d); } } 相关的配置

linux下gsoap使用及移植

Linux下gsoap的使用及移植 1、下载gsoap 在gsoap的官网中可以找到最新的gsoap安装包及相关文档 gsoap官网:https://www.360docs.net/doc/612622365.html,/~engelen/soap.html 下载地址:https://www.360docs.net/doc/612622365.html,/projects/gsoap2/files/ 2、安装gsoap a、解压zip压缩包 命令:unzip gsoap_2.8.1.zip b、进入解压后生成的文件夹gsoap-2.8 命令:cd gsoap-2.8/ c、切换到root用户 命令:su 输入密码 d、配置编译环境 在gsoap-2.8/文件夹下执行configure文件,自动配置编译环境 命令:./configure e、编译连接 命令:make f、安装gsoap 命令:make install 安装完毕可用wsdl2h或soapcpp2查看gsoap是否已经安装成功 看到上述两个命令的返回说明安装成功 3、应用实例 wsdl2h -o outfile.h infile.wsdl 实现wsdl文件到h文件的数据映射 soapcpp2 -c outfile.h生成相应的底层通信stub,strech程序 首先新建一个文件夹名为gsoap;然后 (1)不使用wsdl2h a、不使用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:https://www.360docs.net/doc/612622365.html,/~engelen/addserver.cgi //gsoap ns2 service namespace: urn:add //gsoap ns2 service transport: https://www.360docs.net/doc/612622365.html,/soap/http //gsoap ns2 service method-style: add rpc //gsoap ns2 service method-encoding: add https://www.360docs.net/doc/612622365.html,/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

C++调用Webservice方法

### 先看上面的地址链接,方法和用法基本正确; ### 编译器VS2008,MFC例子进行调用,生成的文件:MLGB.h, soapC.cpp, soapH.h, sopaStub.h, soapWebServiceSoap11BindingProxy.cpp, soapWebServiceSoap11BindingProxy.h, WebserviceSoap11Binding.nsmap ### wsdl2h -s -o MLGB.h -t mytpemap.dat XXXXXXXXXXXXX (typemap.dat在\gsoap-2.8\gsoap\bin\win32目录下没有,把gsoap目录下的typemap.dat的文件复制到相应文件,并在最后添加上xsd__string = | std::wstring | wchar_t*即可) ### soapcpp2 -i -C MLGB.h (找不到文件错误,尝试……import……什么的,添加路径的方法是在命令的最后添加,例如:spoap -i -C MLGB.h -I C:\gsoap-2.8\gsoap\import,这样这一步就可以生成相应的代码) ### \gsoap-2.8\gsoap\bin\win32目录下没有生成soapClient.cpp, 另外要在\gsoap-2.8\gsoap\目录下把stdsoap2.h, stdsoap.cpp也拷贝到相应的程序目录,同时添加按上述链接文档中添加头文件 ### 方法的调用,参数传递的形式是XML格式: 1.soap连接貌似是tcp短连接,方法调用完,对象貌似就得重新new一下(我用的时候遇到的是这种情况,之前写个小例子,用的全局变量,但是没有重新new也没问题,这个没有确认) 2.在soapWebServiceSoap11BindingProxy.h中对应的类WebServiceSoap11BindingProxy 3.webservice的url地址_strUrl=XXXXXXXXXXXXXXX 例如:setStopTiralInfo的方法,其实两个都一样,调用第二个,前两个参数传递NULL /// Web service operation 'setStopTrialInfo' (returns error code or SOAP_OK) virtual int setStopTrialInfo(_ns1__setStopTrialInfo *ns1__setStopTrialInfo, _ns1__setStopTrialInfoResponse &ns1__setStopTrialInfoResponse) { return this->setStopTrialInfo(NULL, NULL, ns1__setStopTrialInfo, ns1__setStopTrialInfoResponse); } virtual int setStopTrialInfo(const char*endpoint, const char*soap_action, _ns1__setStopTrialInfo*ns1__setStopTrialInfo, _ns1__setStopTrialInfoResponse &ns1__setStopTrialInfoResponse); 创建对象:WebServiceSoap11BindingProxy _webClient(_strUrl); 对应参数:_ns1__setStopTrialInfo _input; _ns1__setStopTrialInfoResponse _return; 对_input初始化:_input.soap = &_webClient; _input.soap_default(_input.soap);

CentOS6.5下编绎gSoap相关问题及解决

CentOS6.5 下编绎gSoap 相关问题及解决 ,开发环境准备: 1,centos 为虚拟下安装,版本为32 位,(64 位同样可以,均测过, 需注意的是红色部分内容) 2,gSoap:gsoap_2.7tar.gzhttps://www.360docs.net/doc/612622365.html,/~engelen/s oap.html 载下来解压缩,按正常安装过程进行编译、安装。# tar zxvf gsozp_2.7.12.tar.gz # cd gsoap_2.7.12 #./configure 或 {./configure -p refix=/usr/local/gSOA P (指定安装路径) }# make # make install 问题: ../../ylwrap: line 111: yacc: command not found 原因:没有安装:yacc(Yet Another Compiler Compiler) 是Unix/Linux 上一个用来生成编译器的编译器 (编译器代码生 成器)。解决方案:sudo apt-get install flex bison(ubantu)yum install byacc(centos) 问题:gsoap- 2.7/missing: line 46: flex: command not found 决方法: yum install flex( 要重新运行./configure)(centos )apt-get install flex(ubantu) 问题:/usr/bin/ld: cannot find -ly 解决方法:yum install bison-devel(centos)apt-get install bison(ubantu) 问 题:../../gsoap/stdsoap2.h:690:19: error: zlib.h: No such file or directory 解决方法:缺少zlib,ubantu 下,

WebService 之 WSDL文件 讲解

WebService 之 WSDL文件讲解 恩,我想说的是,是不是经常有人在开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户给你一个WSDL文件,说按照上面的进行适配,嘿嘿,这个时候,要是你以前没有开发过,肯定会傻眼,那如果你想学习的话,就认真的看下面的讲解咯: 一、WSDL概述 WebServices Description Language (WSDL Web服务语言)是一个用于精确描述Web Service 的文档格式。 WSDL非常适合于用作代码生成器,它能够读取WSDL文档,并且可以为访问Web服务生成一个程序化的接口,大多数软件供应商和主要的标准机构(包括 W3C、WS-I和OASIS)都支持WSDL。例如:JAX-RPC provider(例如:BEA Weblogic)通过API用WSDL生成相应的占位程序;IBM WebSphere、https://www.360docs.net/doc/612622365.html,以及Apache Axis都有自己的工具生成相关的代码。下图是一个例子: 上面的例子JAX-RPC通过读取WSDL文档,创建JAX-RPC RMI接口(endpoint接口)和实现此接口的网络占位程序(stub)。客户端程序通过RMI接口,Stub和Web Service服务端交换SAOP消息。 二、WSDL基本结构 WSDL文档是一个遵循WSDL XML模式的XML文档(文档实例);类似于:SOAP文档是一个遵循SOAP XML模式的XML文档(文档实例); 一个WSDL文档的根元素是definitions元素,WSDL文档包含7个重要的元素:types, import, message, portType, operations, binding和service元素。 三、WSDL声明 3.1 XML声明

使用gSOAP开发实例--Usernametoken Authentication实现

使用gSOAP开发实例——自定义header实现用户名令牌认证(Usernametoken Authentication) 上一节介绍了怎样实现基本认证(Basic Authentication,以下简称basic方式),望文生义,也就是最简单的用户验证方式,本节稍微深入一些,介绍用户名令牌认证(Usernametoken Authentication,以下简称usernametoken方式)。 Usernametoken方式与basic方式不同的地方,在于后者会把用户名和密码以摘要(digest)的形式,置于HTTP信息头,而前者则把用户名以明文的形式、密码以明文或者摘要的形式,嵌入到一段XML文本中,再置于SOAP消息头当中。 如果使用soapUI调试客户端程序的话,会发现以下是basic方式发出的完整的SOAP消息: POST https://https://www.360docs.net/doc/612622365.html,/Services/ECHO HTTP/0.9 Content-Type: text/xml;charset=UTF-8 SOAPAction: "" User-Agent: Jakarta Commons-HttpClient/3.1 Content-Length: 292 Authorization: Basic VkYtSEstbVNNST0OdlR42EMZaD1BMyE= Host: https://www.360docs.net/doc/612622365.html, Cookie: $Version=0; MSP2LB=test2.test2f02; $Path=/ hello

SOAP理念

商品内容: SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP 封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。 虽然这四个部分都作为SOAP的一部分,作为一个整体定义的,但他们在功能上是相交的、彼此独立的。特别的,信封和编码规则是被定义在不同的XML命名空间(n amespace)中,这样使得定义更加简单。 SOAP的两个主要设计目标是简单性和可扩展性。这就意味着有一些传统消息系统或分布式对象系统中的某些性质将不是SOAP规范的一部分。比如:分布式垃圾收集(Distributed garbage collection)、成批传送消息(Boxcarring or batching of messages)、对象引用(Objects-by-reference(which requires distributed g arbage collection))、对象激活(Activation(which requires objects-by-refe rence))。 SOAP消息举例: 1.第一个例子阐明了SOAP中一个简单的通信信息,包括了两个不是SOAP定义而是应用程序定义的元素:头块元素alertcontrol 和体块元素alert。头块元素包括两个参数:priority 和expires。体块元素包括的是实际传送的信息。 图2:SOAP 中一个简单的通信信息 (EXAMPLE 1) 2.SOAP通信与底层的不同协议和不同的交换格式有关,下面的例子SOAP使用HTT P作为底层通信协议,从而可以很好的使用request/response机制来传送信息。SO AP/HTTP请求包括一个GetLastTradePrice的块元素,该请求携带一个字符串参数和ticker符号,在SOAP应答中返回一个浮点数。XML名域用来区分SOAP标志符和应用程序特定的标志符。

gSOAP学习笔记总结版

Struct soap add_soap; Soap_malloc(add_soap, len); // 申请空间,soap_end函数释放 >>gsoap传输中文。我使用utf-8编码格式来支持汉字的传输。 1. 设置gsoap为utf-8传输数据 soap_set_mode( &SmsWBS_soap, SOAP_C_UTFSTRING ); //设置编码 SmsWBS_soap.mode|=SOAP_C_UTFSTRING; 2. 使用下面得函数转换我们的传输内容,即将我们的数据转成UTF-8编码: int conv_charset( const char *dest, const char *src, char *input, size_t ilen, char *output, size_t olen ) { int convlen = olen; iconv_t conv = iconv_open( dest, src ); if( conv == (iconv_t) -1 ) return -1; memset( output, 0, olen ); if( iconv( conv, &input, &ilen, &output, &olen ) ){ iconv_close(conv); return -1; } iconv_close(conv); return convlen-olen; } 例子:conv_charset( "UTF-8", "GBK", "林学任.linxr", strlen("林学 任.linxr"), buf_out->name, 100 ); >>gsoap中返回字符串 1. 下面是一个逆转字符串的函数。 int ns__echo_USCOREreverse( char * buf_in, char ** buf_out ); int ns__echo_USCOREreverse( struct soap *add_soap, char *buf_in, char **buf_out ) { int i, j, len; printf( "ns__interface: in=[%s]\n", buf_in ); len = strlen(buf_in); *buf_out = (char*)soap_malloc( add_soap, len+1 );

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++头文件。

gsoap的wsdl文件

wsdl是通过gsoap自动生成的。也就是说再没有wsdl文件的时候可以先定义xxxx.h文件,xxxx.h 的定义里面要包括 //gsoap ns service nam e: severName 等项。然后通过soapcpp2.exe xxxx.h来生成wsdl文件等。 如果有可以利用的wsdl文件则可以先生成.h文件再生成soap依赖文件,如:soapStub.h等。 ;;;;;;;;;;;;;;;;;;;;; 准备: 到https://www.360docs.net/doc/612622365.html,/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: https://www.360docs.net/doc/612622365.html,/calc.wsdl //gsoap ns service location: https://www.360docs.net/doc/612622365.html,/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个文件。

CentOS6.5下编绎gSoap相关问题及解决

CentOS6.5下编绎gSoap相关问题及解决 一,开发环境准备: 1,centos为虚拟下安装,版本为32位,(64位同样可以,均测过,需注意的是红色部分内容) 2,gSoap:gsoap_2.7tar.gzhttps://www.360docs.net/doc/612622365.html,/~engelen/s oap.html 下载下来解压缩,按正常安装过程进行编译、安装。# tar zxvf gsozp_2.7.12.tar.gz # cd gsoap_2.7.12 #./configure或 {./configure –-prefix=/usr/local/gSOAP(指定安装路径)}# make # make install 问题: ../../ylwrap: line 111: yacc: command not found 原因:没有安装:yacc(Yet Another Compiler Compiler),是Unix/Linux上一个用来生成编译器的编译器(编译器代码生成器)。解决方案:sudo apt-get install flex bison(ubantu)yum install byacc(centos)问 题:gsoap-2.7/missing: line 46: flex: command not found解决方法: yum install flex(要重新运行./configure)(centos 下)apt-get install flex(ubantu)问题:/usr/bin/ld: cannot find -ly解决方法:yum install bison-devel(centos)apt-get install bison(ubantu)问题:../../gsoap/stdsoap2.h:690:19: error: zlib.h: No such file or directory解决方法:缺少zlib,ubantu下,

webservice 简介

Webservice简介 什么是webservice Webservice简单来说就是为应用程序提供一个网络接口,其他应用程序(可以是桌面应用程序或网络应用程序),通过这个接口来调用服务商提供的程序(一般是由客户端发送数据,服务器端接收数据并作出相应处理以后返回给客户),来达到数据交互和分布式处理的效果,并且它通过wsdl、soap等标准实现交互,是一种与语言和平台无关的交互技术。 相关要数 WSDL:Web服务描述语言. 是一个用来描述Web服务和说明如何与Web服务通信的XML语言。为用户提供详细的接口说明书。 怎样向别人介绍你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的Web service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的Web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码。 Wsdl是提供了一种对函数、参数和返回值描述标准的xml语言。通过统一的规则,不论你的程序是用什么语言开发的,只要函数名和功能一样,都能得到相同的wsdl定义。正是wsdl这样一个标准的存在,实现了webservice的跨平台和跨语言,因为不论你用的是什么语言,xml总是一样的。同时wsdl简化了开发流程。我们只需要从服务提供商那里获得相应接口的wsdl文件,那么我们就可以根据该文件,通过相关的软件自动生成客户端不同语言的代码,我们所做的就是调用生成的函数接口而已,大大简化了编码流程。 Soap(xml+http)简单对象访问协议,表示信息交换的协议. Webservice的通信协议,基于xml和http传输 XML:描述数据的标准方法. Webservice通过xml语言进行数据交互,客户端返回给用户的是一个xml文档,客户端会根据生成代码自己处理该xml文档, 根据wsdl文件自动生成服务器端和客户端 现在的软件大多书提供了对wsdl文件的处理。即根据wsdl可以生成特定语言的服务器端和客户端代码。我们只需要做简答的代码调用就可以使用该程序了,简化了程序的开发。Axis的java2wsdl 把java转换成wsdl Wsdl2java 把wsdl转换成java Gsoap的wsdl2 可以把wsdl转换成c、c++语言 常用的webservice开发软件 Axis 帕奇可扩展交互系统

ONVIF开发总结

ONVIF开发经验总结 ONVIF开发经验总结 (1) 一、利用gsoap2.8.14生成Onvif相关源代码 (2) 1.生成onvif.h头文件的方法 (2) 1)wsdl2h相关命令参数 (2) 2)链接网络生成 (2) 3)下载到本地生成 (2) 4)备注说明 (2) 2.生成onvif源代码 (2) 1)整理相关的文件 (2) 2)通过以下命令生成相关源文件 (2) 3)Soapcpp2相关命令参数 (2) 4)备注说明 (3) 3.利用gsoap2.8.8生成源代码和gsoap2.8.14生成的差异 (3) 1)typemap.dat文件中需要添加相关信息 (3) 2)wsa5.h中无SOAP_ENV__Fault函数 (4) 二、新建工程,调试代码 (4) 三、设备发现main函数说明 (4) 四、遇到的问题和注意事项 (7) 五、经验总结 (14)

一、利用gsoap2.8.14生成Onvif相关源代码 1.生成onvif.h头文件的方法 产生头文件有两种方法:链接网络生成和本地生成。 1)wsdl2h相关命令参数 -c 产生c语言的代码,否则产生C++ -s 不使用STL代码 -t 指定typemap.dat文件 -o 指定生成的头文件名 2)链接网络生成 ●将wsdl2.exe和typemap.dat文件放入同一个文件夹 ●利用cmd或批处理执行以下dos命令: wsdl2h.exe -c -s -t typemap.dat -o onvif.h 3)下载到本地生成 ●从ONVIF官网上把相关的WSDL文档下载到本地,下载地址(详细参见备注说明),此外还需下载样式表,下载地址见WSDL文档中的schemaLocation。 ●将wsdl2.exe、typemap.dath、WSDL文档和样式表放入同一文件夹中。 ●将相关WSDL文档中的样式表引入路径(schemaLocation)修改为本地实际地址,如:event.wsdl中schemaLocation="修改为schemaLocation = ws-addr.xsd ●利用cmd或批处理执行以下命令 wsdl2h.exe -c -s -t typemap.dat -o onvif.h remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl media.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl 4)备注说明 ●wsdl2.exe位于gsoap_2.8.14\gsoap-2.8\gsoap\bin ●typemap.dat位于gsoap_2.8.14\gsoap-2.8\gsoap ●wsdl下载地址: ●各url之间用空格隔开 ●typemap.dat不需要修改 ●链接网络生成方法的优点是不用考虑以上文件对其它文件的依赖关系,不用修改引入路径。该方法的缺点跟网速有关,因此中途可能会中断,如果超过5分钟未生成,可重新执行命令, 通过代理上网则无法生成,不推荐用此方法。 ●下载本地生成方法的优缺点和链接网络方法生成相反,代理网推荐使用此方法。 2.生成onvif源代码 1)整理相关的文件 把刚生成的onvif.h与soapcpp2.exe、import和custom放入同一文件夹,其中: soapcpp2.exe位于gsoap_2.8.14\gsoap-2.8\gsoap\bin import位于gsoap_2.8.14\gsoap-2.8\gsoap custom位于gsoap_2.8.14\gsoap-2.8\gsoap 2)通过以下命令生成相关源文件 soapcpp2.exe -2 –c onvif.h -I import 3)Soapcpp2相关命令参数 -2 采用SOAP1.2,

相关主题
相关文档
最新文档