zoukankan      html  css  js  c++  java
  • gsoap 学习 1-由wsdl文件生成h头文件

    开始前先看一下用户向导吧 http://www.cs.fsu.edu/~engelen/soap.html 中左侧点击Documentation

    英语水平确实有限,有些内容可能说的不准确,敬请参考向导中原文,以免误导gSoap使用入门(1)----由wsdl文件生成头文件

    向导 1.1节中提供了gSoap开发包的下载地址http://sourceforge.net/projects/gsoap2

    下载最新gSoap程序包
    解压后在gsoapinwin32(windowsXP下,其它操作系统就自己选择)下找到 编译器soapcpp2.exe 和wsdl解析工具 wsdl2h.exe,这两个文件也可以重新编译生成,用户向导中有介绍,此处就不多说,用现成的了。

    进入主题:开发客户端程序
        (1)客户端服务端通信必不可少的一个东西:接口定义。
              gSoap使用中,需要此接口文件(也就是以后常提到的头文件)此文件可以两种方式得到:
              1: 由现有的wsdl文件转换得到(本文使用这种方式)
              2: 自己编写

        (2)两个工具的用途
              wsdl2h.exe--------名字就能看出来,完成 wsdl文件(.wsdl)到(2)头文件(.h)的转换,即由写好的wsdl格式的接口定义文件转换为C/C++格式的头文件         

              soapcpp2.exe------根据接口头文件生成应用程序客户端和服务端的框架文件(soapClient.cpp、soapServer.cpp等).

    结合例子说明过程
    示例:引用向导中的例子--计算器
          由wsdl文件生成接口头文件
          wsdl文件URL地址:http://www.cs.fsu.edu/~engelen/calc.wsdl
          操作流程
          a) 程序->运行 输入cmd 启动命令行;
          b) 打开wsdl2h.exe所在文件路径(不打开的话下面输入时要记着输入全路径,不然找不着了);
          c) 输入:wsdl2h.exe -o cal.h http://www.cs.fsu.edu/~engelen/calc.wsdl,
             其中
                 "wsdl2h.exe",因为第二步中打了wsdl2h文件所在路径,所以此处可以直接用了,若没打开要输入所在完整路径
                 "cal.h"为生成的头文件名,此文件的保存位置在wsdl2h.exe同一文件目录下(要修改的话要请参照命令行语法规则,此处不多说了,有点脱离主题)            

           "-o"是生成选项,表示输出,也可以增加其它选项(向导中出现 "-s -o"、"-c -o"等),具体选项说明请参照向导中介绍。
                 "http://www.cs.fsu.edu/~engelen/calc.wsdl"是wsdl文件的位置,此处是在网络地址(这个地址是可以用的),如果wsdl文件在本地的也可以,路径设置好就OK了
             注意:以上四项中每项间都有空格分开 不要手误啊!
          d) 回车 运行吧,看提示信息,没有提示故障的话,查找cal.h吧(cal.h的保存路径要记好啊,自己设置的);
          e) 得到cal.h后,打开可以看到接口定义;
          f) 在命令行中 输入:soapcpp2.exe cal.h
             其中
                 "soapcpp2.exe",此处把soapcpp2.exe和wsdl2h.exe放在同一目录下了,且前面已打开此路径;
                 "cal.h"即由wsdl生成的头文件,此文件保存位置与soapcpp2.exe相同,故此处可这样输入,若不同还须设置文件路径;
                 同样两项之间也有空格!
                 可以增加控制选项如"soapcpp2.exe -C cal.h"则只生成客户端所需文件, "soapcpp2.exe -S calc.h"则只生成服务端所需文件
          g) 回车 运行。
      如果提示找不到文件 stlvector.h,因为cal.h文件中引用了文件stlvector.h;解决方法:开发包gsoapimport目下有此文件,复制一份到cal.h所在目录。
             注意:此过程中要检查生成的编译信息,确保没有警告信息出现(警告信息可能是gSoap不支持的内容,如果不去除,程序运行故障很难找到根本原因),另不能只看编译结果成功就认为是正确的,存在警告信息也显示为编译成功!!
          h) 编译成功,生成的框架文件保存位置与cal.h在同一目录下,包括:calc.nsmap、soapC.cpp、soapcalcObject.h、soapcalcProxy.h、soapClient.cpp、soapClient.lib

    、soapH.h、soapServer.cpp、soapServer.Lib、soapStub.h和接口的请求应答xml文件。
        其中
          calc.nsmap 为命名空间定义文件;
          soapClient.cpp 客户端文件
                soapServer.cpp 服务端文件
                soapcalcProxy.h 代理用到
                soapStub.h 此文件中为程序中要用到的接口的声明(将cal.h中的接口经过处理后,在程序中供调用的接口)
                xml文件 为接口的xml格式,可以据此帮助调试等。。。
                其它文件作用还没完全搞明白,向导中有说明,此处不说了以免误导^_^
          i) 编译过程完成。下面开始程序(客户端)
             VC6中新建空的win32控制台工程,新建源文件calcClient.cpp;
             复制编译生成的文件(包括cal.h和stlvector)到程序目录中;
             在工程中添加文件calc.nsmap、soapC.cpp、soapClient.cpp、soapH.h、soapStub.h(使用代理添加soapcalcProxy.h);
             编译,提示无法找到文件stdsoap2.h、stdsoap2.cpp文件,这两个文件为gSoap的源码文件,在gsoap文件夹中找到这两个文件,复制到程序目录下并添加到工程中;
             在calcClient.cpp文件中 添加语句#include "soapH.h", #include "calc.nsmap"

    ///////////////////////////calcClient.cpp源码//
    #include <stdio.h>
    #include "soapH.h"
    #include "calc.nsmap"

    const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi";

    int main(int argc, char **argv)
    {
     struct soap soap;
     double a, b, result;
     if (argc < 4)
     { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num ");
     exit(0);
     }
     soap_init(&soap);
     a = strtod(argv[2], NULL);
     b = strtod(argv[3], NULL);
     switch (*argv[1])
     { case 'a':
       soap_call_ns2__add(&soap, server, "", a, b, result);
       break;
     case 's':
       soap_call_ns2__sub(&soap, server, "", a, b, result);
       break;
     case 'm':
       soap_call_ns2__mul(&soap, server, "", a, b, result);
       break;
     case 'd':
       soap_call_ns2__div(&soap, server, "", a, b, result);
       break;
     case 'p':
       soap_call_ns2__pow(&soap, server, "", a, b, result);
       break;
     default:
       fprintf(stderr, "Unknown command ");
       exit(0);
     }
     if (soap.error)
     { soap_print_fault(&soap, stderr);
     exit(1);
     }
     else
     printf("result = %g ", result);
     soap_destroy(&soap);
     soap_end(&soap);
     soap_done(&soap);
     return 0;
    }
    //////////////////////calcClient.cpp源码//////////////////////////////////// 
    其中soap_call_ns2__add、soap_call_ns2__sub、soap_call_ns2__mul、soap_call_ns2__div、soap_call_ns2__pow为接口函数,在soapStub.h中可以找到函数声明。
    ^_^搞定一步^_^
    calcClient.cpp内容引用了gSoap开发包中例程中calc的源码,函数名略有修改动!代码中没有做接口执行故障检测,仅供参考。
    这个例子中还有很多东西没写明白,比如gSoap中接口函数的定义的原则、gSoap的初始化和结束清理等。

  • 相关阅读:
    1.Mybatis的全局配置mybatis-config.xml
    01淘淘商城项目:项目Maven工程搭建
    Connection timed out: connect; Communications link failure
    启动maven项目的配置
    PLSQL 触发器概念
    Git 概念&常用命令
    Git与svn的区别 & Git的工作流程
    Redis 是如何存储的
    Redis 概念,常用命令
    idea 快捷键
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/3551616.html
Copyright © 2011-2022 走看看