1. 关于soap

在许多项目中团队中,我们常常会听到这样的话:我们这里是用webservice交互的。而说话的场景往往就是交互对象双方比较异构,所谓异构、即双方是不同的开发语言、不同的运行环境等。比如常见的c/c++后台程序与java的web程序间的通信,当然这里的通信是网络通信,如果是一体化单机系统内,可能第一反应是JNI方式了。

异构体系间的通信,就是webservice的基本应用场景。而soap(simple object access protocal)则是webservice在实际操作中需要遵守的协议,webservice的其它关键元素还有:WSDL, http, xml等。

2. 适用情况

如前所述、在一个项目中不同开发体系间希望交互信息,同时不愿花大气力自己做通信框架,产品需求定位为:快捷开发、稳定有效,没有明显大并发的需求,那么webservice是一个很好的选择。

之所以排除大并发的应用场景,个人觉得大并发平台网络环境复杂,在接口伸缩性和业务结合度方面,一般都是公司内部封装通信框架更合适。另外webservice通信中携带的冗余信息太多也是一大诟病,所以大并发的场景,想想也算了。

3. C++ gsoap工具

Gsoap是c/c++在webservice开发中一个强大工具,c/c++er在做webservice开发一般都是用的这个利器。

从网上很容易找到gsoap的源码,以我下载的gsoap-2.8为例。如果不用特别的研究编译工具源码,那么下载后需要用的东西是两个地方:

1. 在\gsoap-2.8\gsoap\bin\win32目录下有两个编译工具:wsdl2h.exe和soapcpp2.exe。

wsdl2h.exe:用于将wsdl文件转换为c/c++使用的头文件。

soapcpp2.exe:用于将上述头文件转换为c/c++项目使用的基础代码。包括客户端代码、服务端代码、头文件的wsdl描述。

2. 在\gsoap-2.8\gsoap目录下有两个文件:stdsoap2.cpp和stdsoap2.h。这两个文件即为c++使用webservice通信的底层soap协议实现。

4. C++应用

对于C++来说,webservice就是一种RPC(Remote Procedure Call Protocol远程过程调用协议)方式,既然是RPC,通俗的说、就是本地C++需要用到异地环境的方法,那么本地与异地双方就有一个基本的方法列表,之后达到就像在调用本地方法一样的调用异地方法。由此引出C++在webservice开发的基本过程:

      C++服务端开发:

1)列出能够提供的方法接口,写入头文件;

2) 用gsoap的soapcpp2.exe编译工具将1)中头文件编译生成服务端代码;

3) 将2)中生成的代码引入到自己的服务端项目中,进行服务端业务开发,需要注意的是服务端必须实现1)中头文件定义的方法。

      c++客户端开发:

1) 如果有服务方提供的wsdl文件,则用gsoap提供的wsdl2h.exe工具生成头文件,然后同c++服务端开发的前两步一样,生成客户端代码;

如果C/S双方都是C++开发,那么可以不需要wsdl的“介绍”,直接在上述c++服务端开发2)中,同时生成客户端代码,拿到这里用即可。

2) 将上述gsoap框架下的客户端代码引入到自己的客户端项目中,就可以调用服务端方法了。

      归纳:

C++的webservice开发,如果自己玩,可以不需要wsdl,但如果与其它体系一起协同通信,就需要wsdl(网络服务描述语言)来描述头文件的那些方法列表。Soap协议使得通信双方不需要关心具体通信实现,双发维护好提供业务的方法即可。

Gsoap是一个开源的soap封装,从stdsoap2.cpp中可以看出其跨平台的实现,比如“#ifdef WIN32”这样的痕迹。stdsoap2.h中代码风格有值得学习的地方,比如条件预处理格式等,一个头文件和一个cpp就实现了soap的协议封装,短小精悍。\gsoap-2.8\gsoap\doc中文档介绍朴素简洁,建议以html方式查看,一目了然。

5. 简单例子

本例子通过服务端提供一个字符串置反的方法,运行后在本机通过SoapUI测试客户端调用。

      C++服务端:

服务端工程,根据前面所述C++服务端开发步骤,首先给出头文件reverse.h

int ns__reversestr(char *iStr, char **oStr);

然后就只有一个main.cpp

#include "soapService.h"

//服务方法的实现

int Service::reversestr(char *iStr, char **oStr)

{

if (NULL == iStr || NULL == oStr)

{

return this->error;

}

int strLen = strlen(iStr);

*oStr = (char*)soap_malloc(this, strLen + 1);

memset(*oStr, 0, strLen + 1);

char *pOutBuf = *oStr;

while (strLen-- > 0)

{

*(pOutBuf++) = *(iStr + strLen);

}

return this->error;

}

//服务入口,这里是最基本的服务形式

int main()

{

Service serv;

serv.serve();

int port = 80;  //服务端口,启用前先用netstat查看下该端口是否被占用

if (serv.run(port))

{

serv.soap_stream_fault(std::cerr);

exit(-1);

}

return 0;

}

      SoapUI测试:

c/c++的Soap应用的更多相关文章

  1. 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别

    接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...

  2. salesforce 零基础学习(五十五)java通过SOAP方式定时访问某个文件然后插入到sObject中

    项目源码:https://github.com/zhangyueqidlmu/SOAP-Access-SFDC.git 项目背景:salesforce端相关数据需要其他系统提供,其他系统可以提供相关数 ...

  3. infopath发布的提示“无法解析SOAP消息”(The SOAP message cannot be parsed)问题解决方案

    最近发现一个列表数据过大,每次发布infopath表单提示如下错误: 后来发现一个infopath表单通过list.asmx and Formsservice.asmx来进行发布的. This err ...

  4. Rest webservice 和SOAP webservice

    SOAP: 简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP) ...

  5. webservice客户端添加soap Header信息

    根据wsdl文件的header信息,在客户端中添加相应的header 1.wsdl信息如图 <soapenv:Envelope xmlns:soapenv="http://schema ...

  6. 推荐一篇 关于REST 和 SOAP区别的文章

    写的很出色! https://www.ibm.com/developerworks/cn/webservices/0907_rest_soap/ 我的感觉就是REST针对的是资源,通过api的URL就 ...

  7. C# 通过模拟http请求来调用soap、wsdl

    C#调用webservice的方法很多,我说的这种通过http请求模拟来调用的方式是为了解决C#调用java的远程API出现各种不兼容问题. 由于远程API不在我们的控制下,我们只能修改本地的调用代码 ...

  8. 彻底理解webservice SOAP WSDL

    WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...

  9. WCF服务创建与抛出强类型SOAP Fault

    原创地址:http://www.cnblogs.com/jfzhu/p/4060666.html 转载请注明出处 前面的文章<WCF服务的异常消息>中介绍过,如果WCF Service发生 ...

随机推荐

  1. 查找(四)-------基于B树的查找和所谓的B树

    关于B树,不想写太多了,因为花在基于树的查找上的时间已经特么有点多了,就简单写写算了,如果以后有需要,或者有时间,可以再深入写写 首先说一下,为什么要有B树,以及B树是什么,很多数据结构和算法的书上来 ...

  2. bzoj1415[NOI2005]聪聪和可可-期望的线性性

    这道题之前我写过一个巨逗比的写法(传送门:http://www.cnblogs.com/liu-runda/p/6220381.html) 当时的原因是这道题可以抽象出和"绿豆蛙的归宿&qu ...

  3. 《C编译器剖析》后记

    这本书的序言.后记写的都让我很有感触!mark: 后 记 总有曲终人散时,不知不觉我们已经完成了对UCC 编译器的剖析,一路走来,最深的体会仍然是“纸上得来终觉浅,绝知此事要躬行”.按这个道理,理解U ...

  4. Android Stdio 调试Smali

    一 安装插件 1)Android stdio 安装插件 二 反编译smali 1)java -jar baksmali-2.1.2.jar app-debug.apk -o test/src2)and ...

  5. 理解Compressed Sparse Column Format (CSC)

    最近在看<Spark for Data Science>这本书,阅读到<Machine Learning>这一节的时候被稀疏矩阵的存储格式CSC给弄的晕头转向的.所以专门写一篇 ...

  6. HDU 5944 Fxx and string(暴力/枚举)

    传送门 Fxx and string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Othe ...

  7. ionic 图标以及启动页图片不能正确加载

    前段时间莫名其妙的发现发布的app不能正常的现实图标和启动页了,加载出来的图标以及图片显示的都是cordova的默认图片以及启动页图片 在网上找了很多教程各种查找都不能解决方法 表现原因为: 项目根目 ...

  8. UP Board 妄图启动ubilinux失败

    前言 原创文章,转载引用务必注明链接. 经历了上次的上电开机失败,我们终于发现需要手动为UP板安装系统,因为没有显示器的Headless模式时,使用Linux比较方便,另外熟悉Debian系的,所以选 ...

  9. 用java解析字符串,如字符串"(1+2/5)*3"当成是数值表达式,进行计算出结果来

    import java.io.*;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;public cla ...

  10. python3--删除所有空目录,第一个有实际用处的程序

    #目标:删除所有空文件夹 #逐个判断某目录下所有项目 #若该项目是目录就进入该目录,完成上一步,不是下一个项目 #判断完所有后判断当前目录是否是空目录,是就删除 #需要管理员权限,否则很多目录无权限 ...