Простой протокол доступа к объектам (SOAP) — это кроссплатформенный и независимый от языка протокол RPC, основанный на XML и, как правило (но не обязательно) HTTP.
Он использует XML для кодирования информации, которая делает удаленный вызов процедуры, и HTTP для передачи этой информации по сети от клиентов к серверам и наоборот.
SOAP имеет ряд преимуществ перед другими технологиями, такими как COM, CORBA и т. Д., Например, его относительно дешевые затраты на развертывание и отладку, его расширяемость и простота использования, а также наличие нескольких реализаций для разных языков и платформ.
Пожалуйста, обратитесь к нашему простому учебнику SOAP, чтобы понять его в деталях.
Эта глава знакомит вас с реализацией SOAP для Ruby (SOAP4R). Это базовый учебник, поэтому, если вам нужны глубокие подробности, вам нужно будет обратиться к другим ресурсам.
Установка SOAP4R
SOAP4R — это реализация SOAP для Ruby, разработанная Хироши Накамурой, которую можно загрузить с:
ПРИМЕЧАНИЕ. — Существует большая вероятность того, что вы уже установили этот компонент.
Download SOAP
Если вам известна утилита gem, вы можете использовать следующую команду для установки SOAP4R и связанных пакетов.
$ gem install soap4r --include-dependencies
Если вы работаете в Windows, вам нужно скачать заархивированный файл из вышеуказанного места и установить его, используя стандартный метод установки, запустив ruby install.rb .
Написание серверов SOAP4R
SOAP4R поддерживает два разных типа серверов —
- На основе CGI / FastCGI (SOAP :: RPC :: CGIStub)
- Автономный (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
Вот описание параметров —
Sr.No. | Параметр и описание |
---|---|
1 |
получатель Объект, который содержит метод methodName. Вы определяете сервисные методы в том же классе, что и метод methodDef, этот параметр является self . |
2 |
имяМетода Имя метода, который вызывается из-за запроса RPC. |
3 |
paramArg Определяет, когда дано, имена параметров и режимы параметров. |
получатель
Объект, который содержит метод methodName. Вы определяете сервисные методы в том же классе, что и метод methodDef, этот параметр является self .
имяМетода
Имя метода, который вызывается из-за запроса 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
Вот описание обязательных параметров —
Sr.No. | Параметр и описание |
---|---|
1 |
Название сервера Имя сервера, вы можете дать то, что вам нравится больше всего. |
2 |
Урна: рубин: ServiceName Здесь urn: ruby является константой, но вы можете дать уникальное имя ServiceName для этого сервера. |
3 |
имя хоста Указывает имя хоста, на котором будет прослушивать этот сервер. |
4 |
порт Доступный номер порта, который будет использоваться для веб-службы. |
Название сервера
Имя сервера, вы можете дать то, что вам нравится больше всего.
Урна: рубин: ServiceName
Здесь urn: ruby является константой, но вы можете дать уникальное имя ServiceName для этого сервера.
имя хоста
Указывает имя хоста, на котором будет прослушивать этот сервер.
порт
Доступный номер порта, который будет использоваться для веб-службы.
пример
Теперь, используя описанные выше шаги, давайте напишем один автономный сервер —
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 на локальном хосте и прослушивает запросы на порте 8080. Он предоставляет один метод обслуживания, add и div , который принимает два параметра и возвращает результат.
Теперь вы можете запустить этот сервер в фоновом режиме следующим образом:
$ ruby MyServer.rb&
Написание клиентов SOAP4R
Класс SOAP :: RPC :: Driver обеспечивает поддержку для написания клиентских приложений SOAP. Эта глава описывает этот класс и демонстрирует его использование на основе приложения.
Ниже приведена минимальная информация, необходимая для вызова службы SOAP.
- URL-адрес службы SOAP (URL-адрес конечной точки SOAP).
- Пространство имен методов службы (URI пространства имен метода).
- Наименования сервисных методов и их параметры.
Теперь мы напишем клиент SOAP, который будет вызывать методы службы, определенные в приведенном выше примере, с именами add и div .
Вот основные шаги для создания клиента SOAP.
Шаг 1. Создание экземпляра драйвера SOAP
Мы создаем экземпляр SOAP :: RPC :: Driver , вызывая его новый метод следующим образом:
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
Вот описание обязательных параметров —
Sr.No. | Параметр и описание |
---|---|
1 |
ENDPOINT URL-адрес сервера SOAP для подключения. |
2 |
NAMESPACE Пространство имен, используемое для всех RPC, созданных с помощью этого объекта SOAP :: RPC :: Driver. |
3 |
SOAPAction Значение для поля SOAPAction заголовка HTTP. Если ноль, то по умолчанию используется пустая строка «». |
ENDPOINT
URL-адрес сервера SOAP для подключения.
NAMESPACE
Пространство имен, используемое для всех RPC, созданных с помощью этого объекта SOAP :: RPC :: Driver.
SOAPAction
Значение для поля SOAPAction заголовка HTTP. Если ноль, то по умолчанию используется пустая строка «».
Шаг 2 — Добавить методы обслуживания
Чтобы добавить метод службы SOAP в SOAP :: RPC :: Driver, мы можем вызвать следующий метод, используя экземпляр SOAP :: RPC :: Driver —
driver.add_method(name, *paramArg)
Вот описание параметров —
Sr.No. | Параметр и описание |
---|---|
1 |
название Имя метода удаленного веб-сервиса. |
2 |
paramArg Определяет имена параметров удаленных процедур. |
название
Имя метода удаленного веб-сервиса.
paramArg
Определяет имена параметров удаленных процедур.
Шаг 3 — вызвать сервис SOAP
Последний шаг заключается в выставлении счета-фактуры на службу SOAP с использованием экземпляра SOAP :: RPC :: Driver следующим образом:
result = driver.serviceMethod(paramArg...)
Здесь serviceMethod — это фактический метод веб-службы, а 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
Дальнейшие чтения
Я объяснил вам только самые основные понятия веб-сервисов с Ruby. Если вы хотите углубиться в детали, перейдите по следующей ссылке, чтобы узнать больше о веб-сервисах с Ruby .