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.7\gsoap\bin\win32 下的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.7\gsoap\bin\win32目录下

   public class HelloWorld{

public String sayHelloWorld (String name);

}

 

2.4  复制命令行所需的文件

  将gsoap-2.7\gsoap\import\stlvector.h 和 stl.h、 stldeque.h、stllist.h、stlset.h、soap12.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

  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"

实现的示例代码如下:

 // WebServiceClientTest.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "gsoap/service1soap.nsmap"
#include "stdio.h" int _tmain(int argc, _TCHAR* argv[])
{
//soap客户端
struct soap clientSoap; //WEBService调用对象
class _ns1__HelloWorld ws_HelloWorldObject;
class _ns1__Sum ws_sumObject; //WEBService返回对象
class _ns1__HelloWorldResponse ws_HelloWorldResponseObject;
class _ns1__SumResponse ws_sum_ResponseObject; ///SOAP 初始化
soap_init(&clientSoap); ///调用函数的参数赋值
int sum_a = ;
int sum_b = ;
printf("请分别输入需要相加的两个数字,确认后请按回车键\r\n");
scanf("%d\r\n%d",&sum_a, &sum_b); ws_sumObject.a = sum_a;
ws_sumObject.b = sum_b; ///发送WEBService请求,并获得返回结果
int nResult = soap_call___ns1__HelloWorld(&clientSoap, NULL, NULL, &ws_HelloWorldObject, ws_HelloWorldResponseObject);
int sumNResult = soap_call___ns1__Sum(&clientSoap, NULL, NULL, &ws_sumObject, ws_sum_ResponseObject); //操作成功
if(SOAP_OK == nResult)
{
//输出返回结果
std::string strResult = "返回结果为: ";
strResult.append(*(ws_HelloWorldResponseObject.HelloWorldResult));
printf("%s\r\n", strResult.c_str());
}
if(SOAP_OK == sumNResult)
{
//输出返回结果
std::string strResult = "返回结果为: ";
int sumR = ws_sum_ResponseObject.SumResult;
printf("%s%d\r\n", strResult.c_str(), sumR); } //关闭soap
soap_end(&clientSoap); getchar();
getchar();
return ;
}

参考:

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

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

C++客户端访问WebService VS2008的更多相关文章

  1. 客户端访问WebService和PageMethod

    客户端访问WebService 客户端访问WebService和后台访问WebService没什么不同,注意的地方是要在ScriptManager中添加 <Services>        ...

  2. 问题-XE8客户端访问Webservice时报“no selected dom vendor”

    问题现象:XE8做的客户端访问XE8做的Webservice时,客户端报“no selected dom vendor”. 问题原因:原因不明,应该是用到了XML转换等方法吧.有高手了解的,请M我. ...

  3. axis客户端循环访问webservice的时候只发送了几条数据就断开了的问题

    原因 axis客户端访问webservice默认是使用http1.0版本的,这个版本的http不能保持长连接,应该换成http1.1版本 具体修改步骤: <?xml version=" ...

  4. ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

    使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也 ...

  5. C++访问WebService gSoap方式

    一.             gSOAP访问WebService 1.      下载gSOAP gSOAP 2.7.17 版下载地址http://sourceforge.net/projects/g ...

  6. 【转】Spring的WebServiceTemplate访问WebService的方法及其本质原理

    WebService客户端调用的本质就是将SAOP格式的XML通过通信协议发送到WebService的服务器端,然后接收服务器端返回的XML. 本文简单介绍一下如何通过Spring提供的WebServ ...

  7. php——SoapClient访问webservice

    原文:php--SoapClient访问webservice 通过SoapClient调用天气预报 <?phpheader ( "Content-Type: text/html; ch ...

  8. SQL Server 2008 R2 根据WSDL访问WebService

    参考网站:WebService学习整理(一)——客户端三种调用方式整理 自我概括: WebService 通过HTTP通讯,数据以XML格式传输使两个系统进行数据交互 SOAP 是访问协议(注明访问W ...

  9. Android局域网访问webservice以及其中的一些问题

    应老师的要求,要做个安卓app,实现备份app上的数据到服务器上的mongodb上,网上搜了下相关的实现方式.利用webservice技术,具体来说就是客户端直接调用服务器端的接口.之前从来没接触这玩 ...

随机推荐

  1. [Swift]LeetCode1000. 合并石头的最低成本 | Minimum Cost to Merge Stones

    There are N piles of stones arranged in a row.  The i-th pile has stones[i] stones. A move consists ...

  2. Python 的字符串

    Python 的字符串 在最新的 Python 3 版本中,字符串是以 Unicode 编码的,也就是说,Python 的字符串支持多语言,例如: print('包含中文的 str') 对于单个字符的 ...

  3. python数组并集交集补集

    并集 a = ["a", "b", "c", "d"] b = ["b", "e" ...

  4. GitHub 1W star 成就达成!

    起因 感谢各位大佬的支持收获了人生第一个(很有可能也是唯一一个)1W star 项目. 从今年一月份创建项目至今 8 个月时间. 一共关闭了 27 个 issue,47 个 RP,总共有 11 位小伙 ...

  5. qt实现头像上传功能

    想必大家都使用过qt的自定义头像功能吧,那么图1应该不会陌生,本片文章我就是要模拟一个这样的功能,虽然没有这么强大的效果,但是能够满足一定的需求. 图1 qq上传图片 首先在讲解功能之前,我先给出一片 ...

  6. Java8虚拟机内存模型

    1.  Java虚拟机运行时数据区 在JDK1.8之前,JVM运行时数据区分为堆.虚拟机栈.本地方法栈.方法区.程序计数器.如下图所示: 虚拟机栈:线程私有,随线程创建而创建.栈里面是一个一个“栈帧” ...

  7. Ocelot + Consul实践

    关于Consul(https://www.consul.io)是一个分布式,高可用,支持多数据中心的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla ...

  8. Solr 02 - 最详细的solrconfig.xml配置文件解读

    目录 1 luceneMatchVersion - 指定Lucene版本 2 lib - 配置扩展jar包 3 dataDir - 索引数据路径 4 directoryFactory - 索引存储工厂 ...

  9. HashMap扩容全过程

      1.如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办? 默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如Arr ...

  10. TCP/IP 四次断开

    网络连接状态 网络连接状态(11种)非常重要这里既包含三次握手中的也包括四次断开中的,所以要熟悉. LISTEN 被动打开,首先服务器需要打开一个socket进行监听,监听来自远方TCP端口的连接请求 ...