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] 举报,一经查实,本站将立刻删除。