Web Services with Ruby - SOAP4R
Что такое SOAP?
Протокол простого доступа к объектам (SOAP) - это кроссплатформенный и независимый от языка протокол RPC (Remote Procedure Call), основанный на XML и обычно (но не обязательно) HTTP. Он использует XML для кодирования информации, которая вызывает удаленный вызов процедуры, и HTTP для передачи этой информации по сети от клиентов к серверам и наоборот.
SOAP имеет ряд преимуществ перед другими технологиями, такими как COM, CORBA и т. Д.: Например, его относительно дешевая стоимость развертывания и отладки, его расширяемость и простота использования, а также наличие нескольких реализаций для разных языков и платформ.
Ниже мы познакомитесь с реализацией SOAP для Ruby (SOAP4R).
Руководству по SOAP: https://www.tutorialspoint.com/soap/index.htm
RubyGems — фрэймворк для установки и запаковки Ruby библиотек и приложений.
Writing SOAP4R Servers
SOAP4R поддерживает два разных типа серверов:
CGI/FastCGI based (SOAP::RPC::CGIStub)
Standalone (SOAP::RPC:StandaloneServer)
Следующие шаги связаны с написанием SOAP-сервера.
Step 1 - Наследование класса SOAP :: RPC :: StandaloneServer
Чтобы реализовать свой собственный автономный сервер, вам необходимо написать новый класс, который будет дочерним по отношению к SOAP :: StandaloneServer следующим образом:
class MyServer < SOAP::RPC::StandaloneServer
...............
end
ПРИМЕЧАНИЕ. - Если вы хотите написать сервер на основе FastCGI, вам необходимо использовать
SOAP :: RPC :: CGIStub в качестве родительского класса, остальная часть процедуры останется прежней
Step 2 - Определение Handler Methods (Методы обработчика)
Следующий шаг - написать методы ваших веб-служб, которые вы хотели бы предоставить внешнему миру. Их можно записать как простые методы 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
Step 3 - Expose(раскрыть) Handler Methods
Следующим шагом является добавление наших определенных методов на наш сервер. Метод инициализации используется для предоставления методов обслуживания одним из двух следующих методов:
class MyServer < SOAP::RPC::StandaloneServer
def initialize(*args)
add_method(receiver, methodName, *paramArg)
end
end
Ниже описание параметров:
Чтобы понять использование параметров 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)
])
Step 4 - Start the Server
Заключительный шаг - запустить ваш сервер, создав один экземпляр производного класса и вызвав метод start
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)
myServer.start
Ниже описание параметров:
1 - Имя сервера
Имя сервера, вы можете дать то, что вам больше всего нравится.
2 - urn: ruby: ServiceName
Здесь urn: ruby является постоянным, но вы можете дать уникальное имя ServiceName для этого сервера.
3 - имя хоста
Задает имя хоста, на котором будет слушать этот сервер.
4 - порт
Доступный номер порта, который будет использоваться для веб-службы.
Пример:
Теперь, используя вышеуказанные шаги, давайте напишем один автономный сервер
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&
Writing SOAP4R Clients
Класс SOAP :: RPC :: Driver обеспечивает поддержку написания клиентских приложений SOAP. Здесь описывается этот класс и демонстрируется его использование на основе приложения.
Ниже приведена минимальная информация, которая может потребоваться для вызова службы SOAP.
URL-адрес службы SOAP (URL-адрес конечной точки SOAP).
Пространство имен методов службы (URI пространства имен метода).
Названия методов обслуживания и их параметры.
Теперь мы напишем клиент SOAP, который будет вызывать методы службы, определенные в примере выше, с именами add и div.
Вот основные шаги по созданию клиента SOAP.
Step 1 - Create a SOAP Driver Instance
Мы создаем экземпляр SOAP :: RPC :: Driver, вызывая его новый метод следующим образом:
SOAP :: RPC :: Driver.new (конечная точка, пространство имен, soapAction)
Ниже описание необходимых параметров;
Параметры и описание;
endPoint
URL-адрес SOAP-сервера, к которому необходимо подключиться.
nameSpace
Пространство имен, используемое для всех RPC, выполненных с этим объектом SOAP :: RPC :: Driver.
soapAction
Значение поля SOAPAction заголовка HTTP. Если nil, по умолчанию используется пустая строка ""
Step 2 - Add Service Methods
Чтобы добавить метод службы SOAP к SOAP :: RPC :: Driver, мы можем вызвать следующий метод, используя экземпляр SOAP :: RPC :: Driver:
driver.add_method (имя, * paramArg)
Вот описание параметров:
Параметр и описание:
name
Имя метода удаленной веб-службы.
paramArg
Задает имена параметров удаленных процедур.
Step 3 - Invoke SOAP service (Вызов службы SOAP):
Последний шаг - "выставить счет" (invoice) для службы 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
Further Readings
https://ruby-doc.org/stdlib-2.7.1/libdoc/soap/rdoc/index.html