Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
v0_Методичка. ЛР. Web программирование.docx
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Лабораторная работа 6 Протокол http. Обмен данными между web-сервером и клиентом по протоколу http.

Цель

Изучить основные этапы взаимодействия между web-сервером и клиентом (не обязательно браузером) с помощью протокола HTTP.

Теоретические сведения

HTTP – базовый протоколом сети гипертекстовых ресурсов.

Реализован на основе принципов взаимодействия «клиент-сервер»:

  • потребитель–клиент инициирует соединение с поставщиком–сервером и посылает ему запрос;

  • поставщик–сервер, получает запрос, производит необходимые действия и возвращает обратно клиенту ответ с результатом.

Состав HTTP-запроса:

  • Строка запроса (строка состояния, строка-статус).

  • Поля заголовка. Вида – Поле: Значение

  • Пустая строка.

  • Тело запроса.

Рис. Структура запроса клиента

Строка запроса (строка состояния):

метод_запроса URL_pecypca версия_протокола_НТТР{CR|LF}

Метод, указанный в строке состояния, определяет способ воздействия на ресурс, URL которого задан в той же строке. Метод может принимать значения GET, POST, HEAD, PUT, DELETE.

GET. Согласно формальному определению, метод GET предназначается для получения ресурса с указанным URL. Получив запрос GET, сервер должен прочитать указанный ресурс и включить код ресурса в состав ответа клиенту. Ресурс, URL которого передается в составе запроса, не обязательно должен представлять собой HTML-страницу, файл с изображением или другие данные. URL ресурса может указывать на исполняемый код программы, который, при соблюдении определенных условий, должен быть запущен на сервере. В этом случае клиенту возвращается не код программы, а данные, сгенерированные в процессе ее выполнения. Несмотря на то что, по определению, метод GET предназначен для получения информации, он может применяться и в других целях. Метод GET вполне подходит для передачи небольших фрагментов данных на сервер.

POST. Согласно тому же формальному определению, основное назначение метода POST – передача данных на сервер. Однако, подобно методу GET, метод POST может применяться по-разному и нередко используется для получения информации с сервера. Как и в случае с методом GET, URL, заданный в строке состояния, указывает на конкретный ресурс. Метод POST также может использоваться для запуска процесса.

HEAD и PUT являются модификациями методов GET и POST.

HEAD – сервер возвращает только заголовки без контента.

Версия протокола, как правило, задается в следующем формате:

HTTP/версия.модификация

На версию протокола ориентируется браузер, которую он предпочитает.

Поля заголовка, следующие за строкой состояния, позволяют уточнять запрос, т.е. передавать серверу дополнительную информацию.

Полей заголовков определено достаточно много.

Т.к. протокол HTTP расширяемый, то можно добавить и свои поля заголовка.

Часть заголовков предназначена для сервера, а часть полезна для разработчиков сервера.

Заголовки помещаются в серверные переменные. Можно использовать, например, для сбора статистики на сервере.

Состав HTTP-ответа:

  • Строка состояния.

  • Поля заголовка.

  • Пустая строка.

  • Тело ответа.

Строка состояния:

версия_протокола Код_ответа Пояснительное_сообщение

  • Версия_протокола задается в том же формате, что и в запросе клиента, и имеет тот же смысл.

  • Код_ответа – это трехзначное десятичное число, представляющее в закодированном виде результат обслуживания запроса сервером.

  • Пояснительное_сообщение дублирует код ответа в символьном виде. Это строка символов, которая не обрабатывается клиентом. Она предназначена для системного администратора или оператора, занимающегося обслуживанием системы, и является расшифровкой кода ответа.

В используемых в настоящее время реализациях протокола HTTP первая цифра не может быть больше 5 и определяет следующие классы ответов.

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

  • 2 - успешная обработка запроса клиента.

  • 3 - перенаправление запроса. Чтобы запрос был обслужен, необходимо предпринять дополнительные действия.

  • 4 - ошибка клиента. Как правило, код ответа, начинающийся с цифры 4, возвращается в том случае, если в запросе клиента встретилась синтаксическая ошибка.

  • 5 - ошибка сервера. По тем или иным причинам сервер не в состоянии выполнить запрос.

100

Continue Продолжайте

Клиент должен продолжать передачу запроса

200

OK

Запрос был успешно обработан. Содержимое отклика зависит от типа запроса

204

No Content

Нет содержимого

Сервер выполнил запрос, но ему нечего возвращать клиенту. Обозреватель не должен изменять отображение документа.

301

Moved Permanently Ресурс перенесен

Запрошенный ресурс сменил свой URI. Его новый URI указан в поле заголовка отклика Location.

302

Found

Найдено

Запрошенный ресурс временно сменил свой URI.

304

Not Modified

Не изменено

Клиент выполнил условный запрос GET, доступ разрешен, но документ не был изменен.

400

Bad Request

Неверный запрос

Запрос не был понят сервером из-за его неверного синтаксиса.

401

Unauthorized

Неавторизован

Запрос требует авторизации доступа, тип которой указан в поле заголовка отклика WWW-Authenticate

403

Forbidden

Запрещено

Сервер понял запрос, но отказался его выполнять

404

Not Found

Не найдено

Ресурс, заданный в URI запроса, не найден

405

Method Not Allowed

Недопустимый метод

Данный тип запроса не применим к ресурсу, заданному в URI запроса

500

Internal Server Error

Внутренняя ошибка сервера

Запрос не исполнен из-за неожиданной ошибки сервера

503

Service Unavailable

Служба недоступна

Сервер временно не может исполнить запрос из-за перегрузки

Выполнение

  1. Смоделируем запрос к web-серверу в ручном режиме, используя подключение с помощью telnet.

  2. Откройте окно командной строки Windows cmd.

  3. Выполните команду telnet.

  4. Введите команду (обязательно укажите в качестве параметра порт 80):

open www.ya.ru 80

  1. В левом верхнем углу будет мигать курсор, что свидетельствует об успешном подключении. Пишем запрос к серверу:

GET / HTTP/1.1 <жмем Enter>

Host: www.ya.ru <жмем Enter>

<жмем Enter>

  1. Смотрим на ответ сервера. Определите статус ответа, как называется web-сервер (в смысле программа). Найдите, где начинается содержание переданной web-станицы.

  1. Выполните еще один запрос, но без указания в заголовке поля Host. Проанализируйте ответ сервера, какой статус ответа получили и почему?

open www.ya.ru 80 <жмем Enter>

GET / HTTP/1.1 <жмем Enter>

<жмем Enter>

  1. По ответу сервера на Ваш запрос выясните какой сервер используется на сайте www.yandex.ru. Вместо метода GET используйте метод HEAD. В чем разница между ответами сервера на запрос с методом GET и HEAD?

  2. Для дальнейшей работы будем пользоваться плагинами для просмотра заголовков и вообще для анализа обмена данными между web-сервером и браузером.

  3. Для просмотра взаимодействия IE и web-сервера используем HTTP Analyzer Stand-alone V7.

  1. Данный плагин можно открыть в отдельном окне, что несколько удобнее. В работе нас будут интересовать вкладки «Header», «Response Content» и «Raw Stream».

  1. Попробуйте открывать несколько сайтов и проанализировать содержание запросов и ответов сервера. Чем отличается информацию на вкладках Header», «Response Content» и «Raw Stream»? Каким именем представляется IE в запросах к web-серверу?

  2. Дальнейшие эксперименты будем проводить с web-сервером Apache, инсталлированным Вами в предыдущей лабораторной работе на сервер FreeBSD.

  3. Запустите виртуальную машину с сервером FreeBSD.

  4. Убедитесь, что web-сервер работает. Например, откройте в браузере www.server_freebsd.mycompany.ru.

  5. Пробуем подключиться к нашему серверу с помощью любого ftp-клиента и учетной записи root.

  1. Вот теперь можно продолжать. Возвращаемся в браузер IE и открываем наш «домашний» сайт www.server_freebsd.mycompany.ru. Анализируем содержание запросов и ответов сервера. Обратите внимание на статус ответа сервера при первом запросе нашей странички.

  1. Выполните обновление открытой web-странички (F5). Объясните, почему в ответе сервера наблюдаем статус 304 Not Modified. Измените файл index.html на сервере и опять обновите страничку в браузере. Что изменилось в статусе ответа сервера? Почему?

  1. Для других браузеров так же существуют подобные плагины для просмотра HTTP-заголовков.

  2. Установите для Chrome расширение HTTP Headers.

  3. Просмотрите заголовки с помощью этого плагина.

  1. Изучаем передачу данных из формы различными методами.

  2. Создайте на сервере простую html страничку с именем test_get.html (важно – используем метод GET):

<html>

<head>

<meta charset="koi8-r">

<title>test page</title>

</head>

<body>

<h1>test page</h1>

<form method=GET action='php_forma.php'>

Имя: <input type=text name='name'><br>

Фамилия: <input type=text name='fam'><br>

Сообщение: <textarea name='message'></textarea><br>

<input type=submit value='Отправить сообщение'>

</form>

</body>

</html>

  1. Создадим еще одну страничку с именем test_post.html укажем в атрибутах формы метод POST.

  2. Теперь напишем небольшой php-скрипт и сохраним его под именем php_forma.php. Обратите внимание в файлах test_get.html и test_post.html наш скрипт указан в качестве параметра атрибута action для формы.

<?php

PRINT '

<html>

<head>

<META HTTP-EQUIV="Content-Type" content="text/html; charset=koi8-r">

</head>

<body>

<p> 

<h1>Отправка данных</h1>

';

echo "Метод: ".$_SERVER['REQUEST_METHOD'];

echo "<br>";

echo "Строка запроса: ".$_SERVER['QUERY_STRING'];

echo "<br>";

echo "<br>";

echo "Параметры и их значения";

if (get_magic_quotes_gpc()) {

$_GET = array_map('stripslashes', $_GET);

$_POST = array_map('stripslashes', $_POST);

};

if(count($_POST)!=0)

{

foreach ($_POST as $key=>$value)

echo "<br> $key = $value";

};

echo "<br>";

if(count($_GET)!=0)

{

foreach ($_GET as $key=>$value)

echo "<br> $key = $value";

}

PRINT "

</p>

</body>

</html>

";

?>

  1. Сравните HTTP-заголовки для страницы, которая получается после нажатия на кнопку «Отправить сообщение» на странице test_get.html и test_post.html. В чем отличие и почему?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]