SOAP應(yīng)用介紹
- 2019-11-12 23:21:00
- zstmtony 轉(zhuǎn)貼
- 4405
如果想了解SOAP到底是什么,就要自己動(dòng)手建立自己的SOAP標(biāo)準(zhǔn)對(duì)象。本文可以幫助你起步。
============================================
簡(jiǎn)介
SOAP - 簡(jiǎn)單對(duì)象處理協(xié)議(Simple Object Access Protocol) - 是當(dāng)前XML開(kāi)發(fā)的熱點(diǎn)。它是微軟新一代Visual Studio的主要角色,是".NET"策略的基礎(chǔ)。如果想用VB 6編制一個(gè)有保障的SOAP服務(wù),可以查閱微軟的SOAP工具包(VB)。但如果想了解SOAP到底是什么,就要自己動(dòng)手建立自己的SOAP標(biāo)準(zhǔn)對(duì)象。本文可以幫助你起步。
本文中,我們創(chuàng)建一個(gè)簡(jiǎn)單的SOAP服務(wù)端和一個(gè)客戶(hù)端。服務(wù)端用ASP編寫(xiě),名為soap.asp。這個(gè)文件應(yīng)存放在個(gè)人Web服務(wù)器的根目錄下,如:/Inetpub/wwwroot。這個(gè)服務(wù)器將接受和處理客戶(hù)端提出的SOAP請(qǐng)求??蛻?hù)端是一個(gè)簡(jiǎn)單的VB可執(zhí)行文件,由Sub Main()啟動(dòng)。
步驟
眾所周知,SOAP是一個(gè)“呼叫-響應(yīng)”機(jī)制,按客戶(hù)/服務(wù)方式運(yùn)行??蛻?hù)端(應(yīng)用程序)向服務(wù)端(位于互聯(lián)網(wǎng)上的某個(gè)Web服務(wù)器)發(fā)出函數(shù)調(diào)用請(qǐng)求并傳遞參數(shù);服務(wù)端則返回響應(yīng)。呼叫與響應(yīng)的內(nèi)容和數(shù)據(jù)都是按XML文件格式進(jìn)行傳送的。因此,要建立一個(gè)簡(jiǎn)單的SOAP應(yīng)用系統(tǒng),就要建立一個(gè)客戶(hù)端和一個(gè)服務(wù)端,即一個(gè)呼叫-響應(yīng)體系。
下面是一個(gè)簡(jiǎn)單例子:
我們建立一個(gè)服務(wù)端來(lái)計(jì)算銷(xiāo)售交易的稅款。按照傳統(tǒng)的VB術(shù)語(yǔ),即建立一個(gè)函數(shù),定義如下:
Public Function GetSalesTax(ByVal pSalesTotal As Double) as Double
GetSalesTax = pSalesTotal * 0.04
End Function
一個(gè)粗糙的函數(shù),但可作為示例(本例只能用于稅率為4%的地方)。
這個(gè)函數(shù)定義了一個(gè)函數(shù)名(GetSalesTax),一個(gè)參數(shù)(pSalesTotal – 銷(xiāo)售金額)和一個(gè)返回值(函數(shù)返回值)。按照面向?qū)ο笤瓌t,可以認(rèn)為pSalesTotal是一個(gè)"IN"參數(shù),GetSalesTax返回值是一個(gè)"OUT"參數(shù)。因此我們的SOAP服務(wù)端就要偵聽(tīng)客戶(hù)發(fā)出的調(diào)用GetSalesTax的請(qǐng)求和傳遞的"IN"參數(shù)(銷(xiāo)售金額),然后返回帶有"OUT"參數(shù)的回應(yīng),向客戶(hù)返回所需稅款。
客戶(hù)端
下面是用VB建立一個(gè)呼叫服務(wù)的客戶(hù)端程序:
dblSalesTax = GetSalesTax(100)
得到返回值$4。
如果GetSalesTax函數(shù)是一個(gè)外部對(duì)象,比如在MTS服務(wù)器上,就要調(diào)用服務(wù)器上的DLL模塊:
Dim objTax As New CTaxCalc
dblSalesTax = objTax.GetSalesTax(100)
在SOAP系統(tǒng)中,遠(yuǎn)程調(diào)用的方式略有不同,呼叫是通過(guò)XML文件傳送到服務(wù)器的。XML文件里有調(diào)用的函數(shù)名和相應(yīng)的參數(shù):
<GetSalesTax>
<SalesTotal>100</SalesTotal>
<GetSalesTax>
為確保服務(wù)器能夠識(shí)別和解釋客戶(hù)請(qǐng)求,呼叫指令被包裝到一個(gè)稱(chēng)之為SOAP信封的大文件里。這個(gè)信封使用的是SOAP封裝標(biāo)準(zhǔn)的通用命名空間:
<SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
<SOAP:Header></SOAP:Header>
<SOAP:Body>
<GetSalesTax>
<SalesTotal>100</SalesTotal>
<GetSalesTax>
</SOAP:Body>
</SOAP:Envelope>
最后,加入函數(shù)調(diào)用的命名空間,起到函數(shù)聲明的作用:
<SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
<SOAP:Header></SOAP:Header>
<SOAP:Body>
<m:GetSalesTax xmlns:m="urn:myserver/soap:TaxCalc">
<SalesTotal>100</SalesTotal>
</m:GetSalesTax>
</SOAP:Body>
</SOAP:Envelope>
現(xiàn)在,已經(jīng)準(zhǔn)備好客戶(hù)請(qǐng)求文件,可以送往服務(wù)端了。發(fā)送請(qǐng)求很簡(jiǎn)單,可以跟瀏覽器表單一樣,用HTTP post方式。瀏覽器可以向服務(wù)端發(fā)送復(fù)雜的表單,.NET可以向服務(wù)器發(fā)送VB代碼,但我使用XMLHTTP(IE 5以上版本才能用)。
假設(shè)strEnvelope含有XML文件格式的請(qǐng)求,發(fā)送格式如下:
Dim objHTTP As New MSXML.XMLHTTPRequest
Dim strEnvelope As String
'設(shè)定發(fā)往本地服務(wù)器
objHTTP.open "post", "http://localhost/soap/soap.asp"
'設(shè)定標(biāo)準(zhǔn)SOAP/ XML文件頭格式
objHTTP.setRequestHeader "Content-Type", "text/xml"
'設(shè)置呼叫函數(shù)請(qǐng)求
objHTTP.setRequestHeader "SOAPMethodName", _
"urn:myserver/soap:TaxCalc#GetSalesTax"
'呼叫SOAP
objHTTP.send strEnvelope
'取得返回值
strReturn = objHTTP.responseBody
至此,客戶(hù)端完成了向服務(wù)端發(fā)送請(qǐng)求的過(guò)程?,F(xiàn)在回到服務(wù)端,看看服務(wù)端如何偵聽(tīng)客戶(hù)請(qǐng)求并作出響應(yīng)。
服務(wù)端
服務(wù)端要能夠接收客戶(hù)發(fā)出的HTTP請(qǐng)求,在本地服務(wù)器(http://localhost/soap.asp)接收到客戶(hù)請(qǐng)求時(shí)作出回應(yīng)。因此服務(wù)端要能夠解析客戶(hù)端發(fā)出的XML格式(SOAP封裝)的請(qǐng)求,取出調(diào)用的函數(shù)名和參數(shù)。
服務(wù)端文件是soap.asp,它接收客戶(hù)請(qǐng)求的做法是:
Set objReq = Server.CreateObject("Microsoft.XMLDOM")
objReq.Load Request
然后用XSL樣式從封裝的XML文件中取出參數(shù):
strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal"
varSalesTotal = objReq.SelectSingleNode(strQuery).Text
根據(jù)參數(shù)計(jì)算稅款:
varSalesTax = varSalesTotal * 0.04
在將結(jié)果返回給客戶(hù)之前,要按SOAP標(biāo)準(zhǔn)做格式化封裝。過(guò)程與客戶(hù)端類(lèi)似,只是把"IN"參數(shù)改換為"OUT"參數(shù),并將函數(shù)標(biāo)記名標(biāo)為回應(yīng):
<SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
<SOAP:Header></SOAP:Header>
<SOAP:Body>
<m:GetSalesTaxResponse xmlns:m="urn:myserver/soap:TaxCalc">
<SalesTax>4</SalesTax>
</m:GetSalesTaxResponse>
</SOAP:Body>
</SOAP:Envelope>
可以用字符串方式構(gòu)造這個(gè)回應(yīng)文件,也可以創(chuàng)建一個(gè)DOM對(duì)象,增加一個(gè)節(jié)點(diǎn)。
文件返回給客戶(hù)后,客戶(hù)經(jīng)過(guò)解碼就能得到結(jié)果:
Dim objReturn As New MSXML.DomDocument
objReturn.LoadXML strReturn
strQuery = _
"SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"
dblTax = objReturn.SelectSingleNode(strQuery).Text
這樣就完成了一個(gè)簡(jiǎn)單的SOAP服務(wù)應(yīng)用。雖然Visual Studio 7掩蓋了內(nèi)在的SOAP協(xié)議,但我希望本文有助于理解SOAP的操作過(guò)程。
下面是客戶(hù)端VB代碼:
VB Client Code
Sub Main()
Dim objHTTP As New MSXML.XMLHTTPRequest
Dim strEnvelope As String
Dim strReturn As String
Dim objReturn As New MSXML.DOMDocument
Dim dblTax As Double
Dim strQuery As String
'創(chuàng)建SOAP封裝
strEnvelope = _
"<soap:envelope xmlns:soap=""urn:schemas-xmlsoap-org:soap.v1"">" & _
"<soap:header></soap:header>" & _
"<soap:body>" & _
"<m:getsalestax xmlns:m=""urn:myserver/soap:TaxCalculator"">" & _
"<salestotal>100</salestotal>" & _
"</m:getsalestax>" & _
"</soap:body>" & _
"</soap:envelope>"
'設(shè)定發(fā)往本地服務(wù)器
objHTTP.open "post", "http://localhost/soap.asp", False
'設(shè)定標(biāo)準(zhǔn)SOAP/ XML格式
objHTTP.setRequestHeader "Content-Type", "text/xml"
'設(shè)置調(diào)用函數(shù)頭
objHTTP.setRequestHeader "SOAPMethodName", _
"urn:myserver/soap:TaxCalculator#GetSalesTax"
'SOAP呼叫
objHTTP.send strEnvelope
'取出返回信封
strReturn = objHTTP.responseText
'加載到DOM
objReturn.loadXML strReturn
'查詢(xún)返回值
strQuery = _
"SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"
dblTax = objReturn.selectSingleNode(strQuery).Text
Debug.Print dblTax
End Sub
下面是服務(wù)端ASP代碼(文件名soap.asp,存放在本地服務(wù)器根目錄下):
<%
Set objReq = Server.CreateObject("Microsoft.XMLDOM")
'加載請(qǐng)求到XML DOM
objReq.Load Request
'按照輸入?yún)?shù)查詢(xún)
strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal"
varSalesTotal = objReq.SelectSingleNode(strQuery).Text
'計(jì)算
varSalesTax = varSalesTotal * 0.04
'準(zhǔn)備返回信封
strTmp = _
"<soap:envelope xmlns:soap=""urn:schemas-xmlsoap-org:soap.v1"">" & _
"<soap:header></soap:header>" & _
"<soap:body>" & _
"<m:getsalestaxresponse xmlns:m=""urn:myserver/soap:TaxCalc"">" & _
"<salestax>" & varSalesTax & "</salestax>" & _
"</m:getsalestaxresponse>" & _
"</soap:body>" & _
"</soap:envelope>"
'回寫(xiě)結(jié)果文件
Response.Write strTmp
%>
- office課程播放地址及課程明細(xì)
- Excel Word PPT Access VBA等Office技巧學(xué)習(xí)平臺(tái)
- 將( .accdb) 文件格式數(shù)據(jù)庫(kù)轉(zhuǎn)換為早期版本(.mdb)的文件格式
- 將早期的數(shù)據(jù)庫(kù)文件格式(.mdb)轉(zhuǎn)換為 (.accdb) 文件格式
- KB5002984:配置 Jet Red Database Engine 數(shù)據(jù)庫(kù)引擎和訪問(wèn)連接引擎以阻止對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)的訪問(wèn)(remote table)
- Access 365 /Access 2019 數(shù)據(jù)庫(kù)中哪些函數(shù)功能和屬性被沙箱模式阻止(如未啟動(dòng)宏時(shí))
- Access Runtime(運(yùn)行時(shí))最全的下載(2007 2010 2013 2016 2019 Access 365)
- access vba代碼太長(zhǎng),換行,分行的寫(xiě)法
- VB6 VBA Access真正可用并且完美支持中英文的 URLEncode 與 URLDecode 函數(shù)源碼
- 自定義VB中的urlencode函數(shù),將URL中特殊部分進(jìn)行編碼
- Access 函數(shù)簡(jiǎn)化串接sql字符串,減少符號(hào)導(dǎo)致的書(shū)寫(xiě)錯(cuò)誤
- vba完全關(guān)閉IE瀏覽器及調(diào)用IE瀏覽器的簡(jiǎn)單應(yīng)用
- 利用FollowHyperlink方法打開(kāi)超鏈接提示“無(wú)法下載您要求的信息”的解決方案
- 在access中用代碼打開(kāi)文本框中超鏈接地址
- Activex控件或Dll 在某些電腦無(wú)法正常注冊(cè)的解決辦法(regsvr32注冊(cè)時(shí)卡?。?/a>
- office使用部分控件時(shí)提示“您沒(méi)有使用該ActiveX控件許可的問(wèn)題”的解決方法
- RTF文件(富文本格式)的一些解析
- Access樹(shù)控件(treeview) 64位Office下出現(xiàn)橫向滾動(dòng)條不會(huì)自動(dòng)定位的解決辦法
- Access中國(guó)樹(shù)控件 在win10電腦 節(jié)點(diǎn)行間距太小的解決辦法
- EXCEL 2019 64位版(Office 2019 64位)早就支持64位Treeview 樹(shù)控件 ListView列表等64位MSCOMMCTL.OCX控件下載
- VBA或VB6調(diào)用WebService(直接Post方式)并解析返回的XML
- 早期PB程序連接Sqlserver出現(xiàn)錯(cuò)誤
- MMC 不能打開(kāi)文件C:/Program Files/Microsoft SQL Server/80/Tools/Binn/SQL Server Enterprise Manager.MSC 可能是由于文件不存在,不是一個(gè)MMC控制臺(tái),或者用后來(lái)的MMC版
- sql server連接不了的解決辦法
- localhost與127.0.0.1區(qū)別
- Roych的淺談數(shù)據(jù)庫(kù)開(kāi)發(fā)系列(Sql Server)
- sqlserver 自動(dòng)備份對(duì)備份目錄沒(méi)有存取權(quán)限的解決辦法
- 安裝Sql server 2005 express 和SQLServer2005 Express版企業(yè)管理器 SQLServer2005_SSMSEE
- 金蝶KIS旗艦版 登錄時(shí)“類(lèi)型不匹配”
- access行業(yè)交流QQ群-部分行業(yè)交流群(倉(cāng)庫(kù) 人事 工資 考勤 CRM HRM MRP ERP 等)
- access垃圾分類(lèi)數(shù)據(jù)庫(kù)
- Office提高企業(yè)辦公管理效率
- Access交流網(wǎng)Acccess通用開(kāi)發(fā)平臺(tái)樹(shù)導(dǎo)航出錯(cuò)的解決辦法
- Access交流網(wǎng)Access通用開(kāi)發(fā)平臺(tái)的使用幫助教程及FAQ
- Access采購(gòu)倉(cāng)庫(kù)系統(tǒng)作品源代碼
聯(lián)系人: | 王先生 |
---|---|
Email: | 18449932@qq.com |
QQ: | 18449932 |
微博: | officecn01 |