gsoap 实现 C/C++ 调用web service

jopen 5年前

gSOAP 是什么?

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

简单来说,  gSOAP 功能之一就是可以帮助我们使用C/C++调用web Service.

 

下载gSOAP

gSOAP的官方网站是:

http://www.cs.fsu.edu/~engelen/soap.html

 

可以到

http://sourceforge.net/projects/gsoap2/?source=typ_redirect 下载gSOAP

下载的是一个zip 包, 解压后路径如下:

 

gsoap/bin 目录下是针对不同的系统的开发工具。

 

客户端代码生成和调用步骤

1. 首先要有服务端的wsdl (如果已经有地址的话, 可以在浏览器中保存这个wsdl)

这里假设wsdl 的 文件名为 test.wsdl

2. 使用wsdl2h.exe,根据wsdl生成一个头文件(比如test.h),这是个临时文件,下一步骤执行完后自动删除即可!

命令:

<pre class="html" name="code" snippet_file_name="blog_20141021_1_6614013" code_snippet_id="491042">wsdl2h.exe -c -e -o test.h test.wsdl</pre>3.  使用使用soapcpp2.exe生成客户端调用代码,soapcpp2.exe是可以生成构建C++ SOAP客户端所需的C++源码的预编译器,
(生成代码后test.h就没有用了,可以直接删除)

命令:

<pre class="html" name="code" snippet_file_name="blog_20141021_2_8825090" code_snippet_id="491042">soapcpp2.exe -C test.h</pre>

-C : 只生成客户端代码

 

看一看产生出来的文件结构:

红色框起来的部分都是新产生出来的

绿色的部分适合 web service 相关的文件

 

XXXSoapBinding.nsmap:namespaces声明,需要包含在一个cpp文件里面,比如放在StdAfx.cpp里面,否则连接时报错:unresolved external symbol _namespaces

 

在实际调用的时候, 在调用的 .c 文件中

<pre class="cpp" name="code" snippet_file_name="blog_20141021_3_7580196" code_snippet_id="491042">#include "soapStub.h" #include "soapH.h" #include "XXXSoapBinding.nsmap" //call web service 的方法</pre>
调用的方法会在 soapStub.h 头文件中产生。

 

也可以打包成 libsoa.a 这样的静态链接库这样的文件来使用。

两条命令:
  cc -c libsoa.c soapC.c soapClient.c stdsoap2.c
  ar r libsoa.a libsoa.o soapC.o soapClient.o stdsoap2.o

stdsoap2.h,stdsoap2.c   在下载的gsoap 目录下

 

其他

如果开发的web service 比较多的话, name space比较多, 有可能出现一些混乱。

这个时候可以指定固定的前缀

新建一个  typemap.dat 的文件

内容如下:

<pre class="html" name="code" snippet_file_name="blog_20141021_4_1069188" code_snippet_id="491042">ns1 = "http://XXX" ns2 = "http://XXXXX2" ns3 = "http://XXXXXX3" ns4 = "http://XXXXXX4"</pre>
在命令产生 .h , .c 文件时多加一个参数, 比如对于 .h 来说

<pre class="html" name="code" snippet_file_name="blog_20141021_5_4317415" code_snippet_id="491042">wsdl2h.exe -t ./typemap.dat -c -e -o test.h</pre>
来自:http://blog.csdn.net/oscar999/article/details/40342301