# He посылать сообщения, которые программа mail2news
# уже отправляла в конференцию ранее (иначе зациклимся).
next if head =~ %r{^X-rubymirror:}
nntp.get_body do |line|
body << line
end
send_mail(head, body)
end
rescue
end
##
#И записать в файл новую отметку.
File.open(Params::LAST_NEWS_FILE, "w") do |f|
f.puts new_last
end unless new_last == last_news
18.2.8. Получение Web-страницы с известным URL
Пусть нам нужно получить HTML-документ из Web. Возможно, вы хотите проверить контрольную сумму и узнать, не изменился ли документ, чтобы послать автоматическое уведомление. А быть может, вы пишете собственный браузер — тогда это первый шаг на пути длиной в тысячу километров.
require "net/http"
begin
h = Net::HTTP.new("www.marsdrive.com", 80) # MarsDrive Consortium
resp, data = h.get("/index.html", nil)
rescue => err
puts "Ошибка: #{err}"
exit
end
puts "Получено #{data.split.size} строк, #{data.size} байтов"
# Обработать...
Сначала мы создаем объект класса HTTP, указывая доменное имя и номер порта сервера (обычно используется порт 80). Затем выполняется операция get
, которая возвращает ответ по протоколу HTTP и вместе с ним строку данных. В примере выше мы не проверяем ответ, но если возникла ошибка, то перехватываем ее и выходим.
Если мы благополучно миновали предложение rescue
, то можем ожидать, что содержимое страницы находится в строке data
. Мы можем обработать ее как сочтем нужным.
Что может пойти не так, какие ошибки мы перехватываем? Несколько. Может не существовать или быть недоступным сервер с указанным именем; указанный адрес может быть перенаправлен на другую страницу (эту ситуацию мы не обрабатываем); может быть возвращена пресловутая ошибка 404 (указанный документ не найден). Обработку подобных ошибок мы оставляем вам.
Следующий раздел окажется в этом смысле полезным. В нем мы представим несколько более простой способ решения данной задачи.
18.2.9. Библиотека Open-URI
Библиотеку Open-URI написал Танака Акира (Tanaka Akira). Ее цель — унифицировать работу с сетевыми ресурсами из программы, предоставив интуитивно очевидный и простой интерфейс.
По существу она является оберткой вокруг библиотек net/http
, net/https
и net/ftp
и предоставляет метод open
, которому можно передать произвольный URI. Пример из предыдущего раздела можно было бы переписать следующим образом:
require 'open-uri'
data = nil
open("http://www.marsdrive.com/") {|f| data = f.read }
puts "Получено #{data.split.size} строк, #{data.size} байтов"
Объект, возвращаемый методом open
( f
в примере выше), — не просто файл. У него есть также методы из модуля OpenURI::Meta
, поэтому мы можем получить метаданные:
uri = f.base_uri # Объект URI с собственными методами доступа.
ct = f.content_type # "text/html"
cs = f.charset # "utf-8"
ce = f.content_encoding # []
Библиотека позволяет задать и дополнительные заголовочные поля, передавая методу open
хэш. Она также способна работать через прокси-серверы и обладает рядом других полезных функций. В некоторых случаях этой библиотеки недостаточно (например, если необходимо разбирать заголовки HTTP, буферизовать очень большой скачиваемый файл, отправлять куки и т.д.). Дополнительную информацию можно найти в онлайновой документации на сайте http://ruby-doc.org.
Эта глава представляет собой введение в сетевое программирование на низком уровне. В частности, приведены простые примеры серверов и клиентов. Мы видели, как написать клиент для существующего сервера, созданного не нами.
Мы рассмотрели также протоколы более высокого уровня, например POP и IMAP для получения почты. Аналогично мы говорили о протоколе отправки почты SMTP. Попутно был продемонстрирован способ кодирования и декодирования вложений в почтовые сообщения. В контексте разработки шлюза между списком рассылки и конференциями мы упомянули о протоколе NNTP.
Настала пора тщательно изучить более узкий вопрос, относящийся к данной теме. В настоящее время один из самых важных видов сетевого программирования — это разработка для Web, которой и посвящена следующая глава.
Глава 19. Ruby и Web-приложения
Как ловко мы сплетаем сеть…
Сэр Вальтер Скотт, «Мармион»
Ruby — универсальный язык, его ни в коей мере нельзя считать исключительно «языком Web». Но, несмотря на это, одно из наиболее типичных его применений — создание приложений (да и вообще инструментов в широком смысле) для Web.
Читать дальше
Конец ознакомительного отрывка
Купить книгу