Сетевые потоки
Среди областей, в которых особенно наглядно проявляются возможности абстрактной модели потока, особое место занимает пересылка информации в Интернете. Работа с низкоуровневым кодом HTML и XML почти не требует усилий со стороны программиста. Хотя в этом разделе мы сможем дать лишь общее представление об этой важной теме и о задействованных пространствах имен, по крайней мере вы увидите, как потоковая интерпретация сетевых данных реализуется на практике. В рассмотренном ниже примере мы передаем информацию на web-сайт и получаем непосредственный HTML-код новой страницы в качестве результата запроса. Анализ полученного HTML-кода приносит нужную информацию.
Мы не смогли устоять перед искушением: наше маленькое приложение обращается на сайт Amazon.com и возвращает текущие сведения о количестве проданных экземпляров нашей книги. Обобщенный алгоритм выглядит следующим образом:
- Создать объект URL (Universal Resource Locator) передачей строкового параметра конструктору класса URI.
- Передать объект URL методу Create класса HttpWebRequest, чтобы инициировать выдачу запроса HTTP.
- Вызвать метод GetResponse класса HttpWebRequest и получить поток.
- Проанализировать полученный поток, содержащий HTML-код, и извлечь из него нужную информацию, для чего необходимо знать структуру страницы. Кстати, это одна из причин, по которым для получения данных удобнее использовать web-службы: если Amazon неожиданно сменит структуру своих страниц, наше приложение перестанет работать.
В данном случае страница генерируется следующей строкой запроса, которая и будет использована для создания объекта URI (в конце строки приведен номер ISBN нашей книги): http://www.amazon.com/exec/obidos/ASIN/1893115992.
Следующий конструктор создает экземпляр класса с номером ISBN, переданным в виде строкового параметра:
Public Sub New(ByVal ISBN As String) m_URL ="http://wvM.amazon.com/exec/obidos/ASIN/" & ISBN End Sub
Доступное только для чтения свойство GetRank нашего класса просто вызывает закрытую функцию, основной код которой приведен в следующих восьми строках:
1 Dim theURL As New URL(m_URL) 2 Dim theRequest As WebRequest 3 theRequest = WebRequest.Create(theURL) 4 Dim theResponse As WebResponse 5 theResponse = theRequest.GetResponse 6 Dim aReader As New StreamReader(theResponse.GetResponseStream()) 7 Dim theData As String. 8 theData = aReader.ReadToEnd
В строке 1 создается объект класса URL. В строках 2 и 3 генерируется web-запрос, передаваемый на сайт Amazon.com. Строки 4 и 5 принимают ответ на запрос, а в строке 6 метод GetResponseStream класса Response конструирует объект StreamReader для полученного потока. На этой стадии строковая переменная theData содержит низкоуровневый HTML-код web-страницы нашей книги.
<font face=verdana.arial.helvetica size=-1> <b>Amazon.com Sales Rank:</b> 5.776 </font><br>