C++客户端访问WebService

一、gSOAP简介

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

gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。

 

二、gSOAP的环境搭建与C++客户端访问WebService的操作实例

1 :gSOAP的安装:

    下载gSOAP:http://sourceforge.net/projects/gsoap2/

    解压下载包(本例为gsoap_2.7.16.zip文件)到任意目录,本例为E:\WebServiceClientTest

 

2:根据WSDL生成相应的.h和.cpp文件。

 

   2.1:获取WSDL文件,如通过浏览器打开WSDL的网址,点击另存为,将网页存在WSDL格式的文件(本例中命名为HelloWorld.wsdl)。

 

   2.2:查看gsoap-2.7\gsoap\bin\win32 下的wsdl2h.exe、soapcpp2.exe文件,其中wsdl2.h.exe用于将WSDL文件生成C++的.h头文件,soapcpp2.exe用于将头文件生成为.cpp源文件。

 

   2.3:将HelloWorld.wsdl复制到gsoap-2.7\gsoap\bin\win32目录下,接口类的原型是:

   public class HelloWorld{

public String sayHelloWorld (String name);

}

 

   2.4:将gsoap-2.7\gsoap\import\stlvector.h文件复制到gsoap-2.7\gsoap\bin\win32目录下。

       将gsoap-2.7\gsoap\stdsoap2.h 和stdsoap2.cpp(如果是c语言的话则拷贝stdsoap2.c)复制到gsoap-2.7\gsoap\bin\win32目录下。

 

   2.5:根据wsdl文件生成.h文件:打开cmd命令行,cd到gsoap-2.7\gsoap\bin\win32目录,使用如下命令生成.h文件:wsdl2h.exe  –o  HelloWorld.h  HelloWorld.wsdl

 

PS:wsdl2h命令的常用选项

  • -o 文件名,指定输出头文件
  • -n 名空间前缀 代替默认的ns
  • -c 产生纯C代码,否则是C++代码
  • -s 不要使用STL代码
  • -t 文件名,指定type map文件,默认为typemap.dat
  • -e 禁止为enum成员加上名空间前缀

2.6:根据.h头文件生成.cpp源文件,命令为:soapcpp2.exe  -C  HelloWorld.h

 

3:C++客户端调用WebService的实现

 

3.1 使用Visual Studio工具创建控制台应用程序webServiceClientTest,并创建一个文件夹gsoap。

3.2 将HelloWorld.h soapH.h  soapStub.h  stdsoap2.h soapC.cpp soapClient.cpp stdsoap2.cpp HelloWorldHttpBinding.nsmap文件复制到项目文件夹gsoap下面,并将此文件夹下的所有文件添加到项目webServiceClientTest。

实现的示例代码如下:

#include "stdafx.h"

#include

#include

#include

#include "gsoap/HelloWorldHttpBinding.nsmap"

/// Modified by 华仔103 [2013-06-10]

int _tmain(int argc, _TCHAR* argv[])

{

    /// SOAP的客户端

    struct soap clientSOAP;

    /// WebService调用对象

    class _ns1__sayHelloWorld sayHelloWoardObject;

    /// WebService返回对象

    class _ns1__sayHelloWorldResponse sayHelloWorldResponseObject;

   

    /// SOAP初始化

    soap_init(&clientSOAP);

   

    /// 调用函数的参数赋值

    std::string strName = "华仔103";

    sayHelloWoardObject.in0 = &strName;

   

    /// 发送WebService请求,并获得返回结果

    int nResult = soap_call___ns1__sayHelloWorld(&clientSOAP,NULL,NULL,&sayHelloWoardObject,&sayHelloWorldResponseObject);

   

    /// 操作成功

    if(SOAP_OK == nResult)

   {

       /// 输出返回结果

       std::string strResult = "返回结果为:";

       strResult.append(*(sayHelloWorldResponseObject.out));

       printf("%s",strResult);

    }

   

    /// 关闭SOAP

    soap_destroy(&clientSOAP);

    soap_end(&clientSOAP);

    soap_done(&clientSOAP);

   

    return 0;

}

 注意保留:#include “HelloWorldHttpBinding.nsmap”,这是一个命名空间映射文件。

3.3:执行应用程序就能输出结果了。如果希望WebService执行成功,需注意保证WebService网络是可以成功连接并访问的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值