2012-07-10 34 views
34

Gần đây tôi đã chuyển từ lớp Net: Ruby của Ruby sang chương trình còn lại 1.6.7.Cách xử lý các trường hợp ngoại lệ với Ruby Rest-Client

Tôi thấy việc yêu cầu biểu mẫu trở nên dễ dàng hơn nhiều, nhưng không giống như Net: yêu cầu HTTP, khi khách hàng còn lại nhận được bất kỳ thứ gì ngoài 200, yêu cầu sẽ bị chết. Tôi đã thử đặt một breakpoint trực tiếp sau khi RestClient.get, và nó không bao giờ bị tấn công - vì vậy tôi đang làm điều gì sai.

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 

mà kết quả trong stacktrace này:

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' 

Ai đó có thể cho tôi biết làm thế nào để đánh giá đúng các mã phản hồi và giữ ngoại lệ này xảy ra ...?

Trả lời

49

Xem hướng Exceptions trên http://rubydoc.info/gems/rest-client/

  • cho kết quả mã giữa 200 và 207 một RestClient :: đáp ứng sẽ được trả lại
  • cho kết quả mã 301, 302 hoặc 307 chuyển hướng sẽ được thực hiện nếu yêu cầu là một người nhận hoặc một người đứng đầu
  • cho mã kết quả 303 chuyển hướng sẽ được theo sau và yêu cầu được chuyển thành một số
  • cho các trường hợp khác là RestClient :: Ngoại lệ giữ Respon se sẽ được nâng lên, một lớp ngoại lệ cụ thể sẽ được ném cho mã lỗi bí quyết

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 
17

Cũng trong cùng một tài liệu @wich chỉ ra, bạn có thể vượt qua một khối để RestClient.get như vậy mà nó sẽ không ném một ngoại lệ trên 200 phi mã phản ứng:

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

Hãy xem phần "Kết quả xử lý" phần: http://www.rubydoc.info/gems/rest-client/1.6.7/frames#Result_handling

3
rescue RestClient::ExceptionWithResponse => err 
Các vấn đề liên quan