ASP调用WEBSERVICE文档

----INDEX----
1. soap请求方式
2. post请求方式
3. SHOWALLNODE函数(关于节点各属性和数据显示)
---------------------
一.SOAP请求示例
下面是一个 SOAP 请求示例。所显示的占位符需要由实际值替换。
POST /WebService1/UserSignOn.asmx HTTP/1.1
Host: 192.100.100.81
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: " http://tempuri.org/LoginByAccount "

1<soap:envelope xmlns:soap=" http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xsd=" http://www.w3.org/2001/XMLSchema " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
2<soap:body>
3<loginbyaccount xmlns=" http://tempuri.org/ ">
4<username>string</username>
5<password>string</password>
6</loginbyaccount>
7</soap:body>
8</soap:envelope>

为了与WEBSERVICE交互,需要构造一个与上完全相同的SOAP请求:

1   
2url = " http://192.100.100.81/WebService1/UserSignOn.asmx " 
3
4SoapRequest="
5<?xml version="&CHR(34)&"1.0"&CHR(34)&" encoding="&CHR(34)&"utf-8"&CHR(34)&"?>
6"& _   
7"

<soap:envelope "&="" "&chr(34="" "xmlns:soap="&amp;CHR(34)&amp;" "xmlns:xsd="&amp;CHR(34)&amp;" )&"="" 2001="" _="" envelope="" http:="" schemas.xmlsoap.org="" soap="" www.w3.org="" xmlns:xsi="&amp;CHR(34)&amp;" xmlschema"&chr(34="" xmlschema-instance"&chr(34="">"&amp; _
"<soap:body>"&amp; _

"<loginbyaccount "&chr(34="" )&"="" http:="" tempuri.org="" xmlns="&amp;CHR(34)&amp;">"&amp; _
"<username>"&amp;username&amp;"</username>"&amp; _
"<password>"&amp;password&amp;"</password>"&amp; _
"</loginbyaccount>"&amp; _

"</soap:body>"&amp; _
"</soap:envelope>

 1" 
 2
 3Set xmlhttp = server.CreateObject("Msxml2.XMLHTTP")   
 4xmlhttp.Open "POST",url,false   
 5xmlhttp.setRequestHeader "Content-Type", "text/xml;charset=utf-8"   
 6xmlhttp.setRequestHeader "HOST","192.100.100.81"   
 7xmlhttp.setRequestHeader "Content-Length",LEN(SoapRequest)   
 8xmlhttp.setRequestHeader "SOAPAction", " http://tempuri.org/LoginByAccount " ‘一定要与WEBSERVICE的命名空间相同,否则服务会拒绝   
 9xmlhttp.Send(SoapRequest)   
10‘这样就利用XMLHTTP成功发送了与SOAP示例所符的SOAP请求.   
11‘检测一下是否成功:   
12Response.Write xmlhttp.Status&” ”   
13Response.Write xmlhttp.StatusText   
14Set xmlhttp = Nothing   

如果成功会显示200 ok,不成功会显示 500 内部服务器错误〿 Connection: keep-alive .
成功后就可以利用WEBSERVICE的响应,如下:
SOAP响应示例
下面是一个 SOAP 响应示例。所显示的占位符需要由实际值替换。
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

1<soap:envelope xmlns:soap=" http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xsd=" http://www.w3.org/2001/XMLSchema " xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
2<soap:body>
3<loginbyaccountresponse xmlns=" http://tempuri.org/ ">
4<loginbyaccountresult>string</loginbyaccountresult>
5</loginbyaccountresponse>
6</soap:body>
7</soap:envelope>

这是与刚才SOAP请求示例所对应的SOAP响应示例,在成功发送请求后,就可以查看该响应 :
If xmlhttp.Status = 200 Then

Set xmlDOC =server.CreateObject("MSXML.DOMDocument")
xmlDOC.load(xmlhttp.responseXML)
xmlStr = xmlDOC.xml
Set xmlDOC=nothing
xmlStr = Replace(xmlStr,"<","<")
xmlStr = Replace(xmlStr,">",">")
Response.write xmlStr
Else

Response.Write xmlhttp.Status&" "
Response.Write xmlhttp.StatusText

End if
请求正确则给出完整响应,请求不正确(如账号,密码不对)响应的内容就会信息不完整.
取出响应里的数据,如下:
If xmlhttp.Status = 200 Then

Set xmlDOC = server.CreateObject("MSXML.DOMDocument")
xmlDOC.load(xmlhttp.responseXML)
Response.Write xmlDOC.documentElement.selectNodes("//LoginByAccountResult")(0).text ‘显示节点为LoginByAccountResult的数据(有编码则要解码)
Set xmlDOC = nothing

Else

Response.Write xmlhttp.Status&" "
Response.Write xmlhttp.StatusText

End if

显示某节点各个属性和数据的FUNCTION:

Function showallnode(rootname,myxmlDOC)'望大家不断完鄯 2005-1-9 writed by 844
if rootname<>"" then

set nodeobj=myxmlDOC.documentElement.selectSingleNode("//"&rootname&"")'当前结点对像
nodeAttributelen=myxmlDOC.documentElement.selectSingleNode("//"&rootname&"").attributes.length'当前结点属性数

returnstring=returnstring&"

1<br/>

节点名称:"&rootname

if nodeobj.text<>"" then
returnstring=returnstring&"

1<br/>

节点的文本:("&nodeobj.text&")"
end if

returnstring=returnstring&"

1<br/>

{

1<br/>

"

if nodeAttributelen<>0 then
returnstring=returnstring&"

1<br/>

属性数有  "&nodeAttributelen&" 个,分别是:"
end if

for i=0 to nodeAttributelen-1
returnstring=returnstring&"

1<li>"&amp;nodeobj.attributes(i).Name&amp;": "&amp;nodeobj.getAttribute(nodeobj.attributes(i).Name)&amp;" </li>

"
next

if nodeobj.childNodes.Length<>0 then
if nodeobj.hasChildNodes() and lcase(nodeobj.childNodes.item(0).nodeName)<>"#text" then'是否有子节点
set childnodeobj=nodeobj.childNodes
childnodelen=nodeobj.childNodes.Length
returnstring=returnstring&"

1<br/>
1<br/>

有 "&childnodelen&" 个子节点;

1<br/>

分别是: "
for i=0 to childnodelen-1
returnstring=returnstring&"

1<li>"&amp;childnodeobj.item(i).nodeName&amp;"</li>

"
next
end if
end if

returnstring=returnstring&"

1<br/>

}

1<br/>

"
response.write returnstring
set nodeobj=nothing
end if
End Function
可以这样用:
If xmlhttp.Status = 200 Then

Set xmlDOC = server.CreateObject("MSXML.DOMDocument")
xmlDOC.load(xmlhttp.responseXML)
showallnode "LoginByAccountResponse",xmlDOC’调用SHOWALLNODE
Set xmlDOC = nothing

Else

Response.Write xmlhttp.Status&" "
Response.Write xmlhttp.StatusText

End if

二.POST请求示例
HTTP POST
下面是一个 HTTP POST 请求示例。所显示的占位符需要由实际值替换。
POST /WebService1/UserSignOn.asmx/LoginByAccount HTTP/1.1
Host: 192.100.100.81
Content-Type: application/x-www-form-urlencoded
Content-Length: length

username=string&password=string
构造POST请求:

 1   
 2url = " http://192.100.100.81/WebService1/UserSignOn.asmx/LoginByAccount " 
 3
 4SoapRequest="username="&username&"&password="&password 
 5
 6Set xmlhttp = server.CreateObject("Msxml2.XMLHTTP")   
 7xmlhttp.Open "POST",url,false   
 8xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"’注意   
 9xmlhttp.setRequestHeader "HOST","192.100.100.81"   
10xmlhttp.setRequestHeader "Content-Length",LEN(SoapRequest) 
11
12xmlhttp.Send(SoapRequest)   
13‘这样就利用XMLHTTP成功发送了与HTTP POST示例所符的POST请求.   
14‘检测一下是否成功:   
15Response.Write xmlhttp.Status&” ”   
16Response.Write xmlhttp.StatusText   
17Set xmlhttp = Nothing   

如果成功会显示200 ok,不成功会显示 500 内部服务器错误〿 Connection: keep-alive .
成功后就可以利用WEBSERVICE的响应,如下:
HTTP POST
下面是一个 HTTP POST 响应示例。所显示的占位符需要由实际值替换。
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

1<string xmlns=" http://tempuri.org/">string</string>

显示:
If xmlhttp.Status = 200 Then

Set xmlDOC = server.CreateObject("MSXML.DOMDocument")
xmlDOC.load(xmlhttp.responseXML)
showallnode "string",xmlDOC'调用SHOWALLNODE
Set xmlDOC = nothing

Else

Response.Write xmlhttp.Status&" "
Response.Write xmlhttp.StatusText

End if

以上是ASP用XMLHTTP组件发送SOAP请求,调用WEBSERVICE的方法,本人推荐在ASP环境下使用第一种方法,如果有更好的方法请联系本人 mailto:[email protected] .使用HTTP GET的方式如果有中文会出问题,数据量又不大。用HTTP POST的方法感觉多此一举,其实上面的例子就是用POST的方式,只不过不是用POST的请求。用SOAP TOOLKIT要装软件,而且已没有后继版本。---全文完

Published At
Categories with Web编程
Tagged with
comments powered by Disqus