通过soapSDK调用webservice接口

简介: webservice soap

由于在上传报警服务器过车数据时,第三方平台提供了webservice接口。以前用VC++2003做过调用webservice接口,直接在Project菜单下的add web Reference填入相关的名称,VC++2003会自动生成相关的类,在调用的地方只要定义一个实例就可以调用webservice接口了,但是在测试南通卡口数据上传项目时发现,编译时总是提示命名空间不对,后来查找资料发现webservice接口编写不规范会导致webservice接口的 namespace不对。我们不能要求第三方修改webservice接口,只查找其他方法。于是通过soap调用webservice接口。以下是详细步骤:

1、首先下载安装soapsdk3.0

()

2、在头文件中引入必要的库的,包含相应的命名空间

#import "msxml4.dll" 

using namespace MSXML2;

#import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP30.dll" \

exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \

"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")

using namespace MSSOAPLib30;

3、在cpp文件中调用soap提供的接口,直接贴代码

try   

{   

// Web服务连接

pDlg->Connector.CreateInstance(__uuidof(HttpConnector30));

// http://10.36.6.4/video/control.asmx?op=WriteTgclJl为调用页面,在URL里指定你的服务器名

pDlg->Connector->Property["EndPointURL"] = "http://10.36.6.4/video/control.asmx?op=WriteTgclJl"; 

pDlg->Connector->Connect();    

 

// 开始消息,http://10.36.6.4/video/WriteTgclJl为响应函数,

pDlg->Connector->Property["SoapAction"] = "http://10.36.6.4/video/WriteTgclJl";

pDlg->Connector->BeginMessage(); //启动消息句柄

 

// 创建SoapSerializer对象

pDlg->Serializer.CreateInstance(__uuidof(SoapSerializer30)); 

// serializer 连接到 connector 的输入字符串

pDlg->Serializer->Init(_variant_t((IUnknown*)pDlg->Connector->InputStream));

// 创建ISoapReaderPtr对象

pDlg->Reader.CreateInstance(__uuidof(SoapReader30)); 

// 创建SOAP消息

pDlg->Serializer->StartEnvelope("","","");

 // pDlg->Serializer ->StartEnvelope("","STANDARD","")

pDlg->Serializer->StartBody("");

// 找到WEB函数名 

// pDlg->Serializer ->StartElement("WriteTgclJl","","STANDARD","")与前面保持一致

pDlg->Serializer->StartElement("WriteTgclJl","http://10.36.6.4/video/","","");

// 找到第1个参数

pDlg->Serializer->StartElement("s_jlid","http://10.36.6.4/video/","",""); 

// 输入第1个参数值

char szID[20] = "";

sprintf(szID, "%d", passVehicle.iCarLsh);

pDlg->Serializer->WriteString(szID); 

pDlg->Serializer->EndElement();

// 找到第2个参数

pDlg->Serializer->StartElement("s_cbzmc","http://10.36.6.4/video/","",""); 

// 输入第2个参数值

pDlg->Serializer->WriteString(passVehicle.chCrossingName); 

pDlg->Serializer->EndElement();

// 找到第3个参数

pDlg->Serializer->StartElement("s_hphm","http://10.36.6.4/video/","",""); 

// 输入第3个参数值

pDlg->Serializer->WriteString(passVehicle.license); 

pDlg->Serializer->EndElement();

// 找到第4个参数

pDlg->Serializer->StartElement("s_hpzlmc","http://10.36.6.4/video/","",""); 

// 输入第4个参数值

char szVehicleType[16] = "";

switch (passVehicle.chCarShapeType)

{

case 1:

strcpy(szVehicleType,"小型汽车");

break;

case 2:

strcpy(szVehicleType, "大型汽车");

break;

default:

strcpy(szVehicleType,"无号牌");

break;

}

pDlg->Serializer->WriteString(szVehicleType); 

pDlg->Serializer->EndElement();

// 找到第5个参数

pDlg->Serializer->StartElement("s_tgsj","http://10.36.6.4/video/","",""); 

// 输入第5个参数值

char szPassTime[20] = "";

COleDateTime passTime((time_t)passVehicle.dwPassTime);

sprintf(szPassTime,"%04d-%02d-%02d %02d:%02d:%02d",passTime.GetYear(),passTime.GetMonth(),passTime.GetDay(),passTime.GetHour(),passTime.GetMinute(),passTime.GetSecond());

pDlg->Serializer->WriteString(szPassTime); 

pDlg->Serializer->EndElement();

// 找到第6个参数

pDlg->Serializer->StartElement("s_xsfx","http://10.36.6.4/video/","",""); 

// 输入第6个参数值

pDlg->Serializer->WriteString(passVehicle.chDriectName); 

pDlg->Serializer->EndElement();

// 找到第7个参数

pDlg->Serializer->StartElement("s_cdh","http://10.36.6.4/video/","",""); 

// 输入第7个参数值

char szLane[20] = "";

sprintf(szLane,"%d",passVehicle.dwLaneNum);

pDlg->Serializer->WriteString(szLane); 

pDlg->Serializer->EndElement();

// 找到第8个参数

pDlg->Serializer->StartElement("s_xssd","http://10.36.6.4/video/","",""); 

// 输入第8个参数值

char szSpeed[5] = "";

sprintf(szSpeed,"%d",passVehicle.wCarSpeed);

pDlg->Serializer->WriteString(szSpeed); 

pDlg->Serializer->EndElement();

// 找到第9个参数

pDlg->Serializer->StartElement("s_tplj","http://10.36.6.4/video/","",""); 

// 输入第9个参数值

pDlg->Serializer->WriteString(strcat(passVehicle.szJpegHttpPath,passVehicle.szJpegname)); 

pDlg->Serializer->EndElement();

 

pDlg->Serializer->EndElement();

pDlg->Serializer->EndBody(); 

pDlg->Serializer->EndEnvelope(); 

 

//将该消息发送给web服务

pDlg->Connector->EndMessage(); //将消息送往服务器    

//reader联接到connector的输出字符串

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

//显示结果

//AfxMessageBox((const char *)Reader->Body->xml);//xml格式输出

const char szResult[10]= "SUCCESS";

_bstr_t res = pDlg->Reader->RpcResult->text;

if(strcmp(szResult,res) != 0)

{

COleDateTime odtTime = COleDateTime::GetCurrentTime();

CString strTime = odtTime.Format();

CPowerInfo::Log("Info", strTime, "UploadByWebService上传数据失败!"+res);

}

else

{

COleDateTime odtTime = COleDateTime::GetCurrentTime();

CString strTime = odtTime.Format();

CPowerInfo::Log("Info", strTime, "UploadByWebService上传数据成功!");

}

pDlg->Connector.Release();

pDlg->Serializer.Release();

pDlg->Reader.Release();

}

catch (_com_error e)   

{   

COleDateTime odtTime = COleDateTime::GetCurrentTime();

CString strTime = odtTime.Format();

CString errormessage;

errormessage.Format("%s",e.Description());

CPowerInfo::Log("Info", strTime, "UploadByWebService上传数据失败!"+errormessage);

}   

 

好了,总结一下必要的关键步骤:

  1.导入类型库   

  2.需要创建一个SoapConnector   

  3.下一步创建SoapSerializer   

  4.下一步把消息附加到SoapConnector的输入流   

  5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,   

  6.SoapReader被连接到SoapConnector输出流   

  7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复  

备注:注意使用的soapSDK的版本以及异常处理

相关文章
phpstorm插件应用:Test RESTful WEB Service 控制台接口调试工具
phpstorm插件应用:Test RESTful WEB Service 控制台接口调试工具
364 0
|
11月前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
714 5
|
XML 前端开发 Java
JAVA调试webservice接口
JAVA调试webservice接口
400 1
|
XML Java API
使用WebService接口进行数据通信
使用WebService接口进行数据通信
|
XML Java API
使用WebService接口进行数据通信
使用WebService接口进行数据通信
|
存储 监控 BI
HIS系统是什么?一套前后端分离云HIS系统源码 接口技术RESTful API + WebSocket + WebService
医院管理信息系统(全称为Hospital Information System)即HIS系统。 常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、媒体管理等,为医院管理提供更有力的保障。 HIS系统以财务信息、病人信息和物资信息为主线,通过对信息的收集、存储、传递、统计、分析、综合查询、报表输出和信息共享,及时为医院领导及各部门管理人员提供全面、准确的各种数据。 门诊医生工作站采用下拉式汉化菜单,界面友好,实用性强,设有与门诊挂号收费系统、医技科室信息系统、住院结算信息系统的软件接口。
704 1
使用队列解决高并发下使用Client对象调用webService接口
使用队列解决高并发下使用Client对象调用webService接口
|
XML 测试技术 数据安全/隐私保护
【SoapUI、Postman、WebServiceStudio、Jmeter】接口测试工具结合测试webservice接口(发送XML格式参数)
【SoapUI、Postman、WebServiceStudio、Jmeter】接口测试工具结合测试webservice接口(发送XML格式参数)
591 0
|
网络安全 网络架构
https请求SOAP webService接口
https请求SOAP webService接口
431 0
|
XML JSON 网络协议
webService接口对接医院lis系统接口
webService接口对接医院lis系统接口
779 0