XML SOAP應用簡介

2021-09-08 06:08:19 字數 4506 閱讀 6831

簡介

soap - 簡單物件處理協議(****** object

本文中,我們建立乙個簡單的soap服務端和乙個客戶端。服務端用

asp編寫,名為soap.asp。這個檔案應存放在個人web伺服器的根目錄下,如:\inetpub\wwwroot。這個伺服器將接受和處理客戶端提出的soap請求。客戶端是乙個簡單的vb可執行檔案,由sub main()啟動。 步驟

眾所周知,soap是乙個「呼叫-響應」機制,按客戶/服務方式執行。客戶端(應用程式)向服務端(位於網際網路上的某個web伺服器)發出函式呼叫請求並傳遞引數;服務端則返回響應。呼叫與響應的內容和資料都是按xml檔案格式進行傳送的。因此,要建立乙個簡單的soap應用系統,就要建立乙個客戶端和乙個服務端,即乙個呼叫-響應體系。

下面是乙個簡單例子:

我們建立乙個服務端來計算銷售交易的稅款。按照傳統的vb術語,即建立乙個函式,定義如下:

public function getsalestax(byval psalestotal as double) as double

getsalestax = psalestotal * 0.04

end function

乙個粗糙的函式,但可作為示例(本例只能用於稅率為4%的地方)。

這個函式定義了乙個函式名(getsalestax),乙個引數(psalestotal – 銷售金額)和乙個返回值(函式返回值)。按照物件導向原則,可以認為psalestotal是乙個"in"引數,getsalestax返回值是乙個"out"引數。因此我們的soap服務端就要偵聽客戶發出的呼叫getsalestax的請求和傳遞的"in"引數(銷售金額),然後返回帶有"out"引數的回應,向客戶返回所需稅款。

客戶端下面是用vb建立乙個呼叫服務的客戶端程式:

dblsalestax = getsalestax(100)

得到返回值$4。

如果getsalestax函式是乙個外部物件,比如在mts伺服器上,就要呼叫伺服器上的dll模組:

dim objtax as new ctaxcalc

dblsalestax = objtax.getsalestax(100)

在soap系統中,遠端呼叫的方式略有不同,呼叫是通過xml檔案傳送到伺服器的。xml檔案裡有呼叫的函式名和相應的引數:

100為確保伺服器能夠識別和解釋客戶請求,呼叫指令被包裝到乙個稱之為soap信封的大檔案裡。這個信封使用的是soap封裝標準的通用命名空間:

100

最後,加入函式呼叫的命名空間,起到函式宣告的作用:

100

現在,已經準備好客戶請求檔案,可以送往服務端了。傳送請求很簡單,可以跟瀏覽器表單一樣,用http  post方式。瀏覽器可以向服務端傳送複雜的表單,.net可以向伺服器傳送vb**,但我使用xmlhttp(ie 5以上版本才能用)。

假設strenvelope含有xml檔案格式的請求,傳送格式如下:

'設定發往本地伺服器

'設定標準soap/ xml檔案頭格式

'設定呼叫函式請求

'呼叫soap

'取得返回值

至此,客戶端完成了向服務端傳送請求的過程。現在回到服務端,看看服務端如何偵聽客戶請求並作出響應。

服務端服務端要能夠接收客戶發出的http請求,在本地伺服器(http://localhost/soap.asp)接收到客戶請求時作出回應。因此服務端要能夠解析客戶端發出的xml格式(soap封裝)的請求,取出呼叫的函式名和引數。

服務端檔案是soap.asp,它接收客戶請求的做法是:

set objreq = server.createobject("microsoft.xmldom")

objreq.load request

然後用xsl樣式從封裝的xml檔案中取出引數:

strquery = "soap:envelope/soap:body/m:getsalestax/salestotal"

varsalestotal = objreq.selectsinglenode(strquery).text

根據引數計算稅款:

varsalestax = varsalestotal * 0.04

在將結果返回給客戶之前,要按soap標準做格式化封裝。過程與客戶端類似,只是把"in"引數改換為"out"引數,並將函式標記名標為回應:

4

可以用字串方式構造這個回應檔案,也可以建立乙個dom物件,增加乙個節點。

檔案返回給客戶後,客戶經過解碼就能得到結果:

dim objreturn as new msxml.domdocument

objreturn.loadxml strreturn

strquery = _

"soap:envelope/soap:body/m:getsalestaxresponse/salestax"

dbltax = objreturn.selectsinglenode(strquery).text

這樣就完成了乙個簡單的soap服務應用。雖然visual studio 7掩蓋了內在的soap協議,但我希望本文有助於理解soap的操作過程。

下面是客戶端vb**:

vb client code

sub main()

dim strreturn as string

dim objreturn as new msxml.domdocument

dim dbltax as double

dim strquery as string

'建立soap封裝

strenvelope = _

"" & _

"" & _

"" & _

"" & _

"100" & _

"" & _

"" & _ ""

'設定發往本地伺服器

'設定標準soap/ xml格式

'設定呼叫函式頭

'soap呼叫

'取出返回信封

'載入到dom

objreturn.loadxml strreturn

'查詢返回值

strquery = _

"soap:envelope/soap:body/m:getsalestaxresponse/salestax"

dbltax = objreturn.selectsinglenode(strquery).text

debug.print dbltax

end sub

下面是服務端

asp**(檔名soap.asp,存放在本地伺服器根目錄下):

<%

set objreq = server.createobject("microsoft.xmldom")

'載入請求到xml dom

objreq.load request

'按照輸入引數查詢

strquery = "soap:envelope/soap:body/m:getsalestax/salestotal"

varsalestotal = objreq.selectsinglenode(strquery).text

'計算varsalestax = varsalestotal * 0.04

'準備返回信封

strtmp = _

"" & _

"" & _

"" & _

"" & _

"" & varsalestax & "" & _

"" & _

"" & _ ""

'回寫結果檔案

response.write strtmp

%> 

XMLSOAP應用簡介

本文中,我們建立乙個簡單的soap服務端和乙個客戶端。服務端用asp編寫,名為soap.asp。這個檔案應存放在個人web伺服器的根目錄下,如 inetpub wwwroot。這個伺服器將接受和處理客戶端提出的soap請求。客戶端是乙個簡單的vb可執行檔案,由sub main 啟動。步驟眾所周知,s...

redis簡介及應用

一.mysql事務 原子性 乙個事務是不可分割的整體,執行操作時就是一起做,或者一起都不做 一致性 意思是張三給李四轉了100元,李四就必須加100元 隔離性 意思是寫資料是隔離開 永續性 意思是資料庫的改變不能返回,改了就改了 redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執...

Git 簡介及應用

git 是乙個開源的分布式版本控制系統,用於敏捷高效地處理任何或小或大的專案。在使用 git前我們需要先安裝 git。git 目前支援 linux unix solaris mac和 windows 平台上執行。在windows環境下安裝工git可以參考git的安裝教程 安裝好git 後,就要配置g...