`
eggbucket
  • 浏览: 184542 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于c++ 开发gsoap客户端(client)

 
阅读更多

如何开发gsoap client

 

工作需要用C++做一个webservice客户端,开发环境为:vs 2005 学习了一下gSoap。

 

gSoap下载地址: http://sourceforge.net/projects/gsoap2/files/

 

解压:

在编写客户端之前我们必须提供webservice的服务器端:

 

笔者的webservice服务器使用axis来生成wsdl文件

 

提供的方法如下:

 

public class Hello {
    public String hello(String name) {
        if (name == null)
            name = "";
        return name + ", welcome to the world of web service!";
    }
}

 

wsdl文件如下图:


服务器端接介绍到这 下面我们开始我们的主题 编写客户端:

 

1 编写客户端我们需要用到前面介绍的gsoap工具 进入解压好的gsoap\bin\win32 该目录下有我们需要使用soapcpp2.exe和wsdl2h.exe。

wsdl2h.exe 的使用:

用法:




wsdl2h -o 头文件名 WSDL文件名或URL




      wsdl2h常用选项

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

 

soapcpp2.exe 的使用:

     常用选项

  • -C 仅生成客户端代码
  • -S 仅生成服务器端代码
  • -L 不要产生soapClientLib.c和soapServerLib.c文件
  • -c 产生纯C代码,否则是C++代码(与头文件有关)
  • -I 指定import路径(见上文)
  • -x 不要产生XML示例文件
  • -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。

 

2生成客户端存根:

 

 wsdl2h -o hello.h  http://localhost/webservice/Hello.jws?wsdl   从wsdl得到头文件

 

执行完这步会在当前目录下生成hello.h头文件

 

soapcpp2 -o hello.h //根据生成的头文件来生成存根

 

如果执行完这步会在当前目录下生成:

当然如果在执行该步骤时如果看到soapcpp2提示:”Critical error: #import: Cannot open file "stlvector.h" for reading. “, 那是因为我们的头文件使用了STL(wsdl2h 没用-s选项 ),这时要使用-I 选项指定gSOAP的 import文件路径,这个路径是"$gsoap\gsoap\import ":

 

soapcpp2 hello.h -I D:\gsoap_2.7.16\gsoap-2.7\gsoap\import

 

3 建立新项目ws4

 将生成的文件复制到你工程目录中:其中stdsoap2.h,stdsoap2.cpp 在 gsoap目录下 stlvector.h 在 gsoap\import目录下

 

注意事项:

1,stdsoap2.cpp   ,soapC.cpp ,  soapServiceSoapProxy.cpp 不需要预编译。


2. 常见错误示例, error C1010 ,一般是预编译头文件的问题,在主函数中需要选预编译,添加 StdAfx.h

                       error  LNK2001  在网络编程中需要WSOCK32.lib ,添加上即可。


                       error BK 1506: cannot open  file .....    取消Build browse info file

 

 

 

 

复制完成如图:

然后将其添加进项目如图:



5编程客户端

 新建hello.cpp
 
#include "soapH.h" // 得到存根程序
#include "HelloSoapBinding.nsmap"
#include<stdlib.h>                        
#include <iostream>
#include   <string>
#include "soapStub.h"
#include "stdsoap2.h"

using namespace std;
int main()
{
       struct soap clientSOAP;
       string s1 = "fuck";
       string s2 = "";
       soap_init(&clientSOAP);

       if(soap_call_ns1__hello(&clientSOAP, NULL, NULL, s1, s2) == SOAP_OK)

       {
             cout<<s2<<endl;
       }
       else
       {
              printf("Error\n");
       }

       soap_destroy(&clientSOAP);

       soap_end(&clientSOAP);

       soap_done(&clientSOAP);

       return 0;

}

 

6 编译运行:


 

 

  • 大小: 7.2 KB
  • 大小: 52.6 KB
  • 大小: 5.6 KB
  • 大小: 8.8 KB
  • 大小: 17 KB
  • 大小: 7.6 KB
  • 大小: 4.4 KB
  • 大小: 16.4 KB
  • 大小: 19.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics