English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby Web Service приложение SOAP4R

Что такое SOAP?

Простая объектная модель доступа (SOAP, полное название Simple Object Access Protocol) - это протокол спецификация для обмена данными.

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

Простая объектная модель доступа (SOAP) - это протокол спецификация для обмена данными, представляющая собой легковесный и простой протокол, основанный на XML (подмножество общего языка маркировки), который спроектирован для обмена структурированной и фиксированной информацией в Интернете.

Установка SOAP4R

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

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 - Определение обработчика методов

Далее мы определяем методы Web Service, как мы определяем два метода, один для сложения двух чисел, другой для деления двух чисел:

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)
])

Шаг четвертый - запустить службу

В конце мы создаем экземпляр производного класса и вызываем метод 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 &

Клиент SOAP4R

Разработка SOAP-клиента с использованием класса SOAP::RPC::Driver в ruby. Давайте рассмотрим использование класса SOAP::RPC::Driver более подробно.

Для вызова SOAP-сервиса необходимы следующие данные:

  • Адрес URL SOAP-сервиса (SOAP Endpoint URL)

  • Пространство имен метода услуги (URI метода пространства имен)

  • Имя метода услуги и информация о параметрах

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

Шаг 1 - Создать пример SOAP Driver

Мы можем вызвать новый метод, созданный для класса SOAP::RPC::Driver, следующим образом:

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

Вот описание параметров:

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

Шаг 2 - Добавить метод услуги

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

driver.add_method(name, *paramArg)

Вот описание параметров:

ПараметрыОписание
nameИмя метода удаленного web-сервиса
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

В этом разделе мы только кратко介绍了 Web Service Ruby. Если вы хотите узнать больше, обратитесь к официальной документации:Web Service Ruby