Ruby Web 服務 - SOAP4R



什麼是 SOAP?

簡單物件訪問協議 (SOAP) 是一種跨平臺且與語言無關的基於 XML 的 RPC 協議,通常(但並非總是)基於 HTTP。

它使用 XML 編碼進行遠端過程呼叫的資訊,並使用 HTTP 透過網路在客戶端和伺服器之間傳輸這些資訊。

與其他技術(如 COM、CORBA 等)相比,SOAP 具有若干優勢:例如,其相對較低的部署和除錯成本、其可擴充套件性和易用性,以及針對不同語言和平臺的多種實現。

請參考我們簡單的教程 SOAP 以詳細瞭解它。

本章使您熟悉 Ruby 的 SOAP 實現 (SOAP4R)。這是一個基本的教程,因此,如果您需要深入瞭解,則需要參考其他資源。

安裝 SOAP4R

SOAP4R 是由 Nakamura Hiroshi 開發的 Ruby 的 SOAP 實現,可以從以下地址下載 -

注意 - 您很有可能已經安裝了此元件。

Download SOAP

如果您熟悉 gem 工具,則可以使用以下命令安裝 SOAP4R 和相關軟體包。

$ gem install soap4r --include-dependencies

如果您在 Windows 上工作,則需要從上述位置下載一個壓縮檔案,並需要使用標準安裝方法透過執行ruby install.rb來安裝它。

編寫 SOAP4R 伺服器

SOAP4R 支援兩種不同型別的伺服器 -

  • 基於 CGI/FastCGI (SOAP::RPC::CGIStub)
  • 獨立伺服器 (SOAP::RPC:StandaloneServer)

本章詳細介紹瞭如何編寫獨立伺服器。編寫 SOAP 伺服器涉及以下步驟。

步驟 1 - 繼承 SOAP::RPC::StandaloneServer 類

要實現您自己的獨立伺服器,您需要編寫一個新類,該類將作為SOAP::StandaloneServer的子類,如下所示 -

class MyServer < SOAP::RPC::StandaloneServer
  ...............
end

注意 - 如果您想編寫基於 FastCGI 的伺服器,則需要將SOAP::RPC::CGIStub作為父類,其餘步驟將保持不變。

步驟 2 - 定義處理程式方法

第二步是編寫您希望公開給外部世界的 Web 服務方法。

它們可以編寫為簡單的 Ruby 方法。例如,讓我們編寫兩個方法來新增兩個數字和除以兩個數字 -

class MyServer < SOAP::RPC::StandaloneServer
   ...............

   # Handler methods
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

步驟 3 - 公開處理程式方法

下一步是將我們定義的方法新增到我們的伺服器中。initialize方法用於使用以下兩種方法之一公開服務方法 -

class MyServer < SOAP::RPC::StandaloneServer
   def initialize(*args)
      add_method(receiver, methodName, *paramArg)
   end
end

以下是引數的說明 -

序號 引數及描述
1

接收者

包含 methodName 方法的物件。您在與 methodDef 方法相同的類中定義服務方法,此引數為self

2

方法名稱

由於 RPC 請求而呼叫的方法的名稱。

3

引數

指定(如果給出)引數名稱和引數模式。

要了解inoutout引數的用法,請考慮以下服務方法,該方法採用兩個引數(inParam 和 inoutParam),返回一個正常的返回值(retVal)以及另外兩個引數:inoutParamoutParam -

def aMeth(inParam, inoutParam)
   retVal = inParam + inoutParam
   outParam = inParam . inoutParam
   inoutParam = inParam * inoutParam
   return retVal, inoutParam, outParam
end

現在,我們可以公開此方法,如下所示 -

add_method(self, 'aMeth', [
   %w(in inParam),
   %w(inout inoutParam),
   %w(out outParam),
   %w(retval return)
])

步驟 4 - 啟動伺服器

最後一步是透過例項化派生類的一個例項並呼叫start方法來啟動伺服器。

myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)

myServer.start

以下是所需引數的說明 -

序號 引數及描述
1

伺服器名稱

伺服器名稱,您可以隨意命名。

2

urn:ruby:ServiceName

這裡urn:ruby是常量,但您可以為此伺服器提供唯一的 ServiceName 名稱。

3

主機名

指定此伺服器將監聽的主機名。

4

要用於 Web 服務的可用埠號。

示例

現在,使用上述步驟,讓我們編寫一個獨立伺服器 -

require "soap/rpc/standaloneserver"

begin
   class MyServer < SOAP::RPC::StandaloneServer

      # Expose our services
      def initialize(*args)
         add_method(self, 'add', 'a', 'b')
         add_method(self, 'div', 'a', 'b')
      end

      # Handler methods
      def add(a, b)
         return a + b
      end
      def div(a, b) 
         return a / b 
      end
end
   server = MyServer.new("MyServer", 
            'urn:ruby:calculation', 'localhost', 8080)
   trap('INT){
      server.shutdown
   }
   server.start
rescue => err
   puts err.message
end

執行後,此伺服器應用程式在localhost上啟動一個獨立的 SOAP 伺服器,並在8080 上監聽請求。它公開了兩個服務方法,adddiv,它們接受兩個引數並返回結果。

現在,您可以如下所示在後臺執行此伺服器 -

$ ruby MyServer.rb&

編寫 SOAP4R 客戶端

SOAP::RPC::Driver類提供對編寫 SOAP 客戶端應用程式的支援。本章介紹了此類,並根據應用程式演示了其用法。

以下是呼叫 SOAP 服務所需的最低限度資訊 -

  • SOAP 服務的 URL(SOAP 端點 URL)。
  • 服務方法的名稱空間(方法名稱空間 URI)。
  • 服務方法的名稱及其引數。

現在,我們將編寫一個 SOAP 客戶端,它將呼叫上面示例中定義的服務方法,名為adddiv

以下是建立 SOAP 客戶端的主要步驟。

步驟 1 - 建立 SOAP 驅動程式例項

我們透過呼叫其 new 方法建立SOAP::RPC::Driver的例項,如下所示 -

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

以下是所需引數的說明 -

序號 引數及描述
1

端點

要連線的 SOAP 伺服器的 URL。

2

名稱空間

為此 SOAP::RPC::Driver 物件完成的所有 RPC 使用的名稱空間。

3

soapAction

HTTP 標頭的 SOAPAction 欄位的值。如果為 nil,則預設為空字串 ""。

步驟 2 - 新增服務方法

要將 SOAP 服務方法新增到SOAP::RPC::Driver,我們可以使用SOAP::RPC::Driver例項呼叫以下方法 -

driver.add_method(name, *paramArg)

以下是引數的說明 -

序號 引數及描述
1

名稱

遠端 Web 服務方法的名稱。

2

引數

指定遠端過程的引數名稱。

步驟 3 - 呼叫 SOAP 服務

最後一步是使用SOAP::RPC::Driver例項呼叫 SOAP 服務,如下所示 -

result = driver.serviceMethod(paramArg...)

這裡serviceMethod是實際的 Web 服務方法,paramArg...是要傳遞給服務方法的引數列表。

示例

根據上述步驟,我們將編寫一個 SOAP 客戶端,如下所示 -

#!/usr/bin/ruby -w

require 'soap/rpc/driver'

NAMESPACE = 'urn:ruby:calculation'
URL = 'https://:8080/'

begin
   driver = SOAP::RPC::Driver.new(URL, NAMESPACE)
   
   # Add remote sevice methods
   driver.add_method('add', 'a', 'b')

   # Call remote service methods
   puts driver.add(20, 30)
rescue => err
   puts err.message
end

進一步閱讀

我已經向您解釋了 Ruby Web 服務的非常基本的概念。如果您想進一步深入研究,則可以透過以下連結找到有關Ruby Web 服務的更多詳細資訊。

廣告

© . All rights reserved.