VS2010使用c++、gSOAP创建的WebService 图文教程

环境

操作系统:Windows 7
gsoap版本:2.8.32
C++编译器/开发环境:Visual Studio 2010

gSOAP是什么

gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。

下载gSOAP工具包

http://120.52.73.49/jaist.dl.sourceforge.NET/project/gsoap2/gSOAP/gsoap_2.8.32.zip

gSOAP Toolkit
解压后把下面两个文件复制到“C:\Windows”目录下,或者添加环境变量,这 样就可以在任何位置执行命令:

soapcpp2.exe

wsdl2h.exe

一、编写一个头文件

文件名:itoa.h

  1. //gsoap ns service name: itoa
  2. //gsoap ns service namespace: http://localhost/itoa.wsdl
  3. //gsoap ns service location: http://localhost
  4. //gsoap ns service executable: itoa.cgi
  5. //gsoap ns service encoding: encoded
  6. //gsoap ns schema namespace: urn:itoa
  7. int ns__itoa(int i, char **a);

二、生成wsdl和服务端代码

打开CMD命令行,切换目录到“itoa.h”文件所在目录,执行命令:

  1. soapcpp2 -S -I C:\gSOAP\gsoap-2.8\gsoap\import itoa.h


执行完成后,会在文件夹下面生成以下文件:

测试直接使用“soapcpp2 -S itoa.h”也是可以的;

三、创建项目

1、打开VS2010,文件》新建》项目

2、左侧模板中选择Visual c++,右侧选择 Win32 控制台应用程序,输入项目名称,选择保存位置,勾选“为解决方案创建目录”,确定

3、下一步

4、取消“预编译头”的选中状态,完成

四、配置编译

1、打开项目文件目录

2、将第二步生成的代码复制到项目目录下

3、添加文件到项目

4、选择要添加到项目的文件

这里没有列全,有几个文件(stdsoap2.h,stdsoap2.cpp)是需要从gSOAP的源码目录复制过来的

注意:并不是要把所有文件都添加到项目里!

5、替换“itoaServer.cpp”文件的内容,使用以下代码:

  1. // itoaServer.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "soapH.h"
  4. #include <windows.h>
  5. #include "itoa.nsmap"
  6. #define BACKLOG (100)    /* Max. request backlog */
  7. DWORD WINAPI process_request(LPVOID*);
  8. int http_get(struct soap * soap);
  9. int main(int argc, char **argv) {
  10. struct soap soap;
  11. struct soap *tsoap;
  12. const char* fmt = "accepts socket %d connection from IP %d.%d.%d.%d\n";
  13. soap_init(&soap);
  14. if ( argc < 2 ) {
  15. soap_serve(&soap);
  16. soap_destroy(&soap);
  17. soap_end(&soap);
  18. }
  19. else {
  20. soap.send_timeout = 60;
  21. soap.recv_timeout = 60;
  22. soap.accept_timeout = 3600;
  23. soap.max_keep_alive = 100;
  24. soap.fget = http_get;
  25. DWORD tid;
  26. HANDLE hThread;
  27. int port = atoi(argv[1]); // first command-line arg is port
  28. SOAP_SOCKET m, s;
  29. m = soap_bind(&soap, NULL, port, BACKLOG);
  30. if ( !soap_valid_socket(m) ) exit(1);
  31. printf("Socket connection successful %d\n", m);
  32. for ( ; ; ) {
  33. s = soap_accept(&soap);
  34. if ( !soap_valid_socket(s) ) {
  35. if ( soap.errnum ) {
  36. soap_print_fault(&soap, stderr);
  37. exit(1);
  38. }
  39. printf("server timed out\n");
  40. break;
  41. }
  42. printf(fmt, s, (soap.ip>>24)&0xFF, (soap.ip>>16)&0xFF, (soap.ip>>8)&0xFF, soap.ip&0xFF);
  43. tsoap = soap_copy(&soap); // make a safe copy
  44. if ( !tsoap ) break;
  45. hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)process_request, tsoap, 0, &tid);
  46. if ( hThread == NULL ) {
  47. printf("can not create a thread for SOAP request processing.\n");
  48. exit(-1);
  49. }
  50. }
  51. }
  52. soap_done(&soap);
  53. return 0;
  54. }
  55. DWORD WINAPI process_request(LPVOID* soap) {
  56. soap_serve((struct soap*)soap);
  57. soap_destroy((struct soap*)soap);
  58. soap_end((struct soap*)soap);
  59. soap_done((struct soap*)soap);
  60. free(soap);
  61. return 0;
  62. }
  63. // 服务消息的实现代码
  64. int ns__itoa(struct soap *soap, int i, char **a)
  65. {
  66. *a = (char*)soap_malloc(soap, 11);
  67. sprintf(*a, "%d", i);
  68. return SOAP_OK;
  69. }
  70. int http_get(struct soap * soap) {
  71. FILE *fd = NULL;
  72. printf("call http_get.\n");
  73. char *s = strchr(soap->path, '?');
  74. if ( !s || strcmp(s, "?wsdl") ) return SOAP_GET_METHOD;
  75. fd = fopen("itoa.wsdl", "rb");
  76. if ( !fd ) return 404;
  77. soap->http_content = "text/xml";
  78. soap_response(soap, SOAP_FILE);
  79. for ( ; ; ) {
  80. size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
  81. if ( !r ) break;
  82. if ( soap_send_raw(soap, soap->tmpbuf, r) ) break;
  83. }
  84. fclose(fd);
  85. soap_end_send(soap);
  86. return SOAP_OK;
  87. }

6、编译生成,在项目名称上单击鼠标右键,选择重新生成

选择重新生成的好处是避免之前的生成错误影响本次生成的结果

7、生成成功后,从项目目录下将“itoa.wsdl”文件复制到输出目录

五、启动WebService并测试

1、打开CMD命令提示符

2、切换目录到生成输入目录

3、执行命令:itoaServer.exe 8087

后面的端口是可以自己定义的,你想用什么就输入什么,只要是未占用的,不是其它协议/服务常用的;

4、允许访问

5、打开浏览器,输入你的IP:端口号/itoa?wsdl 访问看看吧,正常的话应该显示“itoa.wsdl”文件的内容

2016-05-29更新

1、更新文件:itoa.h,添加了一个函数

  1. //gsoap ns service name: itoa
  2. //gsoap ns service protocol: SOAP
  3. //gsoap ns service style: rpc
  4. //gsoap ns service namespace: http://localhost:8087/itoa?wsdl
  5. //gsoap ns service location: http://localhost:8087
  6. //gsoap ns service encoding: encoded
  7. //gsoap ns schema namespace: urn:itoa
  8. int ns__itoa(int i, char **a);
  9. int ns__add(double a, double b, double& result);

2、更新文件:itoaServer.cpp,加入代码:

  1. //server端的实现函数与itoa.h中声明的函数相同,但是多了一个当前的soap连接的参数
  2. int ns__add(struct soap *soap, double a, double b, double& result)
  3. {
  4. result = a + b;
  5. return 0;
  6. }

3、ns与ns2的区别

目前只是发现如果头文件件中的函数名使用ns2开头的话(例如:ns2_itoa),那么生成的WSDL文件名就是“ns2.wsdl”,时间有限,还没有深入去研究;另外在官方用户手册中也会看到“//gsoap ns2 service”这样的,也没有尝试;

结束语

别人如果想访问你的WebService,必须能够拿到你的 wsdl 文件(本例中为:itoa.wsdl)才行,还有就是你的WebService运行的服务器IP及使用的端口。

这里只讲了如何用c++,gSOAP开发一个WebService供别人调用,以后再讲讲如何调用的吧。

相关源码下载:http://download.csdn.net/detail/testcs_dn/9528394

下一篇:VS2010使用c++、gSOAP调用WebService 图文教程

参考:

http://www.genivia.com/products.html

http://www.genivia.com/doc/soapdoc2.html

http://www.cppblog.com/qiujian5628/archive/2008/06/19/54019.html

http://www.cppblog.com/qiujian5628/archive/2008/09/16/61945.html

http://blog.csdn.net/testcs_dn/article/details/51463367

http://blog.csdn.net/testcs_dn/article/details/51526051

VS2010使用c++、gSOAP创建WebService 图文教程的更多相关文章

  1. gsoap创建webservice服务简单教程

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] WebServicesoapgsoap 使用gsoap创建webservice服务 下载gsop 准备待导出的服务接口定义文件比 ...

  2. sqlserver如何创建镜像图文教程(转)

    由于工作中需要做SQL的镜像异地备份,以前都没有研究过,百度了一个文章记录下,方便以后查询 转载地址:http://jingyan.baidu.com/article/d5c4b52b20843fda ...

  3. Win7(32/64)VS2010配置编译GDAL环境(图文教程+亲测可用!)

    最近的一个VS2010的项目中用到了GDAL,关于GDAL这个库的说明与赞美,这里就不赘述了,下面是在VS2010中配置GDAL的详细过程. 系统说明 Win7(32位/64位),VS2010,GDA ...

  4. 【转】vs2010下创建webservice

    题记:学了六个月java一直想做java,没想到进了.NET项目组,还是VB2012,还有WebService,压力山大,这篇纯粹看看多图的效果,版主不要怪罪. Visual Studio 2010默 ...

  5. 基于MAVEN使用IDEA创建dubbo入门项目图文教程

    花了很长时间没有找到一个很详细的图文教程来学习dubbo入门框架,故记录下来. 一: 项目工程目录 简单介绍项目目录结构: 二: 创建父工程 具体操作步骤: 1,打开IDEA,按下面步骤来 File- ...

  6. idea创建springcloud项目图文教程(EurekaServer注册中心)

    http://blog.csdn.net/hcmony/article/details/77854999 idea创建springcloud项目图文教程(EurekaServer注册中心)(六) 1, ...

  7. Altium 中异形焊盘异形封装的创建图文教程

    Altium 中异形焊盘异形封装的创建图文教程 一般不规则的焊盘被称为异型焊盘,典型的有金手指.大型的器件焊盘或者板子上需要添加特殊形状的铜箔(可以制作一个特殊封装代替). 如图27所示,此处我们以一 ...

  8. vs2010下创建webservice ----第一天(建立项目,以及不连数据库进行加减乘除)

    Visual Studio 2010默认采用的框架为.NET Framework4,在这个框架中已找不到直接创建WebService的模板方式了.但VS2010可以创建WebService是毋庸置疑的 ...

  9. Win 2003 创建 IP 安全策略来屏蔽端口的图文教程

    (本文用示例的方法讲解 IP 安全策略的设置方法,具体的设置还是要根据个人实际的需要来设置.另外 Windows Server 2008 与此类似.千一网络编辑注) IP安全性(Internet Pr ...

随机推荐

  1. 【bzoj2733】永无乡(无旋treap启发式合并 + 并查集)

    传送门 题目分析 起初每个岛都是一个平衡树, 并查集的祖先都是自己.合并两岛时,pri较小的祖先会被作为合并后的祖先, 而两颗平衡树采用启发式合并.查询k值就是基本操作. code #include& ...

  2. SQL基础问题整理

    在程序中,数据库操作是必不可少的部分,所以我们要备足数据库相关知识才能去应付程序中出现的种种问题.基于此,我特地在国外网站.博客上整理了一些问题,并附带了答案和解释.参考.为了保证“原汁原味”,我就保 ...

  3. MATLAB Toolbox Path Cache is out of date and is not being used的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用mcc编译MATLAB\R2009a\extern\examples\compiler目录下的hello.m,编译 ...

  4. gdal库中设置prj4库全路径的用法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 gdal库实现投影转换之类的功能实际上底层都是调用prj4库的功能.如果gdal使用非静态的方式集成prj4库,实际上 ...

  5. apply plugin: 'idea' --- gradle idea

    如果你的项目使用了Gradle作为构建工具,那么你一定要使用Gradle来自动生成IDE的项目文件,无需再手动的将源代码导入到你的IDE中去了. 如果你使用的是eclipse,可以在build.gra ...

  6. Node child_process Study.2

    child_process 模块用于新建子进程.子进程的运行结果存储在系统缓存之中,等到子进程运行结束之后,主进程再用回调函数读取子进程的运行结果 1.exec() exec 方法用于执行base命令 ...

  7. WPF MeshGeometry3D

    说说 MeshGeometry3D 里 常用的 四个属性. 先看看 MSDN 的 简介 先说说 Positions,介绍说 是顶点位置的集合,什么意思,看张图片. 这张简单描述了一个三位坐标系,里面有 ...

  8. 微信公众平台消息接口开发(24)图片识别之人脸识别API

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 图片识别 人脸识别 API 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archi ...

  9. 【Android工具类】用户输入非法内容时的震动与动画提示——EditTextShakeHelper工具类介绍

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 当用户在EditText中输入为空或者是数据异常的时候,我们能够使用Toast来提醒用户,除此之外,我们还能 ...

  10. Microsoft IoT Starter Kit

    Microsoft IoT Starter Kit 开发初体验 1. 引子 今年6月底,在上海举办的中国国际物联网大会上,微软中国面向中国物联网社区推出了Microsoft IoT Starter K ...