Подтвердить что ты не робот

Как обрабатывать исключения с Ruby Rest-Client

Недавно я переключился с Ruby Net: HTTP-класс на rest-client 1.6.7.

Мне намного проще формировать запросы, но в отличие от Net: HTTP-запроса, когда клиент-клиент получает что-либо, кроме 200, запрос умирает. Я попытался поставить точку останова непосредственно после RestClient.get, и он никогда не попадает - так что я делаю что-то неправильно.

def get_member_using_card
  resource = "#{@settings_app_uri}api/v1/card/#{self.member_card_num}?token=#{@settings.api_key}"
  response = RestClient.get resource
  if response.code == 200 
    card = JSON.parse(response.body)
    self.customer_id = card['card']['customer_id']
  else
    return 0
  end
end

Что приводит к этой stacktrace:

RestClient::ResourceNotFound - 404 Resource Not Found:
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/abstr
act_response.rb:48:in `return!'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:230:in `process_result'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:178:in `block in transmit'
        /Users/tim/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/http.rb:627:in `start'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:172:in `transmit'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:64:in `execute'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque
st.rb:33:in `execute'
        /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient.rb:68
:in `get'

Может кто-нибудь сказать мне, как правильно оценить код ответа и не делать это исключение...?

4b9b3361

Ответ 1

См. главу Исключения на http://rubydoc.info/gems/rest-client/

  • для кода результатов между 200 и 207 будет возвращен RestClient:: Response
  • для кода результатов 301, 302 или 307 будет выполняться перенаправление, если запрос является получателем или головой.
  • для результирующего кода 303 будет выполняться перенаправление, и запрос преобразуется в get
  • для других случаев будет добавлен RestClient:: Exception, содержащий ответ, будет определен конкретный класс исключений, чтобы узнать коды ошибок

RestClient.get 'http://example.com/resource'
➔ RestClient::ResourceNotFound: RestClient::ResourceNotFound`

begin
  RestClient.get 'http://example.com/resource'
rescue => e
  e.response
end
➔ 404 Resource Not Found | text/html 282 bytes

Ответ 2

Также в той же документации, на которую указывалось @wich, вы можете передать блок RestClient.get таким образом, чтобы он не генерировал исключение для кодов ответов, отличных от 200:

# Don't raise exceptions but return the response
RestClient.get('http://example.com/resource'){|response, request, result| response }

Смотрите раздел "Обработка результатов": http://www.rubydoc.info/gems/rest-client/1.6.7/frames#Result_handling

Ответ 3

rescue RestClient::ExceptionWithResponse => err