Net:: HTTP получает исходный код и статус

#ruby

#ruby

Вопрос:

В настоящее время я получаю исходный код страницы с помощью:

 Net::HTTP.get(URI.parse(page.url))
  

Я также хотел бы получить статус HTTP, не делая второго запроса.

Есть ли способ сделать это другим методом? Я просматривал документацию, но, похоже, не могу найти то, что ищу.

Ответ №1:

На мой взгляд, если вам не нужен какой-то реальный низкоуровневый доступ или контроль, вам лучше использовать встроенный Open::URI модуль Ruby:

 require 'open-uri'
io = open('http://www.example.org/') #=> #<StringIO:0x0000010103e240>
body = io.read[0, 50] #=> "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans"
io.status #=> ["200", "OK"]
io.base_uri #=> #<URI::HTTP:0x00000100bf2ad8 URL:http://www.iana.org/domains/example/>
  

Обратите внимание, что выходные данные base_uri отличаются от URL, который я передал. Open::URI выполняет перенаправления для вас, чего Net:: HTTP делать не будет. Это может окупиться с лихвой, если вы добавляете в свой код много случайных URL-адресов и не хотите писать обработчик перенаправления.

Ответ №2:

Извините, на самом деле понял это :).

 ruby-1.9.2-p136 :004 > r = Net::HTTP.get_response(URI.parse('http://badurlexample.com')) 
 => #<Net::HTTPInternalServerError 500 Internal Server Error readbody=true> 
ruby-1.9.2-p136 :005 > r.inspect
 => "#<Net::HTTPInternalServerError 500 Internal Server Error readbody=true>" 
ruby-1.9.2-p136 :006 > r.body
 => "1 Errors:rnLine: 40 - ; expected" 
ruby-1.9.2-p136 :007 >