位置:首頁 > 腳本語言 > Ruby教學 > Ruby Web Services - SOAP4R

Ruby Web Services - SOAP4R

什麼是SOAP ?

簡單對象訪問協議(SOAP)是一個跨平台和語言無關的,基於XML的RPC協議,通常(但不一定)是HTTP。

它使用XML來編碼信息使遠程過程調用,HTTP在網絡上從客戶機到服務器來傳輸信息,反之亦然。

SOAP有幾個優勢超過其他技術,如COM,CORBA等為例,其相對廉價的部署和調試成本,它的可擴展性和易於使用,存在幾種不同的語言和平台實現。

請參閱出簡單的教學了解 SOAP

本教學將熟悉SOAP實現Ruby(SOAP4R)。這是一個基本的教學,所以如果需要深入細節,那麼需要參考其他資源。

安裝SOAP4R:

SOAP4R是由Hiroshi Nakamura編定,可以直接從網上下載Ruby的開發的SOAP實現:

注意:有可能已經安裝了這個組件。

Download SOAP

如果知道 gem 實用工具,那麼可以使用下麵的命令安裝SOAP4R和相關包。

$ gem install soap4r --include-dependencies

如果是在Windows上工作,那麼需要下載一個壓縮文件,從上麵的位置,需要安裝它使用標準的安裝方法運行Ruby的 install.rb.

編寫SOAP4R服務器:

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

  • CGI/FastCGI based (SOAP::RPC::CGIStub)

  • Standalone (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

下麵的參數說明:

參數 描述
receiver The object that contains the methodName method. you define the service methods in the same class as the methodDef method, this parameter isself.
methodName The name of the method that is called due to a RPC request.
paramArg Specifies, when given, the parameter names and parameter modes.

To understand the usage of inout or out parameters, consider the following service method that takes two parameters (inParam and inoutParam), returns one normal return value (retVal) and two further parameters: inoutParam and 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)
])

第4步 - 啟動服務器:

最後一步是通過實例的派生類的一個實例,並調用start方法來啟動服務器。

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

myServer.start

這是必需的參數的描述:

參數 描述
ServerName A server name, you can give what you like most.
urn:ruby:ServiceName Here urn:ruby is constant but you can give a unique ServiceNamename for this server.
hostname Specifies the hostname on which this server will listen.
port An available port number to be used for the web service.

例如:

現在使用上述步驟,讓我們寫一個獨立的服務器:

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

執行時,服務器應用程序開始一個獨立的SOAP服務在localhost上偵聽8080端口的請求。它暴露了一個服務方法:add 和 div ,這需要兩個參數並返回結果。

現在可以運行這個服務器後台如下:

$ ruby MyServer.rb&

編寫SOAP4R客戶端:

SOAP::RPC::Driver 類用於寫入SOAP客戶端應用程序提供支持。本教學將介紹這個類,顯示其使用的應用程序的基礎。

以下是最低要求的信息,需要調用SOAP服務:

  • SOAP服務(SOAP端點URL)

  • service方法(方法命名空間URI)

  • service方法的名稱及其參數

現在我們將編寫一個SOAP客戶端調用服務定義的方法在上麵的例子名稱為add和div。

以下是主要的步驟來創建一個SOAP客戶端:

步驟1 - 創建一個SOAP驅動程序實例:

我們創建一個實例 SOAP::RPC::Driver 通過調用 new 方法如下:

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

這是必需的參數的描述:

參數 描述
endYiibai URL of the SOAP server to connect with.
nameSpace The namespace to use for all RPCs done with this SOAP::RPC::Driver object.
soapAction A value for the SOAPAction field of the HTTP header. If nil this defaults to the empty string ""

第2步 - 添加服務的方法:

要添加到SOAP SOAP服務方法到 SOAP::RPC::Driver 我們可以調用下麵的方法使用 SOAP::RPC::Driver 實例:

driver.add_method(name, *paramArg)

下麵的參數說明:

參數 描述
name The name of the remote web service method.
paramArg Specifies the names of the remote procedures' parameters.

第3步 - 調用SOAP服務:

最後一步是調用SOAP服務使用 SOAP::RPC::Driver 實例如下:

result = driver.serviceMethod(paramArg...)

這裡serviceMethod是實際的Web服務方法和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

進一步閱讀:

前麵已經解釋過基本的Web服務和Ruby的概念。如果想進一步看下麵的鏈接找到更多的細節 Web Services with Ruby.