• C++客户端访问WebService VS2008


    VS2008及之后的版本已经不支持使用C++开发WEBService服务了,如果要在VS上开发WEBService,需要使用C#开发语言。

     

    一、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:https://sourceforge.net/projects/gsoap2/

    https://sourceforge.net/projects/gsoap2/files/gsoap-2.8/gsoap_2.8.46.zip/download

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

     

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

       2.1 获取WSDL文件

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

       2.2  gsoap-2.7gsoapinwin32 下的wsdl2h.exe、soapcpp2.exe文件

      其中wsdl2.h.exe用于将WSDL文件生成C++的.h头文件,

      soapcpp2.exe用于将头文件生成为.cpp源文件。

       PS:wsdl2h命令的常用选项

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

       2.3:将HelloWorld.wsdl 复制到gsoap-2.7gsoapinwin32目录下

       public class HelloWorld{

    public String sayHelloWorld (String name);

    }

     

       2.4  复制命令行所需的文件

      将gsoap-2.7gsoapimportstlvector.h 和 stl.h、 stldeque.h、stllist.h、stlset.h、soap12.h文件复制到 gsoap-2.7gsoapinwin32 目录下。

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

       2.5 生成头文件

      根据wsdl文件生成.h文件:打开cmd命令行,cd到gsoap-2.7gsoapinwin32目录,使用如下命令生成.h文件:

    wsdl2h.exe  –o  HelloWorld.h  HelloWorld.wsdl

      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。

    同时在soapClient.cpp、soapC.cpp、stdsoap2.cpp 三个文件的头一行增加  #include "stdafx.h"

    实现的示例代码如下:

     1 // WebServiceClientTest.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include "gsoap/service1soap.nsmap"
     6 #include "stdio.h"
     7 
     8 int _tmain(int argc, _TCHAR* argv[])
     9 {
    10     //soap客户端
    11     struct soap clientSoap;
    12 
    13     //WEBService调用对象
    14     class _ns1__HelloWorld ws_HelloWorldObject;
    15     class _ns1__Sum ws_sumObject;
    16     
    17 
    18     //WEBService返回对象
    19     class _ns1__HelloWorldResponse ws_HelloWorldResponseObject;
    20     class _ns1__SumResponse ws_sum_ResponseObject;
    21 
    22     ///SOAP 初始化
    23     soap_init(&clientSoap);
    24 
    25     ///调用函数的参数赋值
    26     int sum_a = 120;
    27     int sum_b = 12;
    28     printf("请分别输入需要相加的两个数字,确认后请按回车键
    ");
    29     scanf("%d
    %d",&sum_a, &sum_b);
    30     
    31     ws_sumObject.a = sum_a;
    32     ws_sumObject.b = sum_b;
    33 
    34 
    35     ///发送WEBService请求,并获得返回结果
    36     int nResult = soap_call___ns1__HelloWorld(&clientSoap, NULL, NULL, &ws_HelloWorldObject, ws_HelloWorldResponseObject);
    37     int sumNResult = soap_call___ns1__Sum(&clientSoap, NULL, NULL, &ws_sumObject, ws_sum_ResponseObject);
    38     
    39     //操作成功
    40     if(SOAP_OK == nResult)
    41     {
    42     //输出返回结果
    43     std::string strResult = "返回结果为: ";
    44     strResult.append(*(ws_HelloWorldResponseObject.HelloWorldResult));
    45     printf("%s
    ", strResult.c_str());
    46     }
    47     if(SOAP_OK == sumNResult)
    48     {
    49     //输出返回结果
    50     std::string strResult = "返回结果为: ";
    51     int sumR = ws_sum_ResponseObject.SumResult;
    52     printf("%s%d
    ", strResult.c_str(), sumR);
    53 
    54     }
    55 
    56     //关闭soap
    57     soap_end(&clientSoap);
    58 
    59     getchar();
    60     getchar();
    61     return 0;
    62 }
    View Code

    参考:

    http://blog.sina.com.cn/s/blog_4b44e1c00101bqim.html

    http://www.cnblogs.com/LiGengMing/p/5594314.html

  • 相关阅读:
    网络信息安全攻防学习平台第7题
    深入理解读写锁ReentrantReadWriteLock
    彻底理解ReentrantLock
    (三)应该了解关于并发相关的概念
    (二)并发编程的优缺点
    Linux Makefile多目录的编写
    libcurl 下载上传
    MFC枚举USB设备碰到的一个疑难,还没解决
    MFC一个令人纠心的错误
    如何为你的App获取用户的反馈和5星级评论
  • 原文地址:https://www.cnblogs.com/mobilecard/p/6895111.html
Copyright © 2020-2023  润新知