接口头文件的格式在向导中没有看到明确的说明性的内容,但通过看开发包中示例程序中头文件定义和通过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\n");
 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\n");
   exit(0);
 }
 if (soap.error)
 { soap_print_fault(&soap, stderr);
 exit(1);
 }
 else
 printf("result = %g\n", 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开发服务器端程序也比较方便的,开发包例程中都附有源程序,自己参考吧^_^

gsoap 学习 1-自己定义接口生成头文件的更多相关文章

  1. C++学习笔记(一):头文件和源文件

    说明: 当一个源文件(a.cpp)要调用另一个源文件(b.cpp)定义的方法时,需要在a.cpp中写上这个方法的声明(只需要该方法的名称.返回值和参数,类似Java的接口): 如果每次调用其他文件的方 ...

  2. Makefile自动生成头文件依赖

    前言 Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖 ...

  3. 《jdk10》删除javah.exe文件,在Android studio编译jni,使用jdk10生成头文件

    今天在用“死丢丢”编译so包的时候,只要一输入"javah -jni..."的命令就会一直提示 'javah'不是内部命令或外部命令,也不是可运行的程序或批处理文件 找了很久才发现 ...

  4. Makefile中自动生成头文件依赖

    为什么需要自动生成头文件依赖? 编译单个源文件时,需要获取文件中包含的头文件的信息,但是一般的Makefile不会在规则中明确写明文件依赖的头文件,所以单独修改头文件后,不会导致包含头文件的源文件重新 ...

  5. caffe的python接口学习(5):生成deploy文件

    如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.prototxt文件,这个文件实际上和test.prototxt文件差不多,只是头尾不相同而也.deploy文件没有第一层数据输入层, ...

  6. caffe的python接口学习(2):生成solver文件

    caffe在训练的时候,需要一些参数设置,我们一般将这些参数设置在一个叫solver.prototxt的文件里面,如下: base_lr: 0.001 display: 782 gamma: 0.1 ...

  7. AutoCppHeader AutoHeader 自动根据CPP 或C文件 来生成头文件。

    根据 cpp文件 生成相应的头文件 namespace 声明类定义声明 函数声明 extern 变量声明 选项--------------//[AutoHeader Public] //[AutoHe ...

  8. pycharm自动生成头文件注释

    1.在file->settings->file and code templates->python script即可自定制pycharm创建文件自动生成的头文件注释信息 2.创建p ...

  9. class类型重定义,防止头文件重复加载

    今天调用自己写的一个类,出现了class类型重定义问题,上网查了相关资料,发现是头文件重复include引起的问题. 防止头文件重复加载: 系统那些头文件,无论怎么include都没事,因为一般都用了 ...

随机推荐

  1. Ext.encode 与 Ext.decode .

    Ext.encode( Mixed o ) : String: json对象转换json字符串 Ext.decode( String json ) : Object: json字符串转换json对象 ...

  2. QtGui.QPixmap

    A QtGui.QPixmap is one of the widgets used to work with images. It is optimized for showing images o ...

  3. proxy [ˈprɒksi] 代理

    谷歌.QQ支持,360.搜狗不支持 使用proxy代理可以实现,对原先的类不进行处理,新建一个类,对此进行拦截处理,以实现低耦合 可以通过代理拦截的方法,将方法进行重写. //------------ ...

  4. 查看客户端的IP地址,机器名,MAC地址,登陆名等信息

    查看客户端的IP地址,机器名,MAC地址,登陆名等信息 SELECT s.session_id,s.login_time,s.host_name,p.loginame,s.program_name,c ...

  5. 查看sqlserver 2008中性能低下的语句

    经常使用这个语句来查看性能低下的sql语句: SELECT creation_time N'语句编译时间' ,last_execution_time N'上次执行时间' ,total_physical ...

  6. 【转发】MVC Log4net

    1.引用log4net库类 2.写配置,我一般是写在web.config <configSections> <section name="log4net" typ ...

  7. JAVA实现zip压缩需要注意的问题

    近来对院社二维码平台进行2.0升级改造.于昨日踩到一个巨坑.特此记录... 需求源于院社编辑在批量下载二维码的时候,系统后台需要对所要下载的二维码进行重命名和zip打包压缩. 系统测试的时候发现:首次 ...

  8. PL/SQL详细介绍,设置oracle相关

    1. 实现参照完整性      指若两个表之间具有主从关系(即主外键关系),当删除主表数据时,必须确保相关的从表数据已经被删除.  当修改主表的主键列数据时,必须确保相关从表数据已经被修改.为了实现级 ...

  9. PHP - MAC下PhpStorm安装调试环境xdebug

    今天下午一直在捣鼓如何用PhpStorm进行调试,查找了许多资料,零零碎碎的,所以自己弄篇文章记录一下步骤. 安装xdebug 使用brew安装xdebug,语法如下 brew install hom ...

  10. EMQ --集成搭建

    集群方式接受 Erlang/OTP 最初是爱立信为开发电信设备系统设计的编程语言平台,电信设备(路由器.接入网关.…)典型设计是通过背板连接主控板卡与多块业务板卡的分布式系统. Erlang/OTP ...