Запросы методом POST, отправка данных на сервер
Если куки это данные небольших размеров, и передавать их серверу нормально в виде заголовка запросом GET, то данные размеров побольше отправляются при помощи метода POST.
Данные которые обычно отправляются на сервер это, например, логин и пароль при аутентификации, текст комментария, картинка или другой файл и т.д.
А теперь я покажу вам, как делать самый простой POST запрос. Специально для этого урока я создал страничку на сайте, на которой есть форма отправки данных - тектовое поле и кнопка, вы вводите текст, отправляете на сервер, и тот возвращает его в верхнем регистре.
Запускаем Fiddler, делаем на этой страничке отправку данных, и смотрим какой запрос у нас получился. Первое что мы видим, это то, что метод HTTP-запроса уже POST:
POST http://mycsharp.ru/lesson_post.aspx HTTP/1.1
А также появилось тело запроса - всё что отделено от заголовков пустой строкой:
__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwULLTEzNDY
2NDcwOTEPZBYCZg9kFgICAw9kFgQCAw8P
FgIeB1Zpc2libGVoZGQCBQ8PFgIfAGhkZBgCBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3R
CYWNrS2V5X18WAwUjY3RsMDAkTG9naW5WaWV3MSRMb2dpblN0YXR1czIkY3RsM
RDEFI2N0bDAwJExvZ2luVmlldzEkTG9naW5TdGF0dXMyJGN0bDAzBRZjdGwwMCRC
dXR0b25BZGRNZXNzYWdlBRBjdGwwMCRMb2dpblZpZXcxDw9kAgFklPjrncDGuwrKW
9f9BwjvWEd1XX4%3D&__VIEWSTATEGENERATOR=B8D7EBDC&__EVENTVALIDAT
ION=%2FwEdAAaH57zUq1EcgzGHRmNTrPx7g8CfUEZ4x6JEFru5
nuWdjCW%2BqOYM8KaSMijlDwu7G%2FLcsSnZ18juQMuHSVUa%2FyIvHzTcyUMF0
BNvM9WAdwxerE6E1mG5ttYwRKM8%2FHd5iYqdyvbUyTUDQtBYcvYy5Rw1v9nQ
2g%3D%3D&ctl00%24C
ontentPlaceHolder1%24Text=mycsharp_ru&ctl00%24ContentPlaceHolder1%24B
uttonTextToUpper=%D0%9E%D1%82%D0
%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C&ctl00%24email=
%D1%82%D0%B2%D0%BE%D0%B9+e-mail
Это данные, которые отправляются на сервер. Они здесь в формате ключ-значение, и разделяются символом "&". Там же мы видим данные, которые передаются с текстового поля: ctl00%24ContentPlaceHolder1%24Text=mycsharp_ru.
А теперь сделаем такой запрос программно:
public static void Main (string[] args)
{
string uri = "http://mycsharp.ru/lesson_post.aspx";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
// данные для отправки, здесь я изменил значение тектового поля на "http_post"
string postData = "__VIEWSTATE=%2FwEPDwULLTEzNDY
2NDcwOTEPZBYCZg9kFgICAw9kFgQCAw8P
FgIeB1Zpc2libGVoZGQCBQ8PFgIfAGhkZBgCBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3R
CYWNrS2V5X18WAwUjY3RsMDAkTG9naW5WaWV3MSRMb2dpblN0YXR1czIkY3RsM
RDEFI2N0bDAwJExvZ2luVmlldzEkTG9naW5TdGF0dXMyJGN0bDAzBRZjdGwwMCRC
dXR0b25BZGRNZXNzYWdlBRBjdGwwMCRMb2dpblZpZXcxDw9kAgFklPjrncDGuwrKW
9f9BwjvWEd1XX4%3D&__VIEWSTATEGENERATOR=B8D7EBDC&__EVENTVALIDAT
ION=%2FwEdAAaH57zUq1EcgzGHRmNTrPx7g8CfUEZ4x6JEFru5
nuWdjCW%2BqOYM8KaSMijlDwu7G%2FLcsSnZ18juQMuHSVUa%2FyIvHzTcyUMF0
BNvM9WAdwxerE6E1mG5ttYwRKM8%2FHd5iYqdyvbUyTUDQtBYcvYy5Rw1v9nQ
2g%3D%3D&ctl00%24C
ontentPlaceHolder1%24Text=http_post&ctl00%24ContentPlaceHolder1%24B
uttonTextToUpper=%D0%9E%D1%82%D0
%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C&ctl00%24email=
%D1%82%D0%B2%D0%BE%D0%B9+e-mail";
// конвертируем строку в массив байтов
byte[] data = Encoding.UTF8.GetBytes(postData);
// указываем метод запроса POST
request.Method = "POST";
// для POST запроса необходимо указать тип передаваемых данных и размер
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
// записываем в поток запроса данные
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd()); // получаем ответ от сервера - страничка с текстом "HTTP_POST"
reader.Close ();
Console.ReadLine();
}
Здесь всё просто, подготавливаем данные для отправки - переводим их в массив байтов и записываем в поток запроса. Указываем заголовки тип данных, размер данных, указываем что метод запроса POST, и собственно, делаем запрос. Если бы нужно было быть авторизованным, чтобы отправлять данные с этой формы, нужно было бы еще куки добавить в запрос. И еще скажу, что часто сайты требуют чтобы был установлен заголовок UserAgent, иначе не обрабатывают запрос, не важно GET/POST он или другой.
Домашнее задание
Попробуйте добавить комментарий к этому уроку программно, текст комментария - "I did it!". Только попрошу сильно не увлекаться, за спам накажу :) За первые комментарии, которые будут для того, чтобы проанализировать данные запроса не беспокойтесь, буду их подчищать, и пусть текст этого комментария будет "For test". И делайте дз от имени своего пользователя, а не test1111. Успехов!