English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby 웹 서비스 애플리케이션 SOAP4R

SOAP이 무엇인가요?

SIMPLE OBJECT ACCESS PROTOCOL(SOAP, Simple Object Access Protocol의 약자)는 데이터 교환의 일종의 프로토콜 표준입니다.

SOAP은 XML을 기반으로 한 간단한 프로토콜로, 애플리케이션이 HTTP를 통해 정보를 교환할 수 있게 합니다.

SIMPLE OBJECT ACCESS PROTOCOL은 데이터 교환의 일종의 프로토콜 표준으로, 가벼운, 간단한, XML(표준 일반 마크업 언어의 하위 집합) 기반의 프로토콜로, 웹에서 구조화된 및 고정된 정보를 교환하기 위해 설계되었습니다.

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 Service的方法,如下我们定义两个方法,一个是两个数相加,一个是两个数相除:

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, inoutParam, *paramArg)
   end
end

以下是各参数的说明:

매개변수설명
receiver包含方法名的方法的对象。 如果你在同一个类中定义服务方法,该参数为 self
methodName调用 RPC 请求的方法名。
paramArg参数名和参数模式

为了理解 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)
])

4단계 - 서비스 시작

마지막으로, 파생 클래스를 인스턴스화하여 start 메서드를 호출하여 서비스를 시작합니다:

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

요청 매개변수 설명은 다음과 같습니다:

매개변수설명
ServerName서비스 이름을 선택할 수 있습니다. 좋아하는 이름을 선택하세요.
urn:ruby:ServiceName여기서 urn:ruby 은 고정되어 있지만, 자신의 서비스에 독특한 이름을 부여할 수 있습니다. ServiceName
hostname호스트 이름 지정
port웹 서비스 포트

온라인 예제

다음은 위의 단계를 통해 독립적인 서비스를 생성하는 방법입니다:

온라인 예제

require "soap/rpc/standaloneserver"
 
begin
   class MyServer < SOAP::RPC::StandaloneServer
 
      # 서비스 노출
      def initialize(*args)
         add_method(self, 'add', 'a', 'b')
         add_method(self, 'div', 'a', 'b')
      end
 
      # 핸들러 메서드
      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)

다음은 매개변수 설명입니다:

매개변수설명
endPointSOAP 서비스의 연결 URL 주소
nameSpaceSOAP::RPC::Driver 객체의 모든 RPC에 대한 이름 공간을 지정합니다.
soapActionHTTP 헤더의 SOAPAction 필드 값으로 사용됩니다. 문자열이 ""라면 기본적으로 nil

두 번째 단계 - 서비스 메서드 추가

SOAP::RPC::Driver에 SOAP 서비스 메서드를 추가하려면, 예제 SOAP::RPC::Driver를 사용하여 다음과 같은 메서드를 호출할 수 있습니다:

driver.add_method(name, *paramArg)

다음은 매개변수 설명입니다:

매개변수설명
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)
   
   # 리모트 서비스 메서드 추가
   driver.add_method('add', 'a', 'b')
 
   # 리모트 서비스 메서드 호출
   puts driver.add(20, 30)
rescue => err
   puts err.message
end

위에서는 Ruby의 웹 서비스를 간단히 소개했습니다. 자세히 알고 싶다면 공식 문서를 확인할 수 있습니다:Ruby의 웹 서비스