微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mssoap与gsoap访问WebService的使用

1.mssoap使用:

本人win7 x64 vs2010测试机,

包含头,引用库,命名空间

#include "stdafx.h"
#include <stdio.h>
#include "windows.h"
#import "msxml4.dll"
//using namespace MSXML2;
#include "msxml.h"
#import "C:/Program Files (x86)/Common Files/MSSoap/Binaries/mssoap30.dll" exclude("IStream","IErrorInfo","ISequentialStream","_LARGE_INTEGER","_ULARGE_INTEGER","tagSTATSTG","_FILETIME")
using namespace MSSOAPLib30;
测试代码

void CMFCTestDlg::OnBnClickedBtOutput()
{
	// Todo: 在此添加控件通知处理程序代码
	CoInitialize(NULL);
	ISoapSerializerPtr Serializer;
	ISoapReaderPtr Reader;
	ISoapConnectorPtr Connector;

	HRESULT hr=Connector.CreateInstance(__uuidof(HttpConnector30)); //创建连接实例
	if(!SUCCEEDED(hr))
	{  
		MessageBox(_T("error"));
		return;
	}
	//服务所在地址和端口;
	Connector->Property["EndPointURL"] = "http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx?wsdl";//网上找到webservice网址
	Connector->Connect();
//	Connector->Property["SoapAction"] = "http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx?wsdl";
	Connector->BeginMessage();
	Serializer.CreateInstance(__uuidof(SoapSerializer30));
	Serializer->Init(_variant_t((IUnkNown*)Connector->InputStream));


	Serializer->StartEnvelope("soap","","");//
	Serializer->SoapAttribute("xsi","http://www.w3.org/2001/XMLSchema-instance","xmlns");   
	Serializer->SoapAttribute("xsd","http://www.w3.org/2001/XMLSchema","xmlns");
//	Serializer->SoapAttribute("soap12","http://schemas.xmlsoap.org/soap/envelope/","xmlns");
	Serializer->SoapAttribute("soapenc","http://schemas.xmlsoap.org/soap/encoding/","xmlns");
	Serializer->SoapAttribute("tns","http://www.webxml.com.cn/","xmlns");
	Serializer->SoapAttribute("types","http://www.webxml.com.cn/encodedTypes","xmlns");
	Serializer->StartBody(L"NONE");

	Serializer->StartElement("getEnCnTwoWayTranslator","http://WebXml.com.cn/","NONE","xmlns"); // 开放的接口

	Serializer->StartElement("Word","");//参数
	Serializer->SoapAttribute("xsi:type","xsd:string","");
	Serializer->WriteString("hello"); //传参
	Serializer->EndElement();

	Serializer->EndElement();

	Serializer->EndBody();
	Serializer->EndEnvelope();

	Connector->EndMessage(); 

	Reader.CreateInstance(__uuidof(SoapReader30));

	Reader->Load(_variant_t((IUnkNown*)Connector->OutputStream),"");

	SetDlgitemText(IDC_EDIT1,Reader->RpcResult->xml);//(const char*)

}


2.gsoap使用:

首先官网下载windows版zip解压,在bin目录下有两个exe,命令行中使用wsdl2h或soapcpp2 -h可查看可使用命令。

wsdl2h.exe  解析WebService的wsdl文件或者相应的URL,本测试-o导出到*.h.

soapcpp2.exe 编译WebService代码,编译解析后得到的*.h文件.

生成文件较多。如果是客户端使用可加参数 -C编译。

包含头:

#include "sf/soapStub.h"
#include "sf/soapH.h"
#include "sf/procSMSSoapBinding.nsmap"

void CMFCTestDlg::OnBnClickedButton1()
{
	// Todo: 在此添加控件通知处理程序代码
	soap sService;
	_ns1__getEnCnTwoWayTranslator *pTrans = new _ns1__getEnCnTwoWayTranslator;
	CString strWord(_T("word"));
	pTrans->Word = new std::string(UnicodetoUTF8(strWord));
	_ns1__getEnCnTwoWayTranslatorResponse TransResp;
	soap_init(&sService);
	soap_set_mode(&sService,SOAP_C_UTFSTRING);//SOAP_C_UTFSTRING,SOAP_C_MBSTRING
	soap_call___ns1__getEnCnTwoWayTranslator(&sService,"http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx?wsdl","http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx/",pTrans,TransResp);
	ns1__arrayofstring* pAS = TransResp.getEnCnTwoWayTranslatorResult;
	std::string strXml;
	vector<std::string>::iterator it = pAS->string.begin();
	while (it != pAS->string.end())
	{
		strXml += *it;
		strXml += "\n";
		it++;
	}
	CString strMsg(UTF8ToUnicode(strXml.c_str()));

	SetDlgitemText(IDC_EDIT1,strMsg);//(const char*)
}
两者调用都不复杂,但,个人表示,mssoap可封装性好过gsoap,当网址、接口更改时,gsoap需要重新编译生成接口文件,而mssoap只需相应调整参数即可。但mssoap往往需要自家的xml解析类,不如gsoap纯净的感觉。而且gsoap编译生成的接口文件是纯C/C++的文件,应该是跨平台的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐