English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
SIMPLE OBJECT ACCESS PROTOCOL(SOAP, Simple Object Access Protocol의 약자)는 데이터 교환의 일종의 프로토콜 표준입니다.
SOAP은 XML을 기반으로 한 간단한 프로토콜로, 애플리케이션이 HTTP를 통해 정보를 교환할 수 있게 합니다.
SIMPLE OBJECT ACCESS PROTOCOL은 데이터 교환의 일종의 프로토콜 표준으로, 가벼운, 간단한, XML(표준 일반 마크업 언어의 하위 집합) 기반의 프로토콜로, 웹에서 구조화된 및 고정된 정보를 교환하기 위해 설계되었습니다.
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 支持两种不同的服务类型:
基于 CGI/FastCGI 服务 (SOAP::RPC::CGIStub)
独立服务 (SOAP::RPC:StandaloneServer)
本教程将为大家介绍如何建立独立的 SOAP 服务。步骤如下:
为了实现自己的独立的服务器,你需要编写一个新的类,该类为 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 | 参数名和参数模式 |
为了理解 inout 和 out 参数,考虑以下服务方法,需要输入两个参数: 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
요청 매개변수 설명은 다음과 같습니다:
매개변수 | 설명 |
---|---|
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 &
ruby에서 SOAP::RPC::Driver 클래스를 사용하여 SOAP 클라이언트를 개발합니다.SOAP::RPC::Driver 클래스의 사용 방법을 자세히 설명하겠습니다.
SOAP 서비스 호출에 필요한 정보는 다음과 같습니다:
SOAP 서비스 URL 주소 (SOAP Endpoint URL)
서비스 메서드의 이름 공간 (Method Namespace URI)
서비스 메서드 이름 및 매개변수 정보
이제 우리는 단계별로 SOAP 클라이언트를 생성하여 위의 SOAP 메서드를 호출하는 방법을 설명하겠습니다: add, div:
SOAP::RPC::Driver 클래스를 인스턴스화하여 새 메서드를 호출할 수 있습니다. 다음과 같이 합니다:
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
다음은 매개변수 설명입니다:
매개변수 | 설명 |
---|---|
endPoint | SOAP 서비스의 연결 URL 주소 |
nameSpace | SOAP::RPC::Driver 객체의 모든 RPC에 대한 이름 공간을 지정합니다. |
soapAction | HTTP 헤더의 SOAPAction 필드 값으로 사용됩니다. 문자열이 ""라면 기본적으로 nil |
SOAP::RPC::Driver에 SOAP 서비스 메서드를 추가하려면, 예제 SOAP::RPC::Driver를 사용하여 다음과 같은 메서드를 호출할 수 있습니다:
driver.add_method(name, *paramArg)
다음은 매개변수 설명입니다:
매개변수 | 설명 |
---|---|
name | 원격 웹 서비스의 메서드 이름 |
paramArg | 원격 프로그램의 매개변수를 지정 |
마지막으로 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의 웹 서비스