mssoap与gsoap访问WebService的使用

来源:互联网 发布:短信轰炸php源码 编辑:程序博客网 时间:2024/05/21 12:46

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_MBSTRINGsoap_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++的文件,应该是跨平台的。
1 0
原创粉丝点击