next up previous contents index
Search Next: POP3 und SMTP Up: Netzwerkprotokolle Previous: FTP   Contents   Index

HTTP

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', '/'


\epsfig{height=36pt,file=images/chan.eps}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
}
\epsfig{height=10pt,file=images/ruby.eps}

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"))


\epsfig{height=36pt,file=images/chan.eps}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. \epsfig{height=10pt,file=images/ruby.eps}



Footnotes

...File!"wb"[*]
File.new(name,"wb")

next up previous contents index
Search Next: POP3 und SMTP Up: Netzwerkprotokolle Previous: FTP   Contents   Index
(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20