| 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 | Добавить комментарий
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов