通过soapSDK调用webservice接口

简介: webservice soap

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

1、首先下载安装soapsdk3.0

(http://download.microsoft.com/download/2/e/0/2e068a11-9ef7-45f5-820f-89573d7c4939/soapsdk.exe)

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的版本以及异常处理

相关文章
|
30天前
|
JSON 数据格式
【有关调用第三方接口工具】
【有关调用第三方接口工具】
14 0
|
10天前
|
小程序 前端开发 开发者
调用第三方接口微信登录接口
该文档介绍了调用微信登录接口的需求和实现思路。当用户尝试访问需要登录的页面时,若未登录则弹出微信登录选项。登录过程涉及微信小程序的wx.login()方法获取临时凭证code,并将其发送到服务器,服务器通过此code换取用户的OpenID、UnionID和session_key。依据这些信息,服务器可生成自定义登录态以识别用户身份。参考微信官方文档和登录流程图进行实现。
22 9
|
5月前
|
数据挖掘 API PHP
Playfab开发(一)如何调用PlayFab接口
Playfab开发(一)如何调用PlayFab接口
|
7月前
调用DescribeRouteTables接口
调用DescribeRouteTables接口
50 1
|
9月前
|
XML Java 机器人
webservice接口调用OA方法
最近一直在做这样一个需求,在OA中写一个webservice接口,通过调用OA中更新的方法来同步上级主管,我们公司的OA系统是买的产品,一无所知的我就这样开启了无悔的探索寻求之路~
|
10月前
|
安全 Java 程序员
如何调用api接口
如何调用api接口
|
11月前
请求方法封装
请求方法封装
|
11月前
uiapp请求方法封装
uiapp请求方法封装
|
小程序
小程序调用接口不生效?
小程序调用接口不生效?
312 0
|
Java Android开发 数据格式
Android平台调用WebService详解
Android平台调用WebService详解 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lyq8479/article/details/6428288       上篇文章已经对Web Service及其相关知识进行了介绍(Android开发之WebService介绍 ),相信有的朋友已经忍耐不住想试试在Android应用中调用Web Service。
2209 0