SOAP應用介紹

2019-11-12 23:21:00
zstmtony
轉貼
185


如果想了解SOAP到底是什么,就要自己動手建立自己的SOAP標準對象。本文可以幫助你起步。
============================================

簡介
SOAP - 簡單對象處理協議(Simple Object Access Protocol) - 是當前XML開發的熱點。它是微軟新一代Visual Studio的主要角色,是".NET"策略的基礎。如果想用VB 6編制一個有保障的SOAP服務,可以查閱微軟的SOAP工具包(VB)。但如果想了解SOAP到底是什么,就要自己動手建立自己的SOAP標準對象。本文可以幫助你起步。

本文中,我們創建一個簡單的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文件里有調用的函數名和相應的參數:
      <GetSalesTax>
          <SalesTotal>100</SalesTotal>
      <GetSalesTax>

為確保服務器能夠識別和解釋客戶請求,呼叫指令被包裝到一個稱之為SOAP信封的大文件里。這個信封使用的是SOAP封裝標準的通用命名空間:
      <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>

最后,加入函數調用的命名空間,起到函數聲明的作用:
      <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>

現在,已經準備好客戶請求文件,可以送往服務端了。發送請求很簡單,可以跟瀏覽器表單一樣,用HTTP  post方式。瀏覽器可以向服務端發送復雜的表單,.NET可以向服務器發送VB代碼,但我使用XMLHTTP(IE 5以上版本才能用)。

假設strEnvelope含有XML文件格式的請求,發送格式如下:
      Dim objHTTP As New MSXML.XMLHTTPRequest
      Dim strEnvelope As String

      '設定發往本地服務器
      objHTTP.open "post", "http://localhost/soap/soap.asp"

      '設定標準SOAP/ XML文件頭格式
      objHTTP.setRequestHeader "Content-Type", "text/xml"

      '設置呼叫函數請求
      objHTTP.setRequestHeader "SOAPMethodName", _
          "urn:myserver/soap:TaxCalc#GetSalesTax"

      '呼叫SOAP
      objHTTP.send strEnvelope

      '取得返回值
      strReturn = objHTTP.responseBody

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

服務端
服務端要能夠接收客戶發出的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"參數,并將函數標記名標為回應:
      <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>

可以用字符串方式構造這個回應文件,也可以創建一個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 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
       
        '創建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>"
       
        '設定發往本地服務器
        objHTTP.open "post", "http://localhost/soap.asp", False
       
        '設定標準SOAP/ XML格式
        objHTTP.setRequestHeader "Content-Type", "text/xml"
       
        '設置調用函數頭
        objHTTP.setRequestHeader "SOAPMethodName", _
          "urn:myserver/soap:TaxCalculator#GetSalesTax"
       
        'SOAP呼叫
        objHTTP.send strEnvelope
       
        '取出返回信封
        strReturn = objHTTP.responseText
       
        '加載到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 = _
      "<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>"

      '回寫結果文件
      Response.Write strTmp
      %>

分享
北京十一选五基本走势