Протокол HTTP и способы передачи данных на серверInternet построен по многоуровневому принципу, от физического уровня,
связанного с физическими аспектами передачи двоичной информации, и до
прикладного уровня, обеспечивающего интерфейс между пользователем и
сетью. HTTP (HyperText Transfer Protocol, протокол передачи гипертекста) –
это протокол прикладного уровня, разработанный для обмена
гипертекстовой информацией в Internet. HTTP предоставляет набор методов для указания целей запроса,
отправляемого серверу. Эти методы основаны на дисциплине ссылок, где
для указания ресурса, к которому должен быть применен данный метод,
используется универсальный идентификатор ресурсов (Universal Resource
Identifier) в виде местонахождения ресурса (Universal Resource
Locator, URL) или в виде его универсального имени (Universal Resource
Name, URN). Сообщения по сети при использовании протокола HTTP передаются в
формате, схожем с форматом почтового сообщения Internet (RFC-822) или
с форматом сообщений MIME (Multipurpose Internet Mail Exchange). HTTP используется для коммуникаций между различными пользовательскими
программами и программами-шлюзами, предоставляющими доступ к
существующим Internet-протоколам, таким как SMTP (протокол
электронной почты), NNTP (протокол передачи новостей), FTP (протокол
передачи файлов), Gopher и WAIS. HTTP разработан для того, чтобы
позволять таким шлюзам через промежуточные программы-серверы (proxy)
передавать данные без потерь. Протокол реализует принцип запрос/ответ. Запрашивающая программа –
клиент инициирует взаимодействие с отвечающей программой – сервером и
посылает запрос, содержащий: - метод доступа;
- адрес URI;
- версию протокола;
- сообщение (похожее по форме на MIME) с информацией о типе
передаваемых данных, информацией о клиенте, пославшем запрос, и,
возможно, с содержательной частью (телом) сообщения.
Ответ сервера содержит: - строку состояния, в которую входит версия протокола и код возврата
(успех или ошибка);
- сообщение (в форме, похожей на MIME), в которое входит информация
сервера, метаинформация (т.е. информация о содержании сообщения) и
тело сообщения.
В протоколе не указывается, кто должен открывать и закрывать
соединение между клиентом и сервером. На практике соединение, как
правило, открывает клиент, а сервер после отправки ответа инициирует
его разрыв. Давайте рассмотрим более подробно, в какой форме отправляются запросы
на сервер. Форма запроса клиентаКлиент отсылает серверу запрос в одной из двух форм: в полной или
сокращенной. Запрос в первой форме называется соответственно полным
запросом, а во второй форме – простым запросом. Простой запрос содержит метод доступа и адрес ресурса. Формально это
можно записать так:
<Простой-Запрос> := <Метод> <символ пробел>
<Запрашиваемый-URI> <символ новой строки>
В качестве метода могут быть указаны GET, POST, HEAD, PUT, DELETE и
другие. О наиболее распространенных из них мы поговорим немного
позже. В качестве запрашиваемого URI чаще всего используется
URL-адрес ресурса. Пример простого запроса: Здесь GET – это метод доступа, т.е. метод, который должен быть
применен к запрашиваемому ресурсу, а http://phpbook.info/ – это
URL-адрес запрашиваемого ресурса. Полный запрос содержит строку состояния, несколько заголовков
(заголовок запроса, общий заголовок или заголовок содержания) и,
возможно, тело запроса. Формально общий вид полного запроса можно
записать так:
<Полный запрос> := <Строка Состояния>
(<Общий заголовок>|<Заголовок запроса>|
<Заголовок содержания>)
<символ новой строки>
[<содержание запроса>]
Квадратные скобки здесь обозначают необязательные элементы заголовка,
через вертикальную черту перечислены альтернативные варианты. Элемент
<Строка состояния> содержит метод запроса и URI ресурса (как и
простой запрос) и, кроме того, используемую версию протокола HTTP.
Например, для вызова внешней программы можно задействовать следующую
строку состояния:
POST http://phpbook.info/cgi-bin/test HTTP/1.0
В данном случае используется метод POST и протокол HTTP версии 1.0. В обеих формах запроса важное место занимает URI запрашиваемого
ресурса. Чаще всего URI используется в виде URL-адреса ресурса. При
обращении к серверу можно применять как полную форму URL, так и
упрощенную. Полная форма содержит тип протокола доступа, адрес сервера ресурса и
адрес ресурса на сервере (рисунок 4.2). В сокращенной форме опускают протокол и адрес сервера, указывая
только местоположение ресурса от корня сервера. Полную форму
используют, если возможна пересылка запроса другому серверу. Если же
работа происходит только с одним сервером, то чаще применяют
сокращенную форму.  Рис. 4.2.
Полная форма URL
Далее мы рассмотрим наиболее распространенные методы отправки
запросов. МетодыКак уже говорилось, любой запрос клиента к серверу должен начинаться
с указания метода. Метод сообщает о цели запроса клиента. Протокол
HTTP поддерживает достаточно много методов, но реально используются
только три: POST, GET и HEAD. Метод GET позволяет получить любые
данные, идентифицированные с помощью URI в запросе ресурса. Если URI
указывает на программу, то возвращается результат работы программы, а
не ее текст (если, конечно, текст не есть результат ее работы).
Дополнительная информация, необходимая для обработки запроса,
встраивается в сам запрос (в строку статуса). При использовании
метода GET в поле тела ресурса возвращается собственно затребованная
информация (текст HTML-документа, например). Существует разновидность метода GET – условный GET. Этот метод
сообщает серверу о том, что на запрос нужно ответить, только если
выполнено условие, содержащееся в поле if-Modified-Since заголовка
запроса. Если говорить более точно, то тело ресурса передается в
ответ на запрос, если этот ресурс изменялся после даты, указанной в
if-Modified-Since. Метод HEAD аналогичен методу GET, только не возвращает тело ресурса и
не имеет условного аналога. Метод HEAD используют для получения
информации о ресурсе. Это может пригодиться, например, при решении
задачи тестирования гипертекстовых ссылок. Метод POST разработан для передачи на сервер такой информации, как
аннотации ресурсов, новостные и почтовые сообщения, данные для
добавления в базу данных, т.е. для передачи информации большого
объема и достаточно важной. В отличие от методов GET и HEAD, в POST
передается тело ресурса, которое и является информацией, получаемой
из полей форм или других источников ввода. До сих пор мы только теоретизировали, знакомились с основными
понятиями. Теперь пора научиться использовать все это на практике.
Далее в лекции мы рассмотрим, как посылать запросы серверу и как
обрабатывать его ответы.
|