您的位置:首页 > 编程语言 > ASP

ASP之SOAP的发送、接收与处理类[转载]

2009-11-24 21:06 274 查看
本人研究SOAP,源于06年工作时在ASP下跨域的数据传递,当时公司的主站需要与二级域名进行数据通信,经过对动网一段时间的研究,最后自己整理出几个类,用于处理这种数据包的收发和处理。

我们不谈SOAP是什么,只谈用来干嘛,简单的说就是通过HTTP进行数据包(XML文档格式数据)传递,比如有两个站点:A和B,如果A想读取B中某些数据,必须具备两个条件:一是,B必须对A开放这些功能,另外一个是,A必须具备读取和处理的能力。所以,B必须能够识别出A,因为基于HTTP协议是“开放”性的,任何人都可以访问,那就需要对用户进行身份验证,除此之外,就是如果对数据进行打包,很简单--XML文档,在SOAP中所有的包都是XML的文档格式,也就是说,在传递数据时必须进行“打包”,制作成XML文档进行传递,接收时装载这个XML文档,然后处理,最后打包需要返回的数据,再返回。

看看我的SOAP收发和处理类(ASP)

'+++++++++++++++++++++++++++++++++++++++ 002.'类说明 003.' OpenXML:XML数据常用发送函数类 004.' SendXML:XML数据发送类 005.' InceptXML:XML数据接收类 006.' ReturnXML:XML数据返回类 007.' ManageXML:XML数据处理类 008.'依赖性 009.' 010.'==================== 类声明 ==================== 011.
012.'XML数据 发送类 013.Class SendXML 014.
Public Estate,GetData,GetAppid,MessageCode,myXML_AppID,myXML_Urls 015.
'Estate:最终结果状态。-1:失败;1:成功。 016.
'GetData:保存返回的 Dictionary 对象数据(键:系统程序标识;值:响应XML数据)。 017.
'MessageCode:发送数据并返回后的处理信息。 018.
Private XmlDoc,XmlHttp,ArrUrls,mXML 019.
020.
'构造函数 021.
Private Sub Class_Initialize() 022.
myXML_AppID = "haowai"
'当前系统的程序标识 023.
myXML_Urls = "http://localhost/include/myXml.asp"
'整合的其它程序的接口文件路径 024.
Set mXML=New ManageXML 025.
ArrUrls = Split(Trim(myXML_Urls),"|") 026.
MessageCode = ""027.
Estate = "0"028.
Set GetData = Server.Createobject("Scripting.Dictionary") 029.
Set XmlDoc=mXML.createDocument("<?xml version=""1.0"" encoding=""gb2312""?><root/>") 030.
mXML.AddNode XmlDoc.documentElement,mXML.CreateNode(XmlDoc,"appid",1,myXML_AppID) 031.
End Sub032.
'析构函数 033.
Private Sub Class_Terminate() 034.
If IsObject(XmlDoc) Then Set XmlDoc = Nothing035.
If IsObject(GetData) Then Set GetData = Nothing036.
If IsObject(mXML) Then Set mXML = Nothing037.
End Sub038.
039.
'创建新节点,并返回 040.
'nName:节点名称 041.
'nType:节点类型 042.
'nValue:节点值 043.
Public Property Get CreateNode(nName,nType,nValue) 044.
Set CreateNode=mXML.CreateNode(XmlDoc,nName,nType,nValue) 045.
End Property046.
047.
'获取发送包XML中的节点对象 048.
'XPath:XPath查询语法字符串 049.
Public Property Get GetSendNode(XPath) 050.
Set GetSendNode=mXML.GetNode(XmlDoc.documentElement,XPath) 051.
End Property052.
'获取返回包XML中的节点对象 053.
'GetAppid:要获取的系统标识 054.
'XPath:XPath查询语法字符串 055.
Public Property Get GetReturnNode(GetAppid,XPath) 056.
Set GetReturnNode=mXML.GetNode(GetReturnXml(GetAppid).documentElement,XPath) 057.
End Property058.
059.
'获取发送的XML文档对象 060.
Public Property Get GetSendXml() 061.
Set GetSendXml=XmlDoc 062.
End Property063.
'获取返回XML文档对象,当该值不为NULL时,其为XML对象。 064.
'GetAppid:要获取的系统标识 065.
Public Property Get GetReturnXml(GetAppid) 066.
Dim GetXmlDoc 067.
GetReturnXml = Null 068.
If GetAppid <> "" Then069.
GetAppid = Lcase(GetAppid) 070.
If GetData.Exists(GetAppid) Then071.
Set GetReturnXml = GetData(GetAppid) 072.
End If073.
End If074.
End Property075.
076.
'打印发送请求XML文档对象 077.
Public Sub PrintSendXml() 078.
mXML.PrintXML XmlDoc 079.
End Sub080.
'打印返回XML文档对象 081.
'GetAppid:要获取的系统标识 082.
'myApi_Obj.PrintReturnXml 083.
Public Sub PrintReturnXml(GetAppid) 084.
mXML.PrintXML GetReturnXml(GetAppid) 085.
End Sub086.
087.
'发送 XML 数据包 088.
Public Sub Send() 089.
Dim i,GetXmlDoc,LoadAppid,iEstate,EstateStr 090.
Set Xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0") 091.
Set GetXmlDoc = mXML.createDocument("") 092.
For i = 0 to Ubound(ArrUrls) 093.
XmlHttp.Open "POST", Trim(ArrUrls(i)), false 094.
XmlHttp.SetRequestHeader "content-type", "text/xml"095.
XmlHttp.Send XmlDoc 096.
'Response.Write mXML.strAnsi2Unicode(xmlhttp.responseBody) 097.
If GetXmlDoc.LoadXml(XmlHttp.responseText) Then098.
LoadAppid = Lcase(GetXmlDoc.documentElement.selectSingleNode("appid").Text) 099.
GetData.add LoadAppid,GetXmlDoc 100.
iEstate = GetXmlDoc.documentElement.selectSingleNode("status").Text 101.
Select Case CStr(iEstate) 102.
Case "-1" EstateStr="失败"103.
Case "0" EstateStr="部分成功"104.
Case Else EstateStr="成功"105.
End Select106.
If iEstate="-1" Then107.
Estate="-1"108.
Else109.
Estate="1"110.
End If111.
MessageCode = MessageCode & "程序标识:" & LoadAppid & " 状态:" & EstateStr & "<br>"112.
MessageCode = MessageCode & GetXmlDoc.documentElement.selectSingleNode("message").Text & "<br>"113.
If iEstate = "-1" Then114.
Exit For115.
End If116.
Else117.
Estate="-1"118.
MessageCode = "请求数据错误!"119.
Exit For120.
End If121.
Next122.
Set GetXmlDoc = Nothing123.
Set XmlHttp = Nothing124.
End Sub125.End Class126.
127.'XML数据 接收类 128.Class InceptXML 129.
Public Estate 130.
'Estate:获取状态。1:数据接收成功;0:数据接收失败。 131.
Private XmlDoc,mXML 132.
133.
'构造函数 134.
Private Sub Class_Initialize() 135.
Set mXML=New ManageXML 136.
Set XmlDoc = mXML.createDocument("") 137.
XmlDoc.Load(Request) 138.
If XmlDoc.parseError.errorCode <> 0 Then139.
Estate="0"
'数据接收失败 140.
Else141.
Estate="1"
'数据接收成功 142.
End If143.
End Sub144.
'析构函数 145.
Private Sub Class_Terminate() 146.
If IsObject(XmlDoc) Then Set XmlDoc = Nothing147.
If IsObject(mXML) Then Set mXML = Nothing148.
End Sub149.
150.
'获取接收的XML文档对象 151.
Public Property Get GetInceptXml() 152.
Set GetInceptXml=XmlDoc 153.
End Property154.
'打印接收的XML文档对象 155.
Public Sub PrintInceptXml() 156.
mXML.PrintXML XmlDoc 157.
End Sub158.
159.
'获取接收包XML中的节点对象 160.
'XPath:XPath查询语法字符串 161.
Public Property Get GetNode(XPath) 162.
Set GetNode=mXML.GetNode(XmlDoc.documentElement,XPath) 163.
End Property164.End Class 165.
166.'XML数据 返回类 167.Class ReturnXML 168.
Private XmlDoc,mXML 169.
170.
'构造函数 171.
Private Sub Class_Initialize() 172.
Set mXML=New ManageXML 173.
Set XmlDoc=mXML.createDocument("<?xml version=""1.0"" encoding=""gb2312""?><root/>") 174.
End Sub175.
'析构函数 176.
Private Sub Class_Terminate() 177.
If IsObject(XmlDoc) Then Set XmlDoc = Nothing178.
If IsObject(mXML) Then Set mXML = Nothing179.
End Sub180.
181.
'返回 XML 数据包 182.
'appid:当前程序标识 183.
'estate:程序执行状态。-1:失败;0:部分成功;1:成功。 184.
'message:响应信息 185.
Public Function Return(appid,estate,message) 186.
mXML.AddNode XmlDoc.documentElement,mXML.CreateNode(XmlDoc,"appid",1,appid) 187.
mXML.AddNode XmlDoc.documentElement,mXML.CreateNode(XmlDoc,"status",1,estate) 188.
mXML.AddNode XmlDoc.documentElement,mXML.CreateNode(XmlDoc,"message",1,message) 189.
mXML.PrintXML XmlDoc 190.
End Function191.
192.
'获取返回的XML文档对象 193.
Public Property Get GetReturnXml() 194.
Set GetReturnXml=XmlDoc 195.
End Property196.
'打印返回的XML文档对象 197.
Public Sub PrintReturnXml() 198.
mXML.PrintXML XmlDoc 199.
End Sub200.
201.
'获取返回包XML中的节点对象 202.
'XPath:XPath查询语法字符串 203.
Public Property Get GetNode(XPath) 204.
Set GetNode=mXML.GetNode(XmlDoc.documentElement,XPath) 205.
End Property206.
207.
'创建新节点,并返回 208.
'nName:节点名称 209.
'nType:节点类型 210.
'nValue:节点值 211.
Public Property Get CreateNode(nName,nType,nValue) 212.
Set CreateNode=mXML.CreateNode(XmlDoc,nName,nType,nValue) 213.
End Property214.End Class 215.
216.'XML数据 处理类 217.Class ManageXML 218.
'用字符串或XML文档创建Document对象,并返回 219.
'Str:要加载的字符串或XML文件路径 220.
Public Property Get CreateDocument(Str) 221.
Dim XmlDoc 222.
Set XmlDoc = Server.CreateObject("msxml2.FreeThreadedDOMDocument.3.0") 223.
XmlDoc.ASYNC = False224.
If Reg(Str,"^.*\.xml$",True,True)=True Then225.
XmlDoc.Load(Str) 226.
ElseIf Len(Str)<8 Or Left(Str,2)<>"<?" Then227.
Str="<?xml version=""1.0"" encoding=""gb2312""?>"&Str 228.
XmlDoc.LoadXml Str 229.
ElseIf Len(Str)>0 Then230.
XmlDoc.LoadXml Str 231.
End If232.
Set CreateDocument=XmlDoc 233.
End Property234.
'获取节点对象 235.
'Node:目标节点的父节点对象,如Document对象的根节点为:XmlDoc.documentElement 236.
'XPath:XPath查询语法字符串 237.
Public Property Get GetNode(Node,XPath) 238.
If Node.selectSingleNode(XPath) is Nothing Then239.
Set GetNode = Nothing240.
Else241.
Set GetNode = Node.selectSingleNode(XPath) 242.
End If243.
End Property244.
'创建新节点,并返回 245.
'XmlDoc:Document对象 246.
'nName:节点名称 247.
'nType:节点类型 248.
'nValue:节点值 249.
Public Property Get CreateNode(XmlDoc,nName,nType,nValue) 250.
Dim Node 251.
Set Node=XmlDoc.CreateNode(nType,nName,"") 252.
Node.Text=nValue 253.
Set CreateNode=Node 254.
End Property255.
'添加新节点 256.
'Parent:父节点 257.
'Node:要添加的节点对象 258.
Public Sub AddNode(Parent,Node) 259.
Parent.AppendChild(Node) 260.
End Sub261.
'打印XML数据 262.
'obj:要打印的XML数据对象 或 XML文档的字符串表现形式 263.
Public Sub PrintXML(obj) 264.
Response.Clear 265.
'Response.ContentType = "text/xml" 266.
Response.CharSet = "gb2312"267.
Response.Expires = 0 268.
If VarType(obj)=8 Then269.
If Reg(obj,"^<\?xml.*$",True,True)=False Then obj="<?xml version=""1.0"" encoding=""gb2312""?>"&vbNewLine&obj 270.
Response.Write obj 271.
Else272.
Response.Write "<?xml version=""1.0"" encoding=""gb2312""?>"&vbNewLine&obj.documentElement.XML 273.
End If274.
Response.End() 275.
End Sub276.
'字符串编码 277.
'str:要编码的字符串 278.
Public Function AnsiToUnicode(ByVal str) 279.
Dim i, j, c, i1, i2, u, fs, f, p 280.
AnsiToUnicode = ""281.
p = ""282.
For i = 1 To Len(str) 283.
c = Mid(str, i, 1) 284.
j = AscW(c) 285.
If j < 0 Then286.
j = j + 65536 287.
End If288.
If j >= 0 And j <= 128 Then289.
If p = "c" Then290.
AnsiToUnicode = " " & AnsiToUnicode 291.
p = "e"292.
End If293.
AnsiToUnicode = AnsiToUnicode & c 294.
Else295.
If p = "e" Then296.
AnsiToUnicode = AnsiToUnicode & " "297.
p = "c"298.
End If299.
AnsiToUnicode = AnsiToUnicode & ("&#" & j & ";") 300.
End If301.
Next302.
End Function303.
'字符串解码 304.
'asContents:要解码的字符串 305.
Public Function strAnsi2Unicode(asContents) 306.
Dim len1,i,varchar,varasc 307.
strAnsi2Unicode = ""308.
len1=LenB(asContents) 309.
If len1=0 Then Exit Function310.
For i=1 to len1 311.
varchar=MidB(asContents,i,1) 312.
varasc=AscB(varchar) 313.
If varasc > 127 Then314.
If MidB(asContents,i+1,1)<>"" Then315.
strAnsi2Unicode = strAnsi2Unicode & chr(ascw(midb(asContents,i+1,1) & varchar)) 316.
End If317.
i=i+1 318.
Else319.
strAnsi2Unicode = strAnsi2Unicode & Chr(varasc) 320.
End If321.
Next322.
End Function323.
'正则表达式模式匹配,成功返回:True;否则返回False 324.
'strng:要测试的字符串 325.
'patrn:匹配的正则表达式模式 326.
'ignore:是否区分大小写。False:区分;True:不区分。 327.
'global:全部匹配还是只匹配第一个。True:全局;False:只匹配第一个。 328.
Public Function Reg(strng,patrn,ignore,global) 329.
Dim regEx 330.
Set regEx = New RegExp 331.
regEx.Pattern = patrn 332.
regEx.IgnoreCase = ignore 333.
regEx.Global = global 334.
Reg = regEx.Test(strng) 335.
End Function336.End Class

先看发送类:SendXML

使用前先配置构造函数中的两个参数:

myXML_AppID = "www1" '当前系统的程序标识
myXML_Urls = "http://localhost/include/myXml.asp" '整合的其它程序的接口文件路径
myXML_AppID参数表示当前站点的标识,在接收类中用此标识来唯一的验证身份, myXML_Urls参数表示数据包发送的地址路径。该参数可以存储多个地址,中间用“,”逗号分隔,其实有点像“广播”,发送的时候会向所有的地址都发送这个包。

当创建该类后,可以通过CreateNode方法先对数据包进行设置,然后使用Send方法发送。这里我们不讨论如果打包,你必须非常的熟悉如果处理XML文档。

接收类:InceptXML

该类中最重要的一个方法:GetNode接收数据函数。成功接收后,可以通过GetInceptXml函数读取数据包,至于如何处理我们也不讨论(还是那句话,你必须非常的熟悉如果处理XML文档)。

返回类:ReturnXML

其实该类就是打印出返回的包--XML文档。

处理类:ManageXML

该类只是集成了对XML常用操作的一些方法。

最后,还有二个问题,第一个就是乱码,你在使用SOAP前,要统一一种编码,否则在处理的时候你会经常遇到乱码。另外一个,也是最最重要的一点,就是耐心,SOAP在测试的时候是最烦心的,因为每一个环节的失败都将直接导致你最终结果的错误,不论是在发送、接收以及返回包的任何一个步骤上都必须准确无误。所以我在每一个类中都有一个相似的方法--打印包的函数,就是把要发送的包、接收到的包以及返回的包都先打印出来,最笨的方法了,处理之前抓取这个包,看看到底包的内容和你预计的是否完全一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: