(基于gsoap-win32-2.7版本,编译环境为VS2005)

客户端

访问自己定义的一个WebService(命名为AddService,对输入的两个整形参数求和,具体服务定义参见 AddService.wsdl)

转换WSDL

wsdl2h.exe -s -o AddService.h AddService.wsdl

生成具体调用代码

在命令行输入soapcpp2.exe -C AddService.h

生成代码后,AddService.h就没有用了,不用加入到工程中。

生成的文件
  • soapStub.h
  • soapAddServiceSoapBindingProxy.h:封装了调用webservice的类
  • soapH.h
  • soapClientLib.cpp:用不到
  • soapClient.cpp
  • soapC.cpp
  • AddServiceSoapBinding.nsmap:namespaces声明,需要包含在一个cpp文件里面,比如放在 StdAfx.cpp里面,否则连接时报错:unresolved external symbol _namespaces

还需要stdsoap2.cpp和stdsoap2.h文件,在gsoap-2.7soapcpp2目录下。

注意:#include “StdAfx.h”加到第一行,否则VC编译报错:fatal error C1010: unexpected end of file while looking for precompiled header directive

实际调用代码

将这些文件加入到C++工程中,可以使用以下代码调用WebService:

  • 头文件
    // 包含代理类的头文件
    #include "gSoap\soapAddBindingProxy.h"
  • 声明访问代理对象
    AddBinding serviceBinding;
  • 设置访问的WebServiceURL
    serviceBinding.endpoint = ("http://LocalHost:8082/");
  • 调用接口
    int iResult;
    nRetCode 
    = serviceBinding.__ns1__AddOperation(1222,iResult);

服务端

实现AddService(对输入的两个整形参数求和)

生成调用代码

同客户端生成方法基本一致。需要注意的是以下几点:

  • 由.h文件生成具体调用代码:soapcpp2.exe -S AddService.h
  • soapClient.cpp soapClientLib.cpp soapServerLib.cpp这三个文件不需要加入到C++工程中。
实现服务线程
  • 在程序开始时,启动服务线程。
    UINT GSoapServiceThreadFunc(LPVOID p)
    {
    ...
    }
  • 定义编码格式
    // 设置UTF-8编码方式
    soap_set_mode(&soap, SOAP_C_UTFSTRING);
  • 设置服务的端口号
    // 端口号
    int port = 8083;
    int backlog = 100//
    int m = soap_bind(&soap, NULL, port, backlog);
    if(m < 0)
    {
            strOutput.Format(_T(
    "GSoapServiceThreadFunc——在端口%d上启动服务失败!"), port);
            OutputDebugString(strOutput);
            soap_done(
    &soap); // close master socket and detach environment
            exit(-1);
    }

相关文章: