mssoap与gsoap访问WebService的使用
2015-07-31 13:59
525 查看
1.mssoap使用:
本人win7 x64 vs2010测试机,
包含头,引用库,命名空间
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查看更多命令)
包含头:
两者调用都不复杂,但,个人表示,mssoap可封装性好过gsoap,当网址、接口更改时,gsoap需要重新编译生成接口文件,而mssoap只需相应调整参数即可。但mssoap往往需要自家的xml解析类,不如gsoap纯净的感觉。而且gsoap编译生成的接口文件是纯C/C++的文件,应该是跨平台的。
本人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++的文件,应该是跨平台的。
相关文章推荐
- *Delphi中ExtractFilePath、ParamStr以及更多文件/目录操作涉及的函数。附加对应的例子
- iOS 文件操作
- 升级Windows 10的用户,基本都吃了这个哑巴亏
- OSI七层模型 以及 TCP/IP模型
- perl中写数组的最值
- hdu 1166 敌兵布阵
- BZOJ2570:算符破译题解
- [转]Centos7.0网络自动启动
- 最强开发资源平台大合集
- 移动H5前端性能优化指南
- ZTD 简单做十个好习惯总结
- 短信接收
- mysql存储过程-递归赋值国家地区
- String constants 应用
- 史上最全的CSS hack方式一览
- mysql之Truncate 和Delete语句删除表的所有记录
- BlueDBM个人读感
- 如何定义变长的TLV结构体?
- python for android apk
- Bundle, 传递数据的包裹