Mit der start-Methode wird eine Verbindung zum
angegebenen Server hergestellt, die über die lokale Variable
conn referenziert wird. Mit get wird die angegebene
Seite auf den lokalen Rechner übertragen. Das HTTPResponse-Objekt
resp enthält in einer Hashtabelle die HTTP-Header der Antwort
und ermöglicht über die Methode body den Zugriff auf die
eigentliche HTML-Seite.
require 'net/http'
Net::HTTP.start('www.ruby.ch', 80) { |conn|
resp = h.get('/en/rubyhistory.shtml')
puts resp.body # -> Seiteninhalt
puts "-----"
resp.each {|schluessel, wert|
printf "%-20s = %s\n", schluessel, wert
}
Diese Anweisungen liefern auszugsweise:
<html>
<head>
<script language="JavaScript"
src="../interpreter/interpreter.js">
...
</html>
-----
content-type = text/html
date = Mon, 28 May 2001 ...
transfer-encoding = chunked
connection = close
server = Apache-Advanced...
Soll der Inhalt der Seite nur auf die Standardausgabe geschrieben werden, so kann man das Verfahren wesentlich abkürzen:
require 'net/http' Net::HTTP.get_print 'www.ruby.ch', '/'
Möchte man sich per HTTP ein Bild holen, müssen die Daten im body
in eine Datei geschrieben werden. Unter DOS sollte man beachten,
dass hier beim Öffnen
der Datei das Flag "`b"' benutzt wird, da sonst die
Bildinformationen wahrscheinlich zerstört werden.
require 'net/http'
h = Net::HTTP.new('www.ruby.ch', 80)
file='/images/ruby.jpg'
resp=h.get(file, nil)
File.open("/tmp/ruby.jpg", "wb") { |f|
f.print resp.body
}
Um Daten an den Server zu schicken (zum Beispiel ein "`ausgefülltes"'
Formular), empfiehlt es sich, den zu übermittelnden Text URL-gerecht
aufzubereiten. Dies übernimmt die escape-Methode des CGI-Moduls.
require 'net/http'
require 'cgi'
h = Net::HTTP.new("localhost", 80)
resp, body = h.post("/cgi-bin/test_post",
"foo=" + CGI.escape("bar!") +
"&bar=" + CGI.escape("foo, foo & foo"))
Net::HTTP ist (zumindest in Ruby 1.6) nicht
threadsicher. Bei zwei gleichzeitigen Aufrufen
von post kann es zu unerwarteten Nebeneffekten
kommen. Dies kann am einfachsten umgangen werden,
indem jeder Thread sein eigenes HTTP-Objekt verwendet.