C++调用Https方式的Webservice

前言:

公司项目目前用的C++客户端调用Webservice服务器(Java),原本使用的是vs2005添加web,以http方式调用,一切都OK。但是,现在应实际需要,要使用Https形式的Webservice(Java),但是之前的方式会有错误,以下记录此次过程。

说明:

使用的是gsoap+openssl,这次先记录下不验证证书的情况

正文:

好啦,http和https的区别,我就不赘述了,直接开始裸讲~

1、下载gsoap库:https://sourceforge.net/projects/gsoap2/files/gsoap-2.8/,直接解压即可

2、安装openssl:可以编译安装,也可以安装包,我使用的后者~(好吧,我确实懒):http://slproweb.com/download/Win64OpenSSL-1_0_2o.exe(64位)

3、搭建一个有效的https服务器,自己想办法~

4、此处分割线--------------------------------------------,以下为正式操作

5、生成头文件:打开cmd,进入gsoap安装目录D:\gsoap\gsoap-2.8\gsoap\bin\win32(不用cd,直接d:切换盘符),然后cd 进入目录即可(够详细了吧:)),执行以下命令即可

wsdl2h -o gSOAP_http.h https://192.168.10.20:8000/webservice/services/HelloXfire?wsdl

或者在浏览器中进入xml,保存即可

wsdl2h -o gSOAP_https.h test.xml

在当前目录生成一个头文件

6、生成源文件:

soapcpp2 -C gSOAP_http.h -I D:\gsoap\gsoap-2.8\gsoap\import

在当前目录生成好多xml和其他一些文件,好吧,我们其实只用到以下文件(C++):

soapH.h
soapStub.h
SimpleServiceSoap11Binding.nsmap
soapC.cpp

soapClient.cpp

7、我们要用的一共8个文件如下:

gSOAP_http.h
soapH.h
soapStub.h
SimpleServiceSoap11Binding.nsmap
soapC.cpp
soapClient.cpp
D:\gsoap\gsoap-2.8\gsoap\stdsoap2.h

D:\gsoap\gsoap-2.8\gsoap\stdsoap2.cpp

8、把这些文件添加到工程,注意stdsoap2.cpp、soapC.cpp、soapClient.cpp 不需要预编译

9、openssl相关设置:

在工程标签上右键选择属性
在属性页面的“C/C++ --> 预处理器 --> 预处理器定义”中添加上 WITH_OPENSSL(没有这个宏定义,编译器不会编译 soap_ssl_client_context() 函数)
1.1
在属性页面的“链接器 --> 输入 --> 附加依赖项”中添加上 <openssl_home>\lib 下的 libeay32.lib 和 ssleay32.lib
1.2
在属性页面的“VC++ 目录 --> 包含目录”中添加上 <openssl_home>\include(不是 <openssl_home>\include\openssl,因为 stdsoap2.h 文件包含头文件的时候已经将 openssl 子目录考虑进去了)
1.3
再将 <openssl_home>\bin 目录下 libeay32.dll 和 libeay32.dll 拷贝到将生成可执行文件的路径下。
1.4

特别注意:由于安装的是64位OpenSSL版本,所以工程属性也要改为x64,否则会提示函数无法解析

10、End,可以尽情使用了~

示例代码:

int main() 
{ 
   struct soap             tClientSoap; 
   _ns1__sayHello          tSayHelloSender; 
   _ns1__sayHelloResponse  tSayHelloResponse; 
   int                     iResult; 
 
 
   soap_init(&tClientSoap); 
   if(soap_ssl_client_context(&tClientSoap, 
                      SOAP_SSL_NO_AUTHENTICATION, 
                         NULL, NULL, NULL, NULL, NULL)) 
   { 
       soap_print_fault(&tClientSoap, stderr); 
       return -1; 
   } 
   else 
   { 
       tSayHelloSender.args0 = new string("the beautiful world!\n"); 
 
       iResult=soap_call___ns2__sayHello(&tClientSoap, NULL, NULL, 
                           &tSayHelloSender, &tSayHelloResponse); 
       if(iResult==SOAP_OK) 
       { 
           cout<<*(tSayHelloResponse.return_)<<endl; 
       } 
       else 
       { 
           cout<<"Error code "<<iResult<<endl; 
       } 
 
       delete tSayHelloSender.args0; 
   } 
 
   soap_destroy(&tClientSoap); 
   soap_end(&tClientSoap); 
   soap_done(&tClientSoap); 
   return 0; 
}

猜你喜欢

转载自blog.csdn.net/zhao3132453/article/details/80473954