Получить заголовки URL без HTML - PullRequest
0 голосов
/ 30 ноября 2010

Немного странный вопрос.Есть ли способ попросить веб-сервер вернуть только заголовки, а не сам HTML?

Я хочу попросить у сервера URL-адрес и посмотреть, является ли он действительным (не 404/500 / и т. Д.), И следоватьперенаправления (если есть), но не для получения реального содержимого HTML.

Спасибо

  • Желательно способ сделать это в Ruby

Ответы [ 5 ]

5 голосов
/ 30 ноября 2010

используйте HEAD вместо GET или POST

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html Раздел 9,4

2 голосов
/ 30 ноября 2010

Как предложено, проверьте библиотеку Net :: HTTP.

require 'net/http'
Net::HTTP.new('www.twitter.com').request_head('/').class
1 голос
/ 30 ноября 2010

Это именно то, что делает HEAD HTTP-метод.

Для Ruby есть красивый гем, намного более простой, чем низкоуровневый net / http, который позволяет вам выполнять HEAD запросов.

gem install rest-open-uri

затем

irb> require 'rubygems'
=> true
irb> require 'rest-open-uri'
=> true
irb> sio = open("http://stackoverflow.com", :method => :head)
=> #
irb> sio.meta
=> {"expires"=>"Tue, 30 Nov 2010 18:08:47 GMT", "last-modified"=>"Tue, 30 Nov 2010 18:07:47 GMT", "content-type"=>"text/html; charset=utf-8", "date"=>"Tue, 30 Nov 2010 18:08:27 GMT", "content-length"=>"193779", "cache-control"=>"public, max-age=18", "vary"=>"*"}
irb> sio.status
=> ["200", "OK"]

Следует перенаправления.Вы должны спасти SocketError, если хост не существует, или OpenURI :: HTTPError, если файл не существует.

Если вы хотите что-то более мощное, взгляните на Механизация или HTTParty .

0 голосов
/ 22 мая 2015

На самом деле мне пришлось сложить ответ Пантулиса в свой собственный. кажется, что есть два вида URL-адресов, ни одна из них не работала в одиночку, поэтому я сделал

module URI

  def self.online?(uri)
    URI.exists?(uri)
  end

  def self.exists?(uri)
    URI.exists_ver1?(uri)
  end

  def self.exists_ver1?(url)
    @url = url
    ["http://", "https://"].each do |prefix|
      url = url.gsub(prefix, "")
    end

    begin
      code = Net::HTTP.new(url).request_head('/').code
      [2,3].include?(code.to_i/100)
    rescue
      URI.exists_ver2?(@url)
    end
  end


  def self.exists_ver2?(url)
    url = "http://#{url}" if URI.parse(url).scheme.nil?
    return false unless URI.is_a?(url)
    uri = URI(url)
    begin
      request = Net::HTTP.new uri.host
      response= request.request_head uri.path
      #http status code 200s and 300s are ok, everything else is an error
      [2,3].include? response.code.to_i/100
    rescue
      false
    end
  end
end
0 голосов
/ 30 ноября 2010

Используйте Ruby's net / http и метод HEAD, который упоминал Мак. Проверьте ri Net::HTTP#head из командной строки для получения информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...