gsoap应用培训
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
服务端代码的编写
//接收服务请求 int s = swenku.baidu.comap_accept(&soap); //创建子进程 if(fork()!=0) { /* parent */ close(s); continue; } //创建子进程使用的soap struct soap CLDsoap; //拷贝父进程的soap环境 memcpy(&CLDsoap,&soap,sizeof(soap)); //实现服务调用,该函数有gsoap生成子这里直接使用即可我们 自己实现的业务处理通过该函数调用 soap_serve(& CLDsoap); //实现自身的业务逻辑 … … …
客户端代码的编写
我们已前面已经定义的查询接口为例进行客户端代码的编写:
int query(struct soap *q_soap,char *PWD,char *PHONE,long count) { //定义变量 char server[]=http://172.16.9.12:9997;//服务的url,在调用时使用 //在soapStub.h文件中可以找到以下相关结构体的定义 struct ns2__MusicCardQueryReq _in0;//输入变量 struct ns2__queryMusicCardResponse _param_1;//输出变量 struct ns2__MusicCardQueryResp _queryMusicCardReturn ;//输出变量 struct ArrayOf_USCOREtns1_USCOREContentVO contentList ;//输出变 量 struct ns2__ContentVO *__ptr; ;//输出变量中包含的结构体 int __size;
客户端代码的编写
//当调用过程正常执行后我们就可以通过输出变量获得相应的信息
cout<<"returncode"<<_param_1._queryMusicCardReturn>returnCode<<endl; //释放soap资源 soap_destroy(q_soap); soap_end(q_soap); }
客户端代码的编写
//对输入变量进行赋值 _in0.cardPassWord=“asdf”; _in0.mobileNO=“1368XXXXXXX”;
//对输出变量进行初始化 contentList.__ptr=&__ptr; contentList.__size=0; _param_1._queryMusicCardReturn=&_queryMusicCardReturn; _queryMusicCardReturn.cardType=""; _queryMusicCardReturn.contentList=&contentList; _queryMusicCardReturn.description=""; _queryMusicCardReturn.returnCode="";
注意事项
1:一个进程中最好只使用一个soap结构体,否则会造成打开资源没有关闭的 情况,致使进程打开的文件描述符过多
2:多进程服务端使用时,要把父进程的soap结构体拷贝一份传给子进程使用, 以免业务量大的时候产生冲突 3:多线程使用时可创建多个soap结构体在进程内公用,使用时要注意加锁
•soapStub.h 该头文件中定义了需要我们自己来实现的服务端函数 int ns2__queryMusicCard(struct soap*, struct ns2__MusicCardQueryReq *_in0, struct ns2__queryMusicCardResponse *_param_1); 以及客户端调用时使用的函数 int soap_call_ns2__queryMusicCard(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct ns2__MusicCardQueryReq *_in0, struct ns2__queryMusicCardResponse *_param_1);
服务端代码的编写
//释放soap占用资源 soap_destroy(&CLDsoap); soap_end(&CLDsoap); soap_done(&CLDsoap); //关闭网络套接口 close(s); close(m); }
实现服务逻辑
•前面已经看到需要我们自己来实现的服务端函数 int ns2__queryMusicCard(struct soap*, struct ns2__MusicCardQueryReq *_in0, struct ns2__queryMusicCardResponse *_param_1) { //在这里实现我们的服务逻辑并对struct ns2__queryMusicCardResponse //*_param_1赋值,在soapStub.h中我们可以查到该结构体的定义, //struct ns2__queryMusicCardResponse //{ // struct ns2__MusicCardQueryResp *_queryMusicCardReturn; // /* SOAP 1.2 RPC return element (when namespace qualified) //} //我们需要定义一个全局的struct ns2__MusicCardQueryResp变量对_param_1 //进行赋值才能产生有效的返回值 } 点击查看示例代码
使用gsoap还可以根据自己定义的头文件生成wsdl文档,关于这 方面的使用会在以后进行补充
服务端代码的编写
•使用已生成的代码编写简单多进程服务端程序
//代码中要包含生成的头文件以及命名空间文件 #include "soapH.h" #include "soapStub.h" #include "SMSManage2SoapBinding.nsmap" int main(int argc, char **argv){ //创建并初始化soap环境 struct soap soap; soap_init(&soap); soap_set_mode(&soap, SOAP_C_UTFSTRING) );//设置字符 集为UTF-8 //绑定服务端口 int m= soap_bind(&soap, NULL, 8080, 100);
客户端代码的编写
//客户端调用 int n=soap_call_ns2__queryMusicCard(q_soap, server, "", &_in0,
&_param_1); if(q_soap->error) { //调用过程中产生内部错误 soap_print_fault(q_soap, stderr); // gsoap自身会设置error变量 return -1; //通过打印信息可以看到是 //什么错误 } if(n!=0) { //函数调用异常返回非0 fprintf(stderr,"error code %s\n",n); return -1; }
gsoap应用培训
贾东博
北京神州数码思特奇信息技术股份有限公司
2009年03月23日
www.si-tech.com.cn
目
录
• 根据WSDL文档生成对应代码
• 服务端代码的编写 • 客户端代码的编写 • 注意事项
根据WSDL文档生成对应代码
•Web Services Description Language的缩写,是一个用来描述 Web服务和说明如何与Web服务通信的XML语言 •第一步: 使用gsoap工具包中提供的wsdl2h命令,在命令行键入 Wsdl2h –c –o queryMusicCard.h queryMusicCard.wsdl -c选项生成纯C代码,不加则生成C++代码 queryMusicCard.h是我们要生成的头文件, queryMusicCard.wsdl为已提供的wsdl文件 • 第二步: 使用soapcpp2 queryMusicCard.h生成相应的可用于编 译的代码 soapStub.h queryMusicCardSoapBinding.nsmap soapH.h soapC.c soapClient.c soapClientLib.c soapServer.c soapServerLib.c