Ruby 網路服務



什麼是 SOAP?

簡單物件存取協定(SOAP,全寫為Simple Object Access Protocol)是交換資料的一種協定規範。

SOAP 是一種簡單的基於 XML 的協議,它使應用程式透過 HTTP 來交換資訊。

簡單物件存取協定是交換資料的一種協定規範,是一種輕量的、簡單的、基於XML(標準通用標記語言下的子集)的協議,它被設計成在WEB上交換結構化的和固化的資訊。

更多 SOAP 教學請見:http://www.w3cschool.cc/soap/soap-tutorial.html。


SOAP4R 安裝

SOAP4R 由Hiroshi Nakamura開發實現,用於 Ruby 的 SOAP 應用。

SOAP4R 下載網址:http://raa.ruby-lang.org/project/soap4r/。

注意:你的ruby環境可能已經安裝了該元件。

Linux 環境下你也可以使用gem  來安裝該元件,命令如下:

$ gem install soap4r --include-dependencies

如果你是window環境下開發,你需要下載zip壓縮文件,並執行install.rb來安裝。


SOAP4R 服務

SOAP4R 支援兩種不同的服務類型:

  • 基於CGI/FastCGI 服務(SOAP::RPC:: CGIStub)

  • 獨立服務(SOAP::RPC:StandaloneServer)

本教學將為大家介紹如何建立獨立的SOAP 服務。步驟如下:

第1步- 繼承SOAP::RPC::StandaloneServer

為了實現自己的獨立的伺服器,你需要寫一個新的類,該類為SOAP::RPC ::StandaloneServer 的子類:

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

注意:如果你要寫一個基於FastCGI的伺服器,那麼你需要繼承SOAP::RPC::CGIStub 類,程式的其餘部分將保持不變。

第二步- 定義處理方法

接下來我們定義Web Services的方法,如下我們定義兩個方法,一個是兩個數相加,一個是兩個數相除:

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

   # 处理方法
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

第三步- 公佈處理方法

接下來添加我們在伺服器上定義的方法,initialize方法是公開的,用於外部的連接:

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

以下是各參數的說明:

包含方法名稱的方法的物件。 如果你在同一個類別中定義服務方法,該參數為 呼叫 RPC 請求的方法名稱。 參數名稱與參數模式

為了理解inoutout 參數,考慮以下服務方法,需要輸入兩個參數:inParam 和inoutParam,函數執行完成後傳回三個值:retVal、inoutParam 、 outParam:

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)
])

第四步- 開啟服務

最後我們透過實例化衍生類,並呼叫start 方法來啟動服務:

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

myServer.start

以下是請求參數的說明:

參數描述
##receiver self
methodName
paramArg
##描述服務名,你可以取你喜歡的 Here 指定主機名稱#web 服務連接埠
#參數
ServerName
#urn:ruby:ServiceNameurn:ruby 是固定的,但你可以為你的服務取一個唯一的ServiceName
hostname
port
實例

接下來我們透過以上的步驟,創建一個獨立的服務:

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

#執行以上程序後,就啟動了一個監聽8080 端口的本地服務,並公開兩方法:add 和div。

你可以再後台執行以上服務:

$ ruby MyServer.rb&


SOAP4R 用戶端

ruby 中使用 SOAP::RPC::Driver 類別開發 SOAP 用戶端。接下來我們來詳細看下 SOAP::RPC::Driver 類別的使用。

呼叫SOAP 服務需要以下資訊:

  • SOAP 服務URL 位址(SOAP Endpoint URL)

  • 服務方法的命名空間(Method Namespace URI)

  • 服務方法名稱及參數資訊

接下來我們就一步一步來建立SOAP 用戶端來呼叫以上的SOAP 方法:add 、 div:

第一步- 建立SOAP Driver 實例

我們可以透過實例化SOAP::RPC::Driver 類別來呼叫它的新方法,如下所顯示:

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

以下是參數的描述:

#參數說明連接SOAP 服務的URL  位址
#endPoint
nameSpace命名空間用於SOAP: :RPC::Driver 物件的所有RPC .
soapAction

用於HTTP 頭的SOAPAction 欄位值。如果是字串是"" 則預設為

nil

driver.add_method(name, *paramArg)
以下是參數的說明:參數描述#遠端web服務的方法名稱
#第二步驟- 新增服務方法為 SOAP::RPC ::Driver 新增SOAP 服務方法,我們可以透過實例SOAP::RPC::Driver 來呼叫下列方法:
name
# ######paramArg#########指定遠端程式的參數#############

第三步驟- 呼叫SOAP服務

最後我們可以使用SOAP::RPC::Driver 實例來呼叫SOAP 服務:

result = driver.serviceMethod(paramArg...)

serviceMethod SOAP服務的實際方法名,paramArg為方法的參數列表。

實例

基於上述的步驟,我們可以寫以下的 SOAP 用戶端:

#!/usr/bin/ruby -w

require 'soap/rpc/driver'

NAMESPACE = 'urn:ruby:calculation'
URL = 'http://localhost: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 Services 。 如果你想了解更多可以查看官方文件:Ruby 的 Web Services