zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    WCF 第十三章 可编程站点 为站点创建操作
    WCF 第十三章 可编程站点 所有都与URI相关
    WCF 第十二章 对等网 使用自定义绑定实现消息定向
    WCF 第十三章 可编程站点 使用WebOperationContext
    Using App.Config for user defined runtime parameters
    WCF 第十三章 可编程站点
    WCF 第十三章 可编程站点 使用AJAX和JSON进行网页编程
    WCF 第十二章 总结
    WCF 第十三章 可编程站点 使用WebGet和WebInvoke
    WCF 第十三章 可编程站点 URI和UriTemplates
  • 原文地址:https://www.cnblogs.com/mobilecard/p/6895111.html
Copyright © 2011-2022 走看看