ruby net http




Проверьте ответ HTTP Ruby на успех (2)

Как правильно проверить ответ от Net :: HTTP :: Get (например) для «успеха» (т. Е. Код возврата 2xx)? Документация, похоже, печально умалчивает об этом простом вопросе.

У меня есть:

response=Net::HTTP.new( host, port ).request my_get_request # details not important

После кучи Google и почти случайного ввода текста я наконец решил, что это работает:

response.class < Net::HTTPSuccess

На самом деле это канонический способ сделать это?


Вы можете воспользоваться оператором case Ruby, который идиоматически выполняет сопоставления классов, благодаря использованию === под капотом.

Вот пример из JSON-клиента, который ловит определенные ошибки, но в противном случае просто возвращает сообщение сервера:

  case response
    when Net::HTTPSuccess
      JSON.parse response.body
    when Net::HTTPUnauthorized
      {'error' => "#{response.message}: username and password set and correct?"}
    when Net::HTTPServerError
      {'error' => "#{response.message}: try again later?"}
    else
      {'error' => response.message}
  end

Примечание выше apidock.com/ruby/Net/HTTPResponse (например, Net::HTTPServerError ) тоже работают.


Для Net::HTTP , да, проверка класса объекта ответа - это способ сделать это. Использование kind_of? (но функционально эквивалентно использованию < ):

response.kind_of? Net::HTTPSuccess

Вызывающее value при response также повысит Net::HTTPError если код состояния не был успешным (что плохо названный метод ...).

Если возможно, вы можете захотеть использовать драгоценный камень вместо Net::HTTP , поскольку они часто предлагают лучшие API и производительность. Typhoeus и HTTParty - два хороших, среди прочих .





ruby