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
Артур666 28 май 2017 14:53
I Did It (Twice)

Артур666 28 май 2017 14:52
For Test 4

Артур666 28 май 2017 14:50
For Test 3

Артур666 28 май 2017 14:34
for test 2

Артур666 28 май 2017 14:23
For Test

Артур666 28 май 2017 13:52
I did it!

test1111 18 май 2017 00:15
I did It

18 май 2017 00:14
I did It

wElenacag 17 май 2017 23:43
Наш сервис предоставляет настоящие лайки на фото заказчиков, которые готовы платить за качество.

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

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

достаточно просто зарегистрироваться на нашем сервисе. > oplata-vklike.tk <

Вывод заработанных средств ежедневно в течении нескольких минут.

test1111 17 май 2017 22:58
I did it

test1111 17 май 2017 22:40
11

test1111 17 май 2017 22:29
1

test1111 14 май 2017 10:24
000

test1111 13 май 2017 22:54
Toka

test1111 13 май 2017 22:14
123

test1111 03 май 2017 12:28
1

02 май 2017 11:12
2

test1111 02 май 2017 11:05
1

01 май 2017 17:02
Извините) Пошалил маленько

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:01
I did it! A.Nineteen

01 май 2017 17:00
I did it! A.Nineteen

01 май 2017 17:00
I did it! A.Nineteen

01 май 2017 17:00
I did it! A.Nineteen

01 май 2017 16:58
I did it! A.Nineteen

01 май 2017 16:53
I did it! A.Nineteen

test1111 01 май 2017 16:51
for test

test1111 04 апр 2017 22:21
comment

test1111 03 апр 2017 21:39
да блин как мне оставить коммент от имени test1111?

03 апр 2017 21:23
да блин как мне оставить коммент от имени test1111?

test1111 03 апр 2017 21:21
2

test1111 03 апр 2017 20:38
1

03 апр 2017 20:31
automaticly created comment

test1111 03 апр 2017 20:27
ololo

03 апр 2017 16:12
some comment that i wrote

test1111 03 апр 2017 16:11
some comment that i wrote

test1111 03 апр 2017 16:11
testtest

test1111 03 апр 2017 16:10
f

test1111 03 апр 2017 16:05
tyjfh

test1111 03 апр 2017 14:01
Русский Авторизация

03 апр 2017 13:58
Proverka Epta

test1111 03 апр 2017 13:55
For test

test1111 05 мар 2017 12:47
for test

test1111 05 мар 2017 12:21
maza faka da

test1111 05 мар 2017 12:19
for test

test1111 05 мар 2017 12:15
for test

Ambivalence 28 фев 2017 07:17
hellfire

skorpi 28 фев 2017 06:55
41245 1312

test1111 28 фев 2017 02:08
I did it! (Valodya)

test1111 28 фев 2017 02:04
test

19 фев 2017 17:02
I did it

test1111 19 фев 2017 16:57
for test

sadf 13 фев 2017 11:16
<script>alert(123)</script>

Igor 12 фев 2017 14:50
12345

test1111 09 фев 2017 20:27
I did it!

test1111 01 фев 2017 18:12
test

test1111 01 фев 2017 17:16
test

31 янв 2017 16:33
1222222

test1111 31 янв 2017 16:29
1222222

25 янв 2017 11:58
Rabbit

test1111 25 янв 2017 11:54
for test

22 янв 2017 20:41
I did it.

22 янв 2017 20:41
I did it.

1640max 18 янв 2017 17:02
А по-русски получится написать?

1640max 18 янв 2017 17:01
Ogogo zarabotalo!

1640max 18 янв 2017 17:00
For test

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

28 дек 2016 11:33
IDidIT!t

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

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