C#   Уроки программирования с нуля. Си-шарп для чайников   C#

Здравствуйте, гость!
Вход
Регистрация


Протокол HTTP, метод POST и куки в Си-шарп
В прошлом уроке были рассмотрены самые простые HTTP-запросы, при помощи которых мы можем получить доступ к общедоступным данным, а в этом уроке мы рассмотрим, как получать авторизованный доступ, а также отправлять данные на сервер.

Для этого урока нам понадобится программа, которая осуществляет сетевой анализ трафика. А конкретно Fiddler, скачать бесплатно вы можете его здесь. Качайте, устанавливайте и запускайте. Эта программа показывает весь ваш веб-трафик (HTTP-запросы). В левой части экрана Fiddler-a размещен список всех запросов, а в правой части информация по запросу, который вы выбрали слева. Сделайте запрос в браузере (например обновите страницу с этим уроком), и после этого вы увидите в списке слева в Fiddler-е много запросов (кроме запроса страницы, там еще запрашиваются скрипты, стили, изображении и т.д, необходимые для страницы), нас будет интересовать запрос именно к этой странице (в Fiddler-e host: mycsharp.ru, url: /post/50/2015_04_19_protokol...), нажмите на этот запрос, и справа отобразится информация о нем. В правой части выберите вкладку с лупой Inspectors, в ней данные разделены на две части, вверху данные запроса, а внизу ответа. Там же есть и разные вкладки, переключитесь на вкладку "Raw" для запроса и ответа, и после этого вам будет видно данные запросов в простом виде, о котором говорилось в прошлом уроке (рисунок 1, нажмите для увеличения). Как использовать эти данные поговорим немного позже, а сейчас немного теории.

окно Fiddler
Рисунок 1 - окно Fiddler


Куки

Думаю все слышали о куках, здесь они нам понадобятся. Куки (кукисы, cookies) - это небольшие данные, которые создаются веб-сервером, и хранятся клиентом (браузером). При каждом обращении клиента к серверу, куки отправляются вместе с HTTP-запросом, и сервер их обрабатывает. Чаще всего куки используются для аутентификации (проверки подлинности) пользователя, для хранения персональных предпочтений клиента, поверхностной идентификации.

Несколько реальных примеров - здесь на сайте, если вы подписались на рассылку я выдаю вам cookie, и когда вижу что, оно у вас есть, скрываю форму для подписки. Также, бывают на сайтах анонимные опросы, которые не требую чтобы вы были авторизованы, там тоже вам выдают cookie, чтобы вы не голосовали несколько раз (но можно ведь просто удалить в браузере эти куки...), и показать вам результат. Ну и для всяких визуальных предпочтений - скрыть комментарии например.

Но в этом уроке нам будет интересно использование куков для аутентификации. Вы ввели на сайте логин и пароль, вошли своим пользователем, и дальше просматриваете сайт от этого пользователя. Без куков вам бы пришлось при каждом переходе на сайте вводить снова логин с паролем, для доступа к авторизованным функциям и данным.

А теперь рассмотрим, как кодом передавать куки, чтобы оставаться авторизованным.

Специально для этого урока я создал пользователя на сайте с логином test1111, пароль 1111. Входим им на сайт, очищаем журнал Fiddler-а (иконка крестик -> remove all), обновляем страницу в браузере, переходим в Fiddler, выбираем запрос к странице которую обновляли, и смотрим заголовки запроса, копируем всю строку заголовка cookie и устанавливаем в коде этот заголовок:

public static void Main (string[] args)
{
  string uri = "http://mycsharp.ru/contacts.aspx";
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

  request.Headers.Add ("Cookie: _ga=GA1.2.187608599.1469356153; _ym_uid=1469356153667699515; ASP.NET_SessionId=3ddh3eu4b2e4exipzik4st5v; _ym_isad=2; _rbu=14694650945817652181; _gat=1; _rbs=14694680424413447723; _ym_visorc_21378790=w; mycsharp=77D035D8FCB046D8E0634DD106BF0E2526E9EC554EAB9EC9E13D670D
D05AD2875C223F597A8C04B4764716EFFDEA857280E5BCBFC822E18EB32A8E593
E51788A0E5DE50A96C3326B413A798AEFDE09E4C5663BD20790DADBF790FAE7B8
202B2D543D7FFB9A1667CF36934005243496E02310FD81");

  HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  Console.WriteLine(reader.ReadToEnd().Contains("test1111"));
  Console.ReadLine();
}


Здесь в конце выводится булевое значение содержит ли строка слово "test1111", этот логин выводится (приветствие слева) лишь если вы авторизированы. Программа выводит true или false, в зависимости от того, установлен ли сookie авторизации. Вот так программно мы можем получать авторизованный доступ на сайтах.
Конечно, не со всеми сайтами это будет работать так просто, к некоторым нужен индивидуальный подход, но в целом, вы знаете куда двигаться.

Запросы методом 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. Успехов!
Понравилась статья? Подпишись на рассылку и узнавай первым о новых уроках по почте!


Поделиться с друзьями:
28 июл 2016 20:53
wegorcag 16 янв 2017 22:02
Простейшая методика заработка от Ольги Арининой

С запуска одной системы вы будете получать доход 2800 рублей в день.
Запускайте 2 системы и ваш доход - 5600 руб в день!

Все подробности у нас на сайте. >> www.robot.zarplatt.ru <<

Ваш первый доход вы гарантированно получите
уже в течение 24 часов после запуска системы!

marinacag 16 янв 2017 13:27
Предлагаю Вам возможность работы (подработки) в интернете, выбирайте самостоятельно более чем из тридцати проверенных вариантов заработка наиболее удобный и близкий Вам.
Все подробности на нашем сайте. >> www.zarplatt.ru <<

legorcag 16 янв 2017 10:38
Срочно требуются работники. Обработка зказов на дому.

Без вложений, на системе автоматического приёма и обработки заказов.

Более подробно здесь >> obrabotka.zarplatt.ru <<

pegorcag 12 янв 2017 23:29
Ведущая компания в России и странах СНГ по продаже авиабилетов «Airline-online»

Крупнейшая международная компания по продаже А/В билетов
срочно набирает сотрудников на постоянную основу для несложной
работы через интернет, с ежедневными выплатами до 11 000 руб.

Работая в нашей компании Вы получаете:

- Соблюдение трудового кодекса
- Полный соцпакет, оплачиваемый отпуск, больничный, санаторий.
- Каждый наш сотрудник на дому гарантированно получает высокий доход. руб. в день.
- Гарантированные стабильные выплаты заработанных денег.
- Выплаты происходят ежедневно на банковские карты или электронные кошельки.

Пройдите регистрацию на нашем сайте. > airline.zarplatt(точка)ru <

Без вложений, опыт и профессиональные навыки не требуются!

wpavelcag 12 янв 2017 20:18
Наш сервис предоставляет настоящие лайки на фотографии заказчиков, которые готовы платить за качество.

Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и получить за это деньги.

Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

достаточно просто зарегистрироваться на нашем сервисе. > www.like.zarplatt.ru <

vegorcag 12 янв 2017 18:30
Теперь Ваш новый график работы будет выглядеть так -
В день вы будете заняты всего 60 минут - остальное время посвящайте себе и своим близким!

Мы гарантируем:
- Первые деньги на вашей карте уже сегодня.
- Обучение. Поддержка учеников пн-птн с 10-18 мск.
- Куратор, который скоординирует ваше обучение.
- Никаких сложных схем!
- Работаете дома, по своему графику.

Все подробности у нас на сайте. ( stabilno.zarplatt.ru )

qegorcag 07 янв 2017 16:39
Теперь Ваш новый график работы будет выглядеть так -
В день вы будете заняты всего 60 минут - остальное время посвящайте себе и своим близким!

Мы гарантируем:
- Первые деньги на вашей карте уже сегодня.
- Обучение. Поддержка учеников пн-птн с 10-18 мск.
- Куратор, который скоординирует ваше обучение.
- Никаких сложных схем!
- Работаете дома, по своему графику.

Все подробности у нас на сайте. ( stabilno.zarplatt.ru )

tpavelcag 07 янв 2017 15:38
Наш сервис предоставляет настоящие лайки на фотографии заказчиков, которые готовы платить за качество.

Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и получить за это деньги.

Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

достаточно просто зарегистрироваться на нашем сервисе. > like.zarplatt.ru <

vegorcag 07 янв 2017 14:55
Ведущая компания в России и странах СНГ по продаже авиабилетов «Airline-online»

Крупнейшая международная компания по продаже А/В билетов
срочно набирает сотрудников на постоянную основу для несложной
работы через интернет, с ежедневными выплатами до 11 000 руб.

Работая в нашей компании Вы получаете:

- Соблюдение трудового кодекса
- Полный соцпакет, оплачиваемый отпуск, больничный, санаторий.
- Каждый наш сотрудник на дому гарантированно получает высокий доход. руб. в день.
- Гарантированные стабильные выплаты заработанных денег.
- Выплаты происходят ежедневно на банковские карты или электронные кошельки.

Пройдите регистрацию у нас на сайте. > airline.zarplatt(точка)ru <

Без вложений, опыт и профессиональные навыки не требуются!

tegorcag 03 янв 2017 20:43
Ведущая компания в России и странах СНГ по продаже авиабилетов «Airline-online»

Крупнейшая международная компания по продаже А/В билетов
срочно набирает сотрудников на постоянную основу для несложной
работы через интернет, с ежедневными выплатами от 11 000 руб.

Работая в нашей компании Вы получаете:

- Соблюдение трудового кодекса
- Полный соцпакет, оплачиваемый отпуск, больничный, санаторий.
- Каждый наш сотрудник на дому гарантированно получает высокий доход. руб. в день.
- Гарантированные стабильные выплаты заработанных денег.
- Выплаты происходят ежедневно на банковские карты или электронные кошельки.

Пройдите регистрацию у нас на сайте. > airline.zarplatt(точка)ru <

Без вложений, опыт и профессиональные навыки не требуются!

28 дек 2016 11:34
I did it!

28 дек 2016 11:33
IDidIT!t

28 дек 2016 11:31
testtt

28 дек 2016 11:31
test

test1111 28 дек 2016 11:27
test

test1111 28 дек 2016 10:37
test

test1111 28 ноя 2016 14:53
For test

guest 17 ноя 2016 12:49
Пишут что непонятно. Мне не понятна эта конструкция:

using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}

guest 17 ноя 2016 12:47
Спасибо за урок!!!

guest 17 ноя 2016 12:43
for test

guest 17 ноя 2016 12:38
For test

Дмитрий 12 ноя 2016 00:35
Thanks for the lessons !

Дмитрий 12 ноя 2016 00:29
I did it

Dmitry1986 12 ноя 2016 00:15
for test

Dmitry1986 12 ноя 2016 00:10
I did it

Dmitry1986 12 ноя 2016 00:08
I did it !

test1111 11 ноя 2016 22:58
I did it!

test1111 11 ноя 2016 22:57
I did it!

test1111 08 ноя 2016 23:40
У меня такая проблема: при добавлении строки заголовка Cookie в код IDE VS2015 ругается. По всей видимости ей не нравится символы ";", коих много в значении Cookie. Помогите!

andrey 08 ноя 2016 06:11
got it!

andrey 08 ноя 2016 06:09
test

Андрей 08 ноя 2016 05:46
хорошие уроки

test1111 30 окт 2016 20:27
222222222222

test1111 30 окт 2016 20:25
test

77777 30 окт 2016 20:22
Необработанное исключение типа "System.Net.WebException" в System.dll

Дополнительные сведения: Удаленный сервер возвратил ошибку: (502) Недопустимый шлюз.

Titovich 26 окт 2016 17:44
I did it!

Amb1 19 окт 2016 17:16
I Did It!

test1111 19 окт 2016 17:07
Look For

test1111 16 окт 2016 12:16
hello

02 окт 2016 20:39
I did it

ro26 02 окт 2016 20:37
For test

Unchhh 26 сен 2016 09:57
I DID IT

Unchhh 26 сен 2016 09:48
For test

Flamingo 20 сен 2016 20:17
Крутые уроки, побольше таких

Flamingo 20 сен 2016 19:59
I Did It

Odis 15 сен 2016 00:11
Выполнил домашнее задание методом тупого копирования кода с минимальными изменениями, но понимания того, что именно я делаю так и не появилось. Если можно, то можно как то более подробно объяснить этот урок?

Odis 15 сен 2016 00:08
Odis did it!

Odis 15 сен 2016 00:06
Вообще ничего не понятно.

Odis 14 сен 2016 23:47
For test

vladpap 05 сен 2016 21:14
For test

Kompoman32 29 авг 2016 16:47
I did it

Kompoman32 29 авг 2016 16:20
For test

ew4abc 17 авг 2016 03:41
Спасибо за хороший урок :) Давно хотел узнать как это делать.

ew4abc 17 авг 2016 03:40
I did it.

ew4abc 17 авг 2016 03:29
For test.

John Cena 12 авг 2016 18:00
I did it.

Jhon Cena 12 авг 2016 17:58
For test.

Gost 12 авг 2016 17:51
Tested successful!

LokPi 12 авг 2016 17:39
Отличный урок. Спасибо!

Dan 10 авг 2016 08:52
I did it

Valentins 02 авг 2016 11:03
For test.

test1111 29 июл 2016 23:41
I did it!


Добавить комментарий:

Имя (обязат.)
E-mail (обязат., не публикуется)


Для вставки ваших программ пользуйтесь кнопкой "исходный код"
Вёрстка сайта с нуля

Уникальный Видеокурс!

"Научись верстать сайты и заработай на этом!"

Получить видеокурс

Подпишись на курс по программированию, и узнавай первым о новых уроках!

RSS подписка Страничка Вконтакте Мы в Twitter
Бесплатный курс по основам PHP
Ошибка в тексте? Выделите ее мышкой и нажмите Ctrl+Enter
Поблагодарить автора: Номер карты (ПриватБанк)
5168 7572 4170 8660
WebMoney
R372544961915 U685637142028 Z999792764387
Наверх
Система Orphus