web-dev-qa-db-ja.com

Ruby Rest-Clientで例外を処理する方法

最近、RubyのNet:HTTPクラスからrest-client 1.6.7に切り替えました。

リクエストを作成する方がはるかに簡単ですが、Net:HTTPリクエストとは異なり、rest-clientが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

このスタックトレースの結果:

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'

誰かが応答コードを適切に評価し、この例外が発生しないようにする方法を教えてもらえますか?

37
tpow

http://rubydoc.info/gems/rest-client/ の見出しExceptionsを参照

  • 200〜207の結果コードの場合、RestClient :: Responseが返されます
  • 結果コード301、302、または307の場合、要求がgetまたはheadの場合、リダイレクトが追跡されます
  • 結果コード303の場合、リダイレクトに従い、リクエストはgetに変換されます
  • その他の場合、Responseを保持する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
53
wich

@wichが指している同じドキュメントでも、200以外の応答コードで例外をスローしないように、RestClient.getにブロックを渡すことができます。

# 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

22
Raphael
rescue RestClient::ExceptionWithResponse => err
4
Serhiy Nazarov

発生する可能性のあるいくつかのエラー、Errno :: EHOSTUNREACHなどの特定の例外タイプ、またはより一般的なExceptionWithResponseがあります。 詳細を確認するには、readmeを確認してください .

0
MegaTux