Rails – использование интерфейса SOAP другого приложения
-
23-09-2019 - |
Вопрос
У меня есть чистое работающее приложение Rails.
Теперь мне нужно, чтобы он начал общаться с другим приложением (симпа).Это приложение предоставляет то, что предоставляет SOAP-интерфейс, поэтому имеет смысл попытаться его использовать (интерфейс командной строки неполный).
Какие шаги мне следует выполнить?
Какие драгоценные камни/плагины мне следует использовать?
Есть ли у кого-нибудь рабочие руководства/примеры?
Я более или менее знаком с общими концепциями SOAP, но никогда раньше не использовал SOAP.Я понимаю ОТДЫХ.
Решение
РЕДАКТИРОВАТЬ:это устаревший ответ на рельсы 2.x.Для более актуального ответа рекомендую посмотреть рельскаст #290 .Я оставляю этот ответ здесь на случай, если кто-то по какой-то причине все еще использует рельсы 2.x и не может применить то, что там говорит Райан Бейтс.
Я боролся с этим уже несколько дней и думаю, что сам нашел решение.
Самый простой и наиболее активный драгоценный камень, который я смог найти для взаимодействия с SOAP, называется Савон.
Предполагается, что он будет работать с самим Ruby.Вот краткий обзор того, как его использовать с Rails:
Установите драгоценный камень.Самый простой способ — отредактировать конфигурацию/среду и добавить
config.gem "savon"
А затем запустить
rake gems:install
Это должно установить savon вместе с еще парой драгоценных камней.
Затем создайте класс на своем app/models/
каталог (это не обязательно должен быть подкласс ActiveRecord, это просто обычный класс в каталоге ваших моделей)
Если вы похожи на меня, вам следует держаться как можно дальше от XML.Вы можете сделать это, создав такой класс:
class MyWebservice
WSDL = "http://www.theWebSiteWithAService.com/wsdl"
def self.client
@@client ||= Savon::Client.new(WSDL)
end
def self.soap_actions
return client.wsdl.soap_actions
end
def self.invoke(action, parameters)
response = client.send(action) { |soap| soap.body = parameters }
return response.to_hash
end
end
В основном вы будете использовать его для вызова методов.Тип методов, которые вы сможете вызывать, зависит от услуг, предоставляемых «другим сайтом».Представим, что доступны 3 действия – :create_monkey
, :destroy_monkey
& :list_monkeys
.Вы можете убедиться в правильности списка, выполнив это в консоли рельсов:
MyWebservice.soap_actions
=> [:create_monkey, :destroy_monkey, :list_monkeys]
Теперь представьте, что вы хотите вызвать :create_monkey.Сначала вам нужно знать, какие параметры необходимы для этого вызова.Лучшее место для просмотра — сам файл wsdl.Вы должны увидеть что-то вроде этого:
<message name="create_monkey_request">
<part name="name" type="xsd:string"/>
<part name="hair_color" type="xsd:string"/>
</message>
<message name="create_monkey_response">
<part name="status" type="xsd:string"/>
</message>
Итак, он принимает два параметра: name
и hair_color
.На консоли Ruby вы можете вызвать его следующим образом:
MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' }
=> {:status => 'ok'}
В ответ вы получите хэш.В этом случае я получил статус «ОК», но все могло быть гораздо сложнее.
Позже вы можете создать (например) бесстоловая модель называется Monkey
, и определите такие методы, как new
, create
, и т. д., которые используют веб-сервис.
Я опускаю много интересных вещей, таких как безопасность.Но это должно помочь вам начать, если у вас та же проблема, что и у меня.
С уважением!