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