Классы HttpWebRequest и HttpWebResponse
Платформа .NET Framework для работы с протоколом HTTP предоставляет два основных класса. Один из них отвечает за запрос – класс HttpWebRequest, а другой за ответ – HttpWebResponse.
Приведу пример простой программы, с использованием данных классов, которая получает из интернета указанную страничку:
static void Main()
{
string uri = "http://mycsharp.ru/post/49/2015_03_02_setevoe_programmirovanie_v_si-sharp.html";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd());
Console.ReadLine();
}
Сначала создается объект запроса при помощи статического метода Create класса WebRequest, в который передается адрес запрашиваемого ресурса. При этом возвращаемый объект необходимо привести к типу HttpWebRequest, потому как метод Create возвращает различный объект запроса, основываясь на том, какой URI ему передали, это может быть, как в нашем случае, HTTP запрос, так и запрос к файловой системе (при этом возвращается объект FileWebRequest).
Дальше мы создаем объект ответа HttpWebResponse путем вызова метода GetResponse у объекта запроса (при этом приводим его к типу HttpWebResponse). При вызове этого метода, на сервер отправляется запрос, и в результате мы получаем объект HttpWebResponse который содержит HTTP-заголовки, а также поток, с которого мы можем считать тело ответа.
Дальше создается объект чтения потока StreamReader, в его конструктор передается поток ответа, который возвращает метод GetResponseStream, указываем необходимую кодировку, и выводим данные на экран. В результате мы увидим HTML код запрашиваемой страницы.
Работа с HTTP-заголовками
Для работы с заголовками у обоих классов HttpWebRequest и HttpWebResponseесть свойство Headers (объект типа WebHeaderCollection) которое предоставляет информацию о заголовках запроса и ответа соответственно. Для добавления или установки заголовков используются методы Add и Set. Метод Add принимает один строковый аргумент – заголовок полностью в формате "имя: значение":
request.Headers.Add("Content-Language: en, ru");
Метод Set принимает два строковых аргумента – имя и значение:
request.Headers.Set("Content-Language", "en, ru");
Использовать можно любой из этих методов, но кроме такой "ручной" установки заголовков есть еще возможность задать значения некоторых распространенных заголовков, используя соответствующие свойства в классах HttpWebRequest и HttpWebResponse. Например, установка заголовка Referer:
request.Referer = "http://google.com";
Доступ к конкретному заголовку осуществляется при помощи той же коллекции Headers (коллекция пар имя-значение WebHeaderCollection). В квадратных скобках указываем имя заголовка, и получаем его значение:
Console.WriteLine(response.Headers["date"]); // Tue, 07 Apr 2015 17:29:04 GMT
Считать все заголовки можно так:
foreach(string header in response.Headers)
Console.WriteLine("{0}: {1}", header, response.Headers[header]);
Вывод будет таким:
Content-Length: 77352
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Tue, 07 Apr 2015 17:29:04 GMT
Set-Cookie: ASP.NET_SessionId=3nq4lu3qep3bb3vj2gnhmqdf; path=/; HttpOnly
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
В примерах выше все запросы выполнялись методом "GET".У классов HttpWebRequest и HttpWebResponse есть свойство Method. Для запроса оно по умолчанию установлено как "GET", но его можно изменить, например на "POST", об этом методе и будет следующий урок. Для ответа же это свойство только на чтение.
Домашнее задание
Ваша программа должна выводить в консоль заголовки уроков с главной страницы сайта (те, что в центральной колонке, 8 последних). Кроме этого, я настроил сервер так, что если заголовок user-agent при запросе к главной странице сайта равен значению "lesson34", то в ответ вы получите не главную страницу, а страницу контактов. Установите значение "lesson34" для этого заголовка и убедитесь, что это работает.