前言:
公司项目目前用的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; }