The Russian Electronic Developer Magazine | |
Русский электронный журнал разработчика | |
Eugen Kuleshov ( 02.02.1999 )Эта статья не претендует на изложение всех особенностей протокола HTTP. Здесь рассказывается об основных принципах и концепциях. Если же вас интересуют все подробности, то в конце статьи приведены ссылки на документы в которых описан стандарт протокола. Кроме того я буду рад в меру моих сил и знаний ответить на ваши вопросы.
Hypertext Transfer Protocol (HTTP) - это протокол, который клиенты и серверы World Wide Web (WWW) используют для общения между собой. Он, по сути дела, является основой Web. Хотя HTTP в большей степени относится к сфере программирования серверов и клиентов, знание этого протокола важно для создания интерактивных Web страниц (в том числе с помощью SSI, CGI, php3, JavaServlets и т.п.).
Клиент инициирует транзакцию следующим образом:
GET /index.html HTTP/1.0
User-Agent: Mozilla/2.02Gold (WinNT; I)
Accept: image/gif, image/jpeg, */*
HTTP/1.0 200 OK
Date: Fri, 20 Sep 1996 08:17:58 GMT
Server: NCSA/1.5.2
Last-modified: Mon, 17 Jun 1996 21:53:08 GMT
Content-type: text/html
Content-length: 2482
В HTTP 1.0 после передачи сервером затребованных данных следует разъединение с клиентом и транзакция завершается, если не был передан заголовок Connection: Keep Alive. В HTTP 1.1 сервер по умолчанию не разрывает соединение и клиент может посылать другие запросы. Это позволяет сэкономить время и затраты клиента, которому не приходится заново соединяться с тем же сервером. Таким образом, в HTTP 1.1 транзакция может циклически повторяться, пока клиент или сервер не закроет соединение явно.
struct sockaddr_in server; struct hostent *hp; char req[ 8192]; char buf[ 8192]; struct servent *echoprot; int sock, len, rc; // Инициализация tcp сокета и коннект к серверу ... // Формирование запроса // метод запроса strcpy( req, "GET "); // запрашиваемый документ strcat( req, argv[ 2]); // версия протокола, используемого клиентом strcat( req, " HTTP/1.0\n"); // дополнительные заголовки запроса strcat( req, "User-Agent: Simple Web client by Eugen Kuleshov\n"); strcat( req, "Accept: */*\n"); // завершение запроса strcat( req, "\n\n"); // Посылаем запрос на сервер rc = send( sock, req, strlen( req), 0); if( rc==-1) { psock_errno( "send()"); exit( 1); } // Читаем и печатаем ответ на запрос do { len = recv( sock, buf, sizeof( buf), 0); if( len==-1) { psock_errno( "recv()"); exit( 1); } buf[ len] = '\0'; printf( "%s", buf); } while( len!=0); printf( "\n\n");Полный текст программы вы можете найти здесь. Я собирал ее VAC++ 3.0 для OS/2, но нет проблем собрать ее другим компилятором.
Теперь вы можете поэкспериментировать с этой програмкой и каким нибудь web сервером. Например:
webclnt euxx.uland.com /os2/ > euxxpageТеперь можно посмотреть файлик euxxpage. Кроме этого можно поиграть с заголовками запроса и посмотреть как реагирует сервер.
GET / HTTP/1.0
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */*
Следует отметить, что большая часть посылаемой сервером информации заголовка, не является обязательной и может представляться не всеми web серверами. Например:
HEAD / HTTP/1.0
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */*
Например:
POST / HTTP/1.0Обратите внимание на атрибуты Content-type и Content-length они используются для того, чтобы указать серверу на тип кодирования тела запроса и дать информацию о длине тела. Подробнее вы можете почитать в соответствующем RFC (HTTP 1.0 - rfc1945 или HTTP 1.1 - rfc2068).
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-length: 16
test=20&test2=22
Если вас заинтересовала эта статья и вам интересно продолжение, пожалуйста напишите мне.
Интересные ссылки:
Комментариев к странице: 0 | Добавить комментарий
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов