English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Простая объектная модель доступа (SOAP, полное название Simple Object Access Protocol) - это протокол спецификация для обмена данными.
SOAP - это протокол, основанный на XML, который позволяет приложениям обмениваться информацией через HTTP.
Простая объектная модель доступа (SOAP) - это протокол спецификация для обмена данными, представляющая собой легковесный и простой протокол, основанный на XML (подмножество общего языка маркировки), который спроектирован для обмена структурированной и фиксированной информацией в Интернете.
SOAP4R был разработан и реализован Hiroshi Nakamura и предназначен для использования в SOAP приложениях на Ruby.
Адрес скачивания SOAP4R:http://raa.ruby-lang.org/project/soap4r/.
Внимание:Вашему ruby-environnement может уже быть установлен этот компонент.
В Linux-среде вы также можете использовать gem для установки этого компонента, команда такая:
gem install soap4r --include-dependencies
Если вы разрабатываете под Windows, вам нужно загрузить архив 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, methodName, *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 # Expose our service 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 &
Разработка SOAP-клиента с использованием класса SOAP::RPC::Driver в ruby. Давайте рассмотрим использование класса SOAP::RPC::Driver более подробно.
Для вызова SOAP-сервиса необходимы следующие данные:
Адрес URL SOAP-сервиса (SOAP Endpoint URL)
Пространство имен метода услуги (URI метода пространства имен)
Имя метода услуги и информация о параметрах
Далее мы шаг за шагом создадим SOAP-клиент для вызова вышеуказанных SOAP-методов: add, div:
Мы можем вызвать новый метод, созданный для класса SOAP::RPC::Driver, следующим образом:
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
Вот описание параметров:
Параметры | Описание |
---|---|
endPoint | Адрес URL подключения к SOAP-сервису |
nameSpace | Название пространства имен используется для всех RPC-объектов SOAP::RPC::Driver. |
soapAction | Значение поля SOAPAction для HTTP-заголовка. Если это строка '', то по умолчанию равно nil |
Добавить SOAP-метод для SOAP::RPC::Driver, мы можем вызвать следующий метод через пример SOAP::RPC::Driver:
driver.add_method(name, *paramArg)
Вот описание параметров:
Параметры | Описание |
---|---|
name | Имя метода удаленного web-сервиса |
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
В этом разделе мы только кратко介绍了 Web Service Ruby. Если вы хотите узнать больше, обратитесь к официальной документации:Web Service Ruby