VS2012建立了MFC工程,通过gsoap连接了webservice

来源:互联网 发布:袁隆平害了中国人知乎 编辑:程序博客网 时间:2024/06/10 16:33
原来使用soap无法连接,因为在调用编译库的时候报错。调编译库的代码为:
#import "C:\Windows\System32\msxml4.dll"
using namespace MSXML2;
//#import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap30.dll" 
#import "mssoap30.dll" \
 exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")  
using namespace MSSOAPLib30;

这个代码老是报 一个公共类型的错误,具体哪个不记得了。


后来任务紧急,使用了gsoap来处理
参考网络路径:http://blog.csdn.net/skylj0209/article/details/3277180
1.首先下载了一个压缩包  gsoap-2.8 然后解压后,在路径
D:\work\vs2012project\gsoap-2.8\gsoap\bin\win32
下有两个命令exe。
2.开始--cmd 输入d:然后输入cd D:\work\vs2012project\gsoap-2.8\gsoap\bin\win32
然后首先执行命令:
wsdl2h -o gsoapClientMessage.h http://192.168.1.180:9080/cvr_ws/services/CVRServerImpl?wsdl
  
使用wsdl2h生成描述文件,这里wsdl2h -c -o 生成纯C文件,如果没有-c则生成C++文件。
我们是生成C++文件
3.然后再使用另外个命令 soapcpp2 来生成代理函数,这是根据gsoapClientMessage.h 来生成代理函数。
命令:
soapcpp2 gsoapClientMessage.h -I D:\work\vs2012project\gsoap-2.8\gsoap\import
生成若干的.cpp .h文件如:
 




4.取其中的CVRServerImplSoap11Binding.nsmap, soapC.cpp, soapClient.cpp, soapH.h, soapStub.h
外加 D:\work\vs2012project\gsoap-2.8\gsoap 下的两个文件stdsoap2.cpp,stdsoap2.h加入工程中。
运行,报错,这时候需要右键点击新加入的所有的.cpp文件的属性。点击C\C++--预编译头将所有的预编译头
改为“不使用预编译头”。
 
5.然后再F5编译还是报错,报一个“_namepace”错误,这是因为没有在实现的
函数.CPP文件中增加对应的include文件。需要
#include "soapH.h"
#include "CVRServerImplSoap11Binding.nsmap" 
这两个文件。其中*.nasmap相当于一个头文件。这时候再F5就可以编译通过了。
6.编译通过后,就可以正常的调用webservice的函数调用。
如:


CString strurl = _T("http://192.168.1.180:9080/cvr_ws/services/CVRServerImpl?wsdl");
struct soap *soap = soap_new();
soap_init(soap);
_ns1__tranServer _req;//入参
_ns1__tranServerResponse _res;//出参
//CString strXml = _T("<?xml version=\"1.0\" encoding=\"utf-8\" ?><request><tranCode>0004</tranCode></request>");
//构造xml
CString strXml = _T("<?xml version=\"1.0\" encoding=\"utf-8\" ?><request><tranCode>0001</tranCode>");
strXml += _T("<param><userId>") + struser + _T("</userId>");
strXml += _T("<pwd>") + strpwd + _T("</pwd>");
strXml += "</param></request>";
std::string strStl = CT2A((LPCTSTR)strXml);//WCHAR宽字符转单字节
_req.xml = &strStl;


soap_set_mode(soap, SOAP_C_UTFSTRING);  //设置soap编码为UTF-8,防止中文乱码
if(soap_call___ns1__tranServer(soap, NULL, NULL, &_req, _res) == SOAP_OK)
{
/*
std::string strOutTmp = *(_res.return_);
CString strOut = CA2T(strOutTmp.c_str());
AfxMessageBox(strOut, MB_OK);
*/
}
最后需要对得到的返回字符串做解释。
0 0
原创粉丝点击