gsoap使用心得

      程序开发中使用了几次gsoap,感觉这个工具十分强大,能够使得C/C++程序十分简单的调用web服务,而我们需要的就是填充调用服务的参数,发起服务即可!为了进一步了解gsoap,特意看了下相关知识,就算有一个概念性吧,毕竟开发知识这个东西只有到真正用到的时候才会有更深刻和具体的了解。下面是对gsoap一个简单的介绍!

      gsoap是一种编译工具,提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gsoap利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。gsoap的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱出来,可以专注与应用程序逻辑的实现工作了。

      用gsoap生成C/C++程序客户端和服务端以及相应的调用过程分别介绍如下!基于gsoap2.0版本。

客户端代码生成和调用

      代码生成:

      一、编写客户端需要调用服务的wsdl,这个可以采用XML spy;

      二、使用wsdl2h.exe,根据wsdl生成一个头文件(比如A.h),这是个临时文件,下一步骤执行完后自动删除即可!wsdl2h.exe是  

            gsoap自带的一个web解析器,用来为你的web服务生成web服务的解释。

            示例:wsdl2h.exe -s -o A.h  A.wsdl

            参数:
                     -s          don't generate STL code (no std::string and no std::vector),不指定这个需要有stlvector.h头文件
                     -o A.h    指定生成的头文件名称
                      A.wsdl  wsdl文件名称,需要和wsdl2h.exe同目录,

                                  多个wsdl 可一次写出,以空格隔开,这样生成的接口在一个头文件中

      三、使用使用soapcpp2.exe生成客户端调用代码,soapcpp2.exe是可以生成构建C++ SOAP客户端所需的C++源码的预编译器,

            该预编译器的输入参数是一个标准的C/C++头文件,这个头文件可以由WSDL解析器根据相关的WSDL文档自动生成。

            示例:soapcpp2.exe -C  A.h(生成代码后A.h就没有用了,可以直接删除)
            参数:
                    -C :只生成客户端代码

            生成的文件如下:
                   soapStub.h 
                   soapServiceSoapBindingProxy.h:封装了调用webservice的类,程序直接操作的类,里面包含了客户端程序可以调用

                                                                        服务的接口
                   soapH.h
                   soapClientLib.cpp:用不到
                   soapClient.cpp
                   soapC.cpp                  

                   ServiceSoapBinding.nsmap:namespaces声明,需要包含在一个cpp文件里面,比如放在StdAfx.cpp里面,否则连接 

                   时报错:unresolved external symbol _namespaces

            另外,程序还需要加入stdsoap2.cpp和stdsoap2.h文件,同时将上面几个cpp文件的前面,#include "StdAfx.h"加到第一行
            否则VC编译报错:fatal error C1010: unexpected end of file while looking for precompiled header directive。

            实际例子:

              wsdl2h.exe -s -o A.h Service_1.wsdl Service_2.wsdl // 对两个服务接口解析 pause // 查看生成接口,可省 soapcpp2.exe -C A.h // 生成客户端代码 pause // 查看生成接口,可省 del A.h // 删除不必要的文件 del *.xml del *BindingObject.h del soapClientLib.cpp

     客户端代码调用:

     一、在需要调用web服务的文件中包含封装了webservice类的头文件,示例:#include "soapServiceSoapBindingProxy.h" 

     二、gsoap运行环境实例初始化,gsoap运行环境实例是一个struct soap类型的变量。当客户端程序访问远程方法前或当服务端程序

          能够接收一个请求前,必须先将这个运行环境变量初始化(soap_init(struct soap *soap)、struct soap *soap_new() )。

     三、填充服务的输入参数,调用相应服务

     四、释放运行环境示例(soap_end(struct soap *soap))。

服务端代码生成和调用

     一、采用gsaop自带的解析器和编译器生成webservice的代码

           示例:wsdl2h.exe -s -o A.h Service.wsdl

                    soapcpp2 -S  A.h

     二、生成项目console或MFC App,加入所有关于webservice的.h .cpp文件,并复制stdsoap2.h stdsoap2.cpp文件到当前工程

          中。加入wsock32.lib,*.nsmap:namespaces声明,需要包含在一个cpp文件里面,比如放在StdAfx.cpp里面,否则连接报

          错,配置项目,不要使用pch文件。project settings->C/C++->precompiled headers

     三、编写独立的WS主程序(main函数)并实现A.h文件中定义的接口,可放在一个.cpp文件中。

           编写服务端比客户端要麻烦许多,需要实现接口的业务逻辑等工作。服务端对gsoap的使用过程如下(同socket过程):

                  a、初始化:soap_init()

                  b、绑定:soap_bind()

                  c、接受客户端连接:soap_accept()

                  d、执行服务: soap_serve);

                  e、清理工作:soap_destroy(); // dealloc C++ data

                                       soap_end();  // dealloc data and clean up
                                       soap_done((struct soap*)soap);  // detach soap struct 
                                       free(soap);

     服务端开发更详细的介绍请参考:http://blog.csdn.net/jinwenjun2005/archive/2009/02/18/3904096.aspx

你可能感兴趣的:(webservice,struct,SOAP,web服务,编译器,NameSpaces)