___
Раз уж я собралась писать статьи "от А", то сегодня поговорим на тему, с которой необходимо ознакомиться, прежде чем писать более-менее серьезные программы для работы с интернетом. Эта тема — протокол HTTP.
Часто возникают задачи, связанные с отправкой запроса на сервер и, соответственно, получением ответа от него. Например, отправка данных через форму. Можно, конечно, для этих целей использовать TWebBrowser (автоматизировать заполнение и отправку формы — элементарно, и механизм кукисов этим компонентом поддерживается), но это неэкономично и ресурсоемко. Именно поэтому я начала писать про Indy, а потом еще и про сокеты напишу. :) Но для работы с Indy надо иметь представление о формате обмена данными между клиентом и сервером. К этому и переходим.
Браузер и веб-сервер обмениваются данными по протоколу HTTP. Запрос по этому протоколу в общем виде состоит из указания метода запроса, заголовков (Header) и тела запроса.
Основные разновидности HTTP-запросов: GET, HEAD и POST.
GET-запрос
GET - означает "получить". С помощью GET-запроса мы можем получить содержимое какого-либо документа.
Когда наш браузер хочет получить содержимое странички, например, http://www.blogok.ru/2009/03/17/kak-zapretit-redaktirovanie-vyborochnyx-strok-v-cxgrid/, то он отправляет GET запрос, в котором указывает, что он хочет получить, откуда пользователь узнал об этой страничке (HTTP-REFERER) и кто посылает запрос (USER-AGENT).
Пример GET-запроса "из жизни":
GET /2009/03/17/kak-zapretit-redaktirovanie-vyborochnyx-strok-v-cxgrid/ HTTP/1.1
Host: www.blogok.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.blogok.ru/
Cookie: PHPSESSID=562b6b2d17e9207d1551922da511c156
Как видите, методом запроса является GET, протокол — HTTP 1.1. Все, что ниже, — заголовок. Помимо адреса страницы, содержимое которой браузер пытается получить, он передает в заголовке еще кучу всяких параметров. И далеко не все нам потом пригодятся. Имена и параметры заголовков разделены двоеточнием. А сам заголовок отделен от тела запроса двумя переводами строк.
Как видно из данного примера, браузер разбирает URL на "составляющие", а именно путь к файлу (Path='/2009/03/17/kak-zapretit-redaktirovanie-vyborochnyx-strok-v-cxgrid/') и имя сервера, к которому он обращаеться (Host='www.blogok.ru'). Referer — с какой страницы был осуществлен переход. User-Agent — "идентификация разновидности" браузера.
Если перевести заголовок запроса на условно-русский, то получается примерно:
"Я, User-Agent, пришел по рекомендации сервера Referer и хочу получить файл Path с сервера Host".
В поле Cookie браузер посылает свои кукисы.
HEAD-запрос
HEAD-запрос можно сравнить с "пингованием", т.е. посылкой пакета. И если сервер ответит, то он доступен. :) В принципе, для проверки доступности сервера он чаще всего и используется.
Пример HEAD-запроса:
HEAD /index.php HTTP/1.0
Host: www.blogok.ru
Тут все аналогично GET-запросу. Разница состоит в том, что на GET-запрос браузер получает ответ от сервера и содержимое документа, а на HEAD-запрос — только ответ сервера.
Ответ сервера снабжен кодом-идентификатором. Расшифровку этих кодов можно посмотреть в любой справочной документации.
POST-запрос
Возможности POST-запроса несколько шире. Это запрос на отправку данных. При помощи метода POST мы, например, можем передать данные после заполнения формы на сайте. Его синтаксис аналогичен синтаксису GET и HEAD заголовков, но от запроса GET он отличается тем, что вместо содержимого документа подаются параметры и значения. В POST-запросе необходимо указывать длину передаваемых данных (Content-Length), и тип передаваемых данных (Content-Type).
Пример — POST-запрос при логине в соцсети vkontakte.ru:
POST /login.php HTTP/1.1
Host: vkontakte.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.3) Gecko/2008092417 AdCentriaIM/1.7 Firefox/3.0.3 WebMoney Advisor
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://vkontakte.ru/
Content-Length: 69
Cookie: remixchk=5; remixautobookmark=6; remixlang=0
Pragma: no-cache
Cache-Control: no-cache
op=a_login_attempt&email=xxxxxx%40xxxxxx.ru&pass=xxxxxx&expire=0
Нам интересна последняя строка, в которой передается логин и пароль для авторизации на сайте.
Чтобы успешно залогиниться на сайте, надо не только уметь посылать "правильные запросы", но и правильно интерпретировать ответы сервера. Например, в ответ на посланный нами запрос, сервер вернет нам:
HTTP/1.x 200 OK
Server: nginx/0.6.31
Date: Wed, 08 Apr 2009 19:12:56 GMT
Content-Type: text/html; charset=windows-1251
Connection: keep-alive
Pragma: no-cache
Cache-Control: private, must-revalidate
Set-Cookie: remixmid=5704894; expires=Mon, 12-Apr-2010 11:43:08 GMT; path=/; domain=.vkontakte.ru
Set-Cookie: remixemail=xxxxxx%40xxxxxx.ru; expires=Wed, 31-Mar-2010 00:54:56 GMT; path=/; domain=.vkontakte.ru
Set-Cookie: remixpass=34b46332c9cedb25211e8e7155c510a8; expires=Fri, 09-Apr-2010 21:05:50 GMT; path=/; domain=.vkontakte.ru
Set-Cookie: remixsid=40cf323c0545f0f81a888bf4d8fdec94058faddf1e7b1d17396abd41; expires=Fri, 02-Apr-2010 08:35:11 GMT; path=/; domain=.vkontakte.ru
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 37
Тем самым в браузере, обращающемся к веб-серверу, устанавливаются определенные кукисы.
Пожалуй, на сегодня информации хватит. В следующих сериях смотрите:
- чем можно просмотреть HTTP-заголовки;
- пример использования компонентов Indy для авторизации на сайте.
Чтобы быть в курсе обновлений блога, можно подписаться на RSS.
Интересная статья!
ОтветитьУдалить