2016-09-04 12 views
0

Я пытался получить доступ к некоторым сайтам, используя драгоценный камень для отдыха, и я нашел поведение, которое меня озадачивало. Это связано с использованием rest-client с плохим веб-сайтом, в этом случае www.google.com/this_does_not_exist.Net :: HTTP vs. REST Клиентский камень: как они обрабатывают плохие веб-сайты/404

Что я ожидал: Чтобы код работал, и объект ответа будет иметь код ответа 404.

Что на самом деле произошло: Исключено, и код был прерван преждевременно.

Когда я пробовал то же самое с библиотекой Net :: HTTP, я получил ожидаемый результат.

Вопрос: Ожидается ли такое поведение у клиента-отдыха? Если да, как бы вы вернули объект с кодом ответа 404 при использовании с плохими веб-сайтами.

Вот код из моего IRB:

2.2.1 :045 > uri = URI('http://www.google.com') 
=> #<URI::HTTP http://www.google.com> 
2.2.1 :046 > response = Net::HTTP.get_response(uri) 
=> #<Net::HTTPOK 200 OK readbody=true> 
2.2.1 :047 > response.code 
=> "200" 
2.2.1 :048 > uri = URI('http://www.google.com/this_does_not_exist') 
=> #<URI::HTTP http://www.google.com/this_does_not_exist> 
2.2.1 :049 > response = Net::HTTP.get_response(uri) 
=> #<Net::HTTPNotFound 404 Not Found readbody=true> 
2.2.1 :050 > response.code 
=> "404" 
2.2.1 :051 > uri = URI('http://www.google.com') 
=> #<URI::HTTP http://www.google.com> 
2.2.1 :052 > response = RestClient.get('http://www.google.com') 
=> <RestClient::Response 200 "<!doctype h..."> 
2.2.1 :053 > response.code 
=> 200 
2.2.1 :054 > response = RestClient.get('http://www.google.com/this_does_not_exist') 
RestClient::NotFound: 404 Not Found 
    from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/rest-client-2.0.0/lib/restclient/abstract_response.rb:223:in `exception_with_response' 
    from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/rest-client-2.0.0/lib/restclient/abstract_response.rb:103:in `return!' 
    from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/rest-client-2.0.0/lib/restclient/request.rb:860:in `process_result' 
    from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/rest-client-2.0.0/lib/restclient/request.rb:776:in `block in transmit' 
    from /Users/piperwarrior/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:853:in `start' 
    from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/rest-client-2.0.0/lib/restclient/request.rb:766:in `transmit' 
    from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/rest-client-2.0.0/lib/restclient/request.rb:215:in `execute' 
    from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/rest-client-2.0.0/lib/restclient/request.rb:52:in `execute' 
    from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/rest-client-2.0.0/lib/restclient.rb:67:in `get' 
    from (irb):54 
    from /Users/piperwarrior/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>' 
2.2.1 :055 > 

ответ

1

От GitHub README:

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

Так что да, это ожидаемое поведение, объект ответа может быть получен с e.response.

 Смежные вопросы

  • Нет связанных вопросов^_^