您的位置:首页 > 其它

mssoap与gsoap访问WebService的使用

2015-07-31 13:59 525 查看
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","http://WebXml.com.cn/","NONE","");//参数
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.(-s 不指定这个需要有stlvector.h头文件,多个wsdl文件用空格隔开)

例:wsdl2h.exe -s -o out.h a.wsdl b.wsdl

soapcpp2.exe 编译WebService代码,编译解析后得到的*.h文件.
生成文件较多。如果是客户端使用可加参数 -C编译。

例:soapcpp2.exe -C out.h

(-h查看更多命令)

包含头:

#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++的文件,应该是跨平台的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: