• 使用GSoap开发WebService客户端与服务端


    Gsoap 编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,
    从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。

    用gsoap开发web service的大致思路

    我们开发webservice应用,大致有两个方向:

    1.  API接口固定,不关心底层的通讯,将SOAP作为应用层协议

    此时,我们先定义接口,编写好.h文件,运行soapcpp2生成出相应的代码,对服务器端,修改XXXService文件,实现业务逻辑,对客户端,修改XXXProxy文件,实现业务逻辑。

    2.  通讯协议固定(当然需要基于XML的)或只有wsdl,将SOAP作为“传输层”协议

    此时,我们必须根据通讯协议或wsdl生成相应的C/C++类型的.h文件,如果需要我们自己编写wsdl,则需要一点其相关知识,不过我们可以用C#等生成一个简单的wsdl,照猫画虎即可。运用wsdl2h,我们可以生成.h文件,有了.h后,按上面的步骤继续。
    (注意:有时通过wsdl2 *.wsdl 命令生成的*.h头文件会默认包含stlvector.h,所以编译包里必须包含这个文件才能用soap2 *.h 命令编译生成文件)

    一、根据WSDL文件开发WebService客户端,访问Java的WebService服务端

    1. Java 定义好WebService接口,生成WSDL标准接口文件。


    2. 使用GSoap的WSDL2h.exe工具把WSDL文件生成C++的头文件。
        wsdl2h  XXX.wsdl 命令会生成 XXX.h

    3. 使用GSoap的 soapcpp2.exe工具把XXX.h头文件生成Soap封装的类。
        soapcpp2 -C -p XXX -j  XXX.h
        -C为生成客户端代码,会生成以Proxy结尾的类, 
        -S为生成服务端代码,会生成以Service结尾的类。

    WSDL标准接口文件的解析说明可参考WSDL相关资料。

    注意:根据WSDL文件生成的客户端的接口返回值也是是int类型,返回结果被GSoap封装为接口的引用参数了。


    一、根据.h头文件开发C++的WebService服务端,Java用客户端访问

    1.定义APi接口函数

    如:calc.h文件接口编写
    //calculater
    //gsoap api service name:  calc
    //gsoap api service style: rpc
    //gsoap api service encoding: encoded
    //gsoap api service location: http://localhost:10086/
    //gsoap api service namespace: http://basecode.soapapp
    //gsoap api schema namespace: http://basecode.soapapp/message

    typedef char* xsd__string;
    typedef int     xsd__int;

    //加法接口
    int api__add
    (
    xsd__int num1,
    xsd__int num2,
    xsd__string desc,
    xsd__int & result
    );

    2.直接用build.bat脚本编译成功后便会生成WS请求的WSDL接口文件。
    使用soapcpp2命令编译:
    soapcpp2 -S -p calc -j calc.h  生产服务端代码

    3.编写类继承生成的接口类就可以实现其功能,
    或者把用全局函数ns__add(int num1,int num2,string desc, int result)实现接口功能。

    4.包含文件:头文件,命名空间文件,soap组件文件
    #include "soap/calcH.h"
    #include "soap/calc.nsmap"
    #include "soap/stdsoap2.h"

    5.问题:其自定义生成接口在生成类中没有添加实现,编译报链接错误?
    生成类源文件中实现自定义的接口函数,放空,编译通过。

    6.测试:使用SoapUi工具建立工程,加载到WSDl文件,其端口号要与监听的端口一致。

    注意:服务端的接口返回值必须是int类型,如果需要返回结果其它信息需要使用引用参数,
    引用参数可以是基础类型,或者自己封装的结构体类型。


  • 相关阅读:
    Sql日期时间格式转换
    c#被指定为此窗体的 MdiParent 的窗体不是 MdiContainer?
    kmeans聚类分析
    C# VS2005打开没问题,但是运行解决方案时就整个自动关闭了
    PowerDesigner教程系列(一)概念数据模型
    PowerDesigner概念设计模型(CDM)中的3种实体关系
    spss clementine Twostep Cluster(两步聚类 二阶聚类)
    PowerDesigner教程系列(三)概念数据模型
    Kmeans聚类算法
    c# 中窗体居中代码怎么写?
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3359913.html
Copyright © 2020-2023  润新知