В этой статье я расскажу как делать POST и GET запросы на сайты, сохранять сессию, а также скачивать файлы, показывая при этом прогресс загрузки.
Программа загрузки файлов с веба.
Необходимые библиотеки:
//Классы для работы с сетью, в том числе и HTTP
using System.Net;
Об интерфейсе говорить я не буду, т.к. все сможете увидеть в исходниках.
необходимые переменные
//Переменная со ссылкой на файл, который будем скачивать
string file_url = "http://www.bestwallpapers.net.ru/private/img/space/017_Space_bestwall.jpg";
//Полный путь к директории, куда будем скачивать (вместе с названием файла)
string saving_path = @"E:\downloaded_image.jpg";
метод загрузки файла
private void Downloader
()
{
//создаем класс для работы с HTTP
using (WebClient wClient =
new WebClient
())
{
//Статус загрузки
label2.
Text =
"Скачивание...";
//Ссылка на скачивание
Uri url =
new Uri
(file_url
);
//Начинаем асинхронную загрузку файла
wClient.
DownloadFileAsync(url, saving_path
);
//Добавляем события: событие завершения загрузки и событие изменения прогресса закачки.
wClient.
DownloadFileCompleted +=
new AsyncCompletedEventHandler
(DownloadFileCompleted
);
wClient.
DownloadProgressChanged +=
new DownloadProgressChangedEventHandler
(DownloadProgressChanged
);
}
}
И обработчики событий
Прогресс загрузки изменен
public void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//Обновляем прогрессбар
dl_progress.Value = e.ProgressPercentage;
}
Загрузка завершена
public void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
label2.Text = "Загрузка завершена.";
}
С закачкой файлов все. Остальное завтра напишу.
Теперь давайте научимся делать POST запросы и при этом сохранять сессию. Делать запросы будем сюда http://frozzeg.no-ip.info/post.php.
Скрипт на этой странице принимает 2 параметра, login и password, а параметр do_login остается пустым, по этому строка POST запроса будет выглядеть так:
login=User&password=nevermind&do_login=
Теперь перейдем к нашей программе.
Вначале подключаем две библиотеки
//Система ввода вывода
using System.IO;
//Работа с сетью
using System.Net;
Класс для хранения сессий
private CookieCollection Cooks =
new CookieCollection
();
И два метода
Авторизация
public string Request_Post
()
{
HttpWebRequest httpWebRequest =
(HttpWebRequest
)WebRequest.
Create("http://frozzeg.no-ip.info/post.php");
// Разрешаем авторедирект
httpWebRequest.
AllowAutoRedirect =
true;
// Создаем для запроса новый контейнер для хранения сессий
httpWebRequest.
CookieContainer =
new CookieContainer
();
// Следующие строки итак понятны
httpWebRequest.
Method =
"POST";
httpWebRequest.
ContentType =
"application/x-www-form-urlencoded";
// Перед тем как заполнять поля формы, текст запроса конвертируем в байты
byte[] ByteQuery =
System.
Text.
Encoding.
ASCII.
GetBytes("login=User&password=nevermind&do_login=");
// Длинна запроса (обязательный параметр)
httpWebRequest.
ContentLength = ByteQuery.
Length;
// Открываем поток для записи
Stream QueryStream = httpWebRequest.
GetRequestStream();
// Записываем в поток (это и есть POST запрос(заполнение форм))
QueryStream.
Write(ByteQuery,
0, ByteQuery.
Length);
// Закрываем поток
QueryStream.
Close();
// Объект с ответом сервера
HttpWebResponse httpWebResponse =
(HttpWebResponse
)httpWebRequest.
GetResponse();
// Присваиваем сессию
httpWebResponse.
Cookies = httpWebRequest.
CookieContainer.
GetCookies(httpWebRequest.
RequestUri);
if (httpWebResponse.
Cookies !=
null)
{
// Добавляем сессию в наш контейнер для дальнейшего использования
Cooks.
Add(httpWebResponse.
Cookies);
}
// Открываем поток для чтения
Stream stream = httpWebResponse.
GetResponseStream();
// Читаем из потока
StreamReader reader =
new StreamReader
(stream
);
// Возвращаем результат запроса
return reader.
ReadToEnd();
}
И запрос с использованием сохраненной ранее сессии
public string Request
()
{
HttpWebRequest httpWebRequest =
(HttpWebRequest
)WebRequest.
Create("http://frozzeg.no-ip.info/post.php");
httpWebRequest.
AllowAutoRedirect =
true;
httpWebRequest.
CookieContainer =
new CookieContainer
();
if (Cooks !=
null)
{
//Добавляем к нашему запросу ранее сохраненную сессию
httpWebRequest.
CookieContainer.
Add(Cooks
);
}
HttpWebResponse httpWebResponse =
(HttpWebResponse
)httpWebRequest.
GetResponse();
httpWebResponse.
Cookies = httpWebRequest.
CookieContainer.
GetCookies(httpWebRequest.
RequestUri);
if (httpWebResponse.
Cookies !=
null)
{
//Обновляем сессию
Cooks.
Add(httpWebResponse.
Cookies);
}
Stream stream = httpWebResponse.
GetResponseStream();
StreamReader reader =
new StreamReader
(stream
);
return reader.
ReadToEnd();
}
Писать я не умею и как излагать материал я не знаю, по этому просто решил написать и прокомментировать код.
А запрос GET я решил не рассматривать, т.к. в любом учебнике есть его примеры.