Приложение веб-сервиса на Ruby - SOAP4R


Что такое SOAP?

Simple Object Access Protocol (SOAP) — это спецификация протокола для обмена данными.

SOAP — это простой протокол на основе XML, который позволяет приложениям обмениваться информацией по HTTP.

Simple Object Access Protocol — это спецификация протокола для обмена данными. Это легковесный, простой протокол на основе XML (подмножество стандартного обобщённого языка разметки), предназначенный для обмена структурированной и фиксированной информацией в Интернете.

Дополнительные руководства по SOAP см. здесь:http://www.w3cschool.cc/soap/soap-tutorial.html。


Установка SOAP4R

SOAP4R был разработан и реализован Хироси Накамура для приложений SOAP на Ruby.

Адрес загрузки SOAP4R:http://raa.ruby-lang.org/project/soap4r/。

Примечание:В вашей среде Ruby этот компонент может быть уже установлен.

В Linux вы также можете использовать gem для установки этого компонента. Команда выглядит так:

gem install soap4r --include-dependencies

Если вы разрабатываете в среде Windows, вам нужно скачать 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; остальная часть программы останется без изменений.

Шаг 2 - Определение методов обработки

Далее мы определяем методы веб-сервиса. Ниже мы определяем два метода: один складывает два числа, а другой делит два числа:

class MyServer < SOAP::RPC::StandaloneServer ............... #Методы обработки 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Объект, содержащий метод с указанным именем метода. Если вы определите сервисный метод в том же классе, этот параметр равен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) ])

Шаг 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-клиентов используется класс SOAP::RPC::Driver. Далее подробно рассмотрим использование класса SOAP::RPC::Driver.

Для вызова службы SOAP требуется следующая информация:

  • URL-адрес службы SOAP (URL конечной точки SOAP)
  • Пространство имен метода сервиса (Method Namespace URI)
  • Имя метода сервиса и информация о параметрах

Далее мы шаг за шагом создадим SOAP-клиент для вызова вышеуказанных SOAP-методов: add и div:

Шаг 1 — Создание экземпляра SOAP-драйвера

Мы можем создать экземпляр класса SOAP::RPC::Driver, чтобы вызвать его метод new, как показано ниже:

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

Ниже приведено описание параметров:

ПараметрОписание
endPointURL-адрес для подключения к SOAP-сервису
nameSpaceПространство имен, используемое для всех RPC-вызовов объекта SOAP::RPC::Driver.
soapActionЗначение поля SOAPAction, используемое в заголовке HTTP. Если это строка "", значение по умолчанию —nil

Шаг 2 — Добавление методов сервиса

Чтобы добавить методы SOAP-сервиса в SOAP::RPC::Driver, можно вызвать следующие методы через экземпляр SOAP::RPC::Driver:

driver.add_method(name, *paramArg)

Ниже приведено объяснение параметров:

ПараметрОписание
nameИмя метода удаленного веб-сервиса
paramArgУкажите параметры удаленной программы

Шаг 3 - Вызов 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

Другие расширения