Iniziamo con Net::HTTP
che permette di accedere alle pagine web via HTTP. Questa libreria offre diverse modalità di accesso che si adattano alle diverse esigenze, ad esempio se si ha la necessità di visualizzare solo il contenuto della pagina basta utilizzare il metodo get_print
che prende come argomenti l'URI del sito e opzionalmente il percorso e la porta:
>> require 'net/http'
>> Net::HTTP.get_print 'www.google.it', '/index.html'
<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style>body,td,a,p,.h{font-family:arial,sans-serif}.h{font-size:20px}.h{color:#3366cc}.q{color:#00c}.ts
...
In alternativa è possibile usare il metodo URI.parse
per estrarre gli argomenti da un URL:
Net::HTTP.get_print URI.parse('http://www.google.it/index.html')
Se si deve accedere ad altre informazioni oltre al contenuto è disponibile il metodo start
che apre una sessione HTTP e passa un oggetto HTTP al blocco associato. Anche start
prende come argomenti l'host e opzionalmente la porta, ad esempio per visualizzare ancora il contenuto della pagina:
require 'net/http' pagina = Net::HTTP.start('www.google.it') do |http| http.get('/index.html') end puts pagina.body
In questo caso oltre al corpo della pagina è possibile accedere ad un gran numero di informazioni riguardanti la sessione HTML aperta, ad esempio:
>> pagina.code => "200" >> pagina.message => "OK" >> pagina.content_type => "text/html" >> pagina.http_version => "1.1"
Per l'elenco completo possiamo utilizzare il comando page.methods
.
Alcune informazioni sono invece disponibili sotto forma di un hash con le seguenti chiavi: cache-control
, date, content-type
, server
, set-cookie
, transfer-encoding
.
Di grande interesse sono i metodi di Net::HTTPHeader
che permettono la gestione degli header attraverso utili metodi dal nome autoesplicativo come each_capitalized
, each_capitalized_name
, each_header
, each_key
, each_name
, each_value
, proxy_basic_auth
, type_params
, urlencode
, basic_auth
, basic_encode
e vari altri.
Ancora un'altra alternativa è rappresentata da Net::HTTP::get_response
che prende gli stessi argomenti ma restituisce un oggetto di tipo Net::HTTPResponse
require 'net/http' pagina = Net::HTTP.get_response('www.google.it', '/index.html') puts pagina.body
Tra i metodi di HTTPResponse
troviamo body_permitted?
, each_response_header
, read_status_line
, response_class
, body
, entity
, inspect
, procdest
, read_body
, read_body_0
e vari altri utili strumenti.
Per eseguire delle richieste HTTPS basta impostare opportunamente alcuni parametri:
require 'net/http' require 'net/https' uri = URI.parse("https://www.trustedcomputinggroup.org/home") richiesta = Net::HTTP.new(uri.host, uri.port) richiesta.use_ssl = true richiesta.verify_mode = OpenSSL::SSL::VERIFY_NONE pagina = richiesta.get("/") puts pagina.body
Per utilizzare HTTPS basta impostare a "true" il flag use_ssl, è inoltre possibile impostare alcune opzioni relative a SSL, ad esempio scegliendo OpenSSL::SSL::VERIFY_NONE
come verify_mode
decidiamo di non fare nessuna verifica.