Нужна помощь с обработкой Timeout :: Ошибка в Savon - PullRequest
0 голосов
/ 09 мая 2019

Я строю соединение между REST-API и SOAP API в Ruby (без Rails). Для вызовов SOAP я использую гем Savon, и это здорово.

Однако я не могу понять из документов , как Савон справляется с Timeout::Error?

Поднимает ли Savon::HTTPError или Savon::SOAPFault?

Пожалуйста, сообщите.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Мне было любопытно. После небольшого количества экспериментов и просмотра источников Savon кажется, что ошибки транспортного уровня не обрабатываются и не переводятся в собственные типы исключений Savon, а выдаются «как есть», поэтому, если вам нужно обработать их, вы должны обработать выданные исключения базовой клиентской библиотекой HTTP.

Важно отметить, что Savon поддерживает несколько HTTP-клиентов на уровне абстракции httpi . По умолчанию он просто выбирает один из доступных, но если вам нужно обработать его исключения, вам не следует полагаться на автоматический выбор, а явно указать, какой HTTPI-адаптер следует использовать (например, HTTPI.adapter = :net_http).

Приведенный ниже код можно использовать для проверки сценария тайм-аута с HTTPI-адаптером по вашему выбору.

Код для экспериментов

Сервер (написан на PHP, потому что не существует современных рабочих решений для написания такого простого и простого SOAP-сервера, как этот, без тонны шаблонного кода в Ruby ):

<?php
// simple SOAP server - run with 'php -S localhost:12312 name_of_this_file.php'
class SleepySoapServer
{
    public function hello()
    {
        sleep(3600); // take an hour's nap before responding

        return 'Hello, world!';
    }
}

$options = array('uri' => 'http://localhost:12312/');
$server = new SoapServer(null, $options);
$server->setClass(SleepySoapServer::class);
$server->handle();

Клиент (с использованием Savon 2):

require 'savon'

HTTPI.adapter = :net_http # request Net::HTTP client from the standard library

uri = 'http://localhost:12312'
client = Savon.client do
  endpoint uri
  namespace uri
end

response = client.call :Hello
p response.body
0 голосов
/ 09 мая 2019

Если вы не хотите спасать ошибки, вот как вы можете сказать Савону, чтобы они не возникали

Savon.configure do |config|
  config.raise_errors = false 
end
...