C++请求web service与xml解析(二)

2015-01-27 10:01:06 · 作者: · 浏览: 29
kEndChild(pEleRoot); TiXmlElement *pEleFileHeader = new TiXmlElement("FileHeader"); TiXmlElement *pEleFileBody = new TiXmlElement("FileBody"); pEleRoot->LinkEndChild(pEleFileHeader); pEleRoot->LinkEndChild(pEleFileBody); TiXmlElement *pEleMessageType = new TiXmlElement("MessageType"); TiXmlElement *pEleOriginator = new TiXmlElement("Originator"); TiXmlElement *pEleRecipient = new TiXmlElement("Recipient"); TiXmlElement *pEleCreationTime = new TiXmlElement("CreationTime"); pEleFileHeader->LinkEndChild(pEleMessageType); pEleFileHeader->LinkEndChild(pEleOriginator); pEleFileHeader->LinkEndChild(pEleRecipient); pEleFileHeader->LinkEndChild(pEleCreationTime); TiXmlText *pEleMessageTypeText = new TiXmlText("ProxyMiddleWareJobSearch"); TiXmlText *pEleOriginatorText = new TiXmlText("WetLand"); TiXmlText *pEleRecipientText = new TiXmlText("Platform"); TiXmlText *pEleCreationTimeText = new TiXmlText("2014-9-18 10:25:20"); pEleMessageType->LinkEndChild(pEleMessageTypeText); pEleOriginator->LinkEndChild(pEleOriginatorText); pEleRecipient->LinkEndChild(pEleRecipientText); pEleCreationTime->LinkEndChild(pEleCreationTimeText); //! TiXmlElement *pEleUserName = new TiXmlElement("UserName"); TiXmlElement *pEleUserRoleID = new TiXmlElement("UserRoleID"); TiXmlElement *pEleJobType = new TiXmlElement("JobType"); pEleFileBody->LinkEndChild(pEleUserName); pEleFileBody->LinkEndChild(pEleUserRoleID); pEleFileBody->LinkEndChild(pEleJobType); TiXmlText *pEleUserNameText = new TiXmlText("..."); TiXmlText *pEleUserRoleIDText = new TiXmlText("13"); TiXmlText *pEleJobTypeText = new TiXmlText(""); pEleUserName->LinkEndChild(pEleUserNameText); pEleUserRoleID->LinkEndChild(pEleUserRoleIDText); pEleJobType->LinkEndChild(pEleJobTypeText); pDoc->SaveFile("E:/houqd.xml");

3) 生成XML字符串

生成XML字符串只需要将如上的pDoc->SaveFile(“E:/houqd.xml”)替换为如下:

//!生成string字符串
	TiXmlPrinter printer;
	pDoc->Accept(&printer);

	string strRequest(printer.CStr());

2. C++调SOAP的开源库

我们采用gsoap作为开源的web service的实现框架,可以从网上下载到开源的代码实现。下载地址:http://gsoap2.sourceforge.net/ 一般下载的gsoap工具包中已经包含了生成Web Service客户端需要用到的两个工具(可执行文件):wsdl2h.exe和soapcpp2.exe,windows开发包一般在gsoap/bin/win32下,默认情况下wsdl2h并不支持SSL,即无法访问HTTPS站点,如果想要支持SSL等更多功能,就需要自己重新配置编译该gsoap工具包,以生成新的wsdl2h.exe和soapcpp2.h。这里,我采用的是原生的文件。

相关参考资料:http://blog.csdn.net/zhaiwenjuan/article/details/6590941

1) gsoap生成本地代理

1> 根据wsdl生成相应的头文件

从Web服务提供者处获取Web Service的WSDL文件,通常是一个URL,如:http://www.somewebservice.com/Service?Wsdl,当然也可以是一个WSDL形式的XML文件。

使用gsoap的wsdl2h.exe,根据WSDL生成一个C/C++语法结构的头文件。

例如:wsdl2h.exe -s -o Service.h http://www.somewebservice.com/Service?Wsdl

这一步执行完后会得到一个头文件,如:Service.h

该步的目的:实现WSDL文件到.h文件的数据映射。

2> 根据生成的头文件生成相关代理文件

使用gsoap的预编译器soapcpp2.exe,根据上一步得到的头文件来生成存根文件soapStub.h和客户端代码框架:

如:soapcpp2.h -i -x -C -L Service.h

这一步将会得到几个.nsmap、.h和.cpp文件。该步的目的:生成相应的底层通信代码。

2) gsoap调用webservice接口

将上几步生成的文件加入到工程中,并包含响应的头文件,并采用如下的调用方式:

string strRequest(printer.CStr());

	//!web service调接口
	string strWebServiceAddr = "http://172.16.10.209:8080/HDHT_J2EE/services/ProxyMiddleWareJob?wsdl";
	ProxyMiddleWareJobHttpBindingProxy *proxy = new Proxy