zoukankan      html  css  js  c++  java
  • gsoap 学习 1-自己定义接口生成头文件

    接口头文件的格式在向导中没有看到明确的说明性的内容,但通过看开发包中示例程序中头文件定义和通过wsdl生成的头文件的内容,可以发现,头文件中都会出现以下几行信息
     //gsoap ns service name: calc Simple calculator service
     //gsoap ns service style: rpc
     //gsoap ns service encoding: encoded
     //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl
     //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi

     //gsoap ns  service method-style: add rpc
     //gsoap ns  service method-encoding: add http://schemas.xmlsoap.org/soap/encoding/
     //gsoap ns  service method-action: add ""
    这些都是头文件中的说明性信息,编译时会用到这里的信息,这些信息有命名空间的和服务名称的名字,有些信息为默认参数信息,如service location 如果在客户端调用接口方法时,没有输入服务端地址,方法执行时将自动调用此处的地址做为服务器地址。后三行是对add方法的说明,在写头文件时可以修改一下这些说明信息如下:
     //gsoap ns service name: calc Simple calculator service
     //gsoap ns service style: rpc
     //gsoap ns service namespace: urn:calc
     //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi
    这些信息是很重要的,如果是已定义好的接口,一定要注意命名空间名字统一。

    下面开始主要工作:接口定义
            gSoap对“_”和“__”(下划线、双下划线)有特殊用法,接口定义时函数名前要加上命名空间名和双下划线
            举例:加法运算
            int add(int num1, int num2, int &num3);
            在接口头文件定义时要写成如下格式
            int ns__add(int num1, int nmu2, int &num3);
            其中
            "ns"是命名空间名称,此名称可以自定义成其它名字 但其后"urn:calc"不可随意更改,这个是要与服务端统一的
            "__"是编译时识别符号,如果没有的话xml文件是编译不出来的
           
     "_"(单下划线)定义名称中要慎用,自己定义的变量或函数名称中使用下划线的地方要在下划线后加上"USCORE";
            例 定义 ns__add_sum(int num_1, int num2, int &num_3);
            要写成如下形式
                    ns__add_USCOREsum(int num_USCORE1, int num2, int &num_USCORE3);

     "add"是接口函数名 这个是客户端与服务器统一的接口名字
            函数内参数变量类型和变量名 为客户端与服务器统一的接口
            函数中只有最后一个参数是输出参数,前面的都是输入参数
            若有多个输出信息,可定义结构体。
            若没有输入参数 可将输入参数类型定义为void *(将忽略void *类型的参数)

     函数返回类型必须为 int,可以通过返回值判断接口函数执行情况

    至此接口定义要注意的地方完毕,开始写接口定义文件。
    本例中使用自定义的头文件,编写客户端程序,但服务器仍与上篇中服务器相同,以便说明两种方式的结果,接口可以从上篇中由wsdl生成的头文件中获得。
    源码如下:
    ///////////////////mycalc.h///////////////////////////////
    //gsoap ns service name: mycalc
    //gsoap ns service style: rpc
    //gsoap ns service namespace: urn:calc
    //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi

    int ns__add(double a, double b, double &result);

    int ns__sub(double a, double b, double &result);

    int ns__mul(double a, double b, double &result);

    int ns__div(double a, double b, double &result);

    int ns__pow(double a, double b, double &result);
    ///////////////////mycalc.h///////////////////////////////
    上面文件中一定要注意 //gsoap ns service namespace: urn:calc 由于服务器中接口命名空间为calc 故此处必须是calc!
    开始编译此头文件
    运行 soapcpp2.exe mycalc.h
    编译成功,写客户端程序
    新建工程mycalcClient, 添加生成的文件,新建源文件mycalcClient.cpp
    源码如下
    //////////////////////mycalcClient.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_ns__add(&soap, server, "", a, b, result);
       break;
     case 's':
       soap_call_ns__sub(&soap, server, "", a, b, result);
       break;
     case 'm':
       soap_call_ns__mul(&soap, server, "", a, b, result);
       break;
     case 'd':
       soap_call_ns__div(&soap, server, "", a, b, result);
       break;
     case 'p':
       soap_call_ns__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;
    }
    //////////////////////mycalcClient.cpp/////////////////
    测试一下吧^_^

    对比两种生成接口头文件的方法,选择那一种还要视情况而定
    如果是已有写好的wsdl文档,当然是选择用wsdl2h工具来生成头文件了,毕竟这个方便的多,但在编译时,一定要检查警告信息,有些情况下生成的接口头件存在编译异常,例如复杂数据结构时就有可能出现结构体命名不符合gSoap命名规则(实际应用中遇至过,此时要手动修改这些命名)

    简单说一下soap结构体初始化及清理
     soap_init(&soap);//初始化
     …………
     soap_destroy(&soap);//结束清理操作
     soap_end(&soap);
     soap_done(&soap);
    向导中这方面讲的比较细^_^

    两篇都只是写了客户端的程序,因为是一直在与现成的服务器端通信,在此就没列出自己的服务器程序;
    利用gSoap开发服务器端程序也比较方便的,开发包例程中都附有源程序,自己参考吧^_^

  • 相关阅读:
    副本集-Replica Sets
    SpringBoot整合SpringData MongoDB
    Auth认证
    Form
    flask一些插件
    SQLAlchemy
    session
    上下文
    flask路由
    Flask中间件
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/3551617.html
Copyright © 2011-2022 走看看