Протокол HTTP
Прежде чем перейти к построению интерфейса пользователя в Web-приложениях на основе J2EE и .NET, стоит рассмотреть основные элементы протокола HTTP, используемого для передачи данных между серверами и клиентами в таких приложениях. Поскольку основная функциональность компонентов интерфейса Web-приложений связана с обработкой и созданием сообщений HTTP, знание элементов этого протокола необходимо для понимания технологий разработки приложений такого рода.
HTTP (Hypertext Transfer Protocol, протокол передачи гипертекста) представляет собой протокол прикладного уровня, использующий для пересылки данных протокол транспортного уровня. Достаточно подробное описание его можно найти в [5,6].
Сообщения HTTP бывают двух видов: запросы клиента и ответы сервера.
Запрос HTTP состоит из идентификации метода запроса, универсального идентификатора запрашиваемого ресурса (Universal Resource Identifier, URI), указания версии протокола и, возможно, набора заголовков с дополнительной информацией, а также поля данных общего вида.
<Request> ::= GET <URI> CrLf | <Method> <URI> <HTTP-Version> CrLf <Req-Header>* ( <Data> )? <Req-Header> ::= <Field> : <Value> CrLf CrLf ::= '\r''\n'
Основные методы протокола HTTP следующие.
- GET
Служит для получения любой информации по URI запроса, обычно — документа, хранящегося по указанному адресу или генерируемого по запросу с таким URI. Может иметь заголовок If-Modified-Since, который предписывает не посылать тело запрашиваемого ресурса, если он не изменялся с указанной даты.
- POST
Служит для создания нового ресурса, связанного с указанным по URI. Чаще всего используется для аннотации ресурсов, добавления сообщений в группы новостей, дистанционной работы с базами данных. Реальная обработка такого запроса зависит от содержащегося в нем URI.
Остальные методы — HEAD, PUT, DELETE, LINK, UNLINK — используются гораздо реже.
Заголовки запроса служат для передачи дополнительной информации об этом запросе или о клиенте.
Заголовок состоит из идентификатора поля и его значения, разделенных двоеточием, и бывает одного из следующих типов.
- From
Содержит e-mail адрес пользователя, под чьим именем работает клиент.
Пример: From: webmaster@yandex.ru - Accept, Accept-Encoding, Accept-Charset и Accept-Language
В таком заголовке через запятую перечисляются возможные форматы (соответственно, кодировки, используемые таблицы символов и языки) ответов на данный запрос.
Пример: Accept: text/plain, text/html, text/x-dvi; q=.8; mxb=100000; mxt=5.0 - User-Agent
Содержит название используемой клиентской программы. - Referer
Используется для указания адреса ресурса, с которого был получен данный запрос. - If-Modified-Since
Используется для отмены ответной пересылки документов, модифицированных не позднее указанной даты, с целью снижения нагрузки на сеть. - Authorization
Содержит авторизационную информацию, специфичную для используемых сервером протоколов авторизации. - ChargeTo
Содержит информацию о том, куда выставить счет за обработку запроса. - Pragma
Содержит дополнительные директивы для промежуточных серверов, например, прокси-серверов.
Пример запроса.
GET /locate?keywords=HTTP+description HTTP/1.1 Date: Mon, 15 Dec 2004 12:18:15 GMT Accept: image/gif, image/jpg, */* Accept-Charset: iso-8859-1, *, utf-8 Accept-Language: en Connection: keep-Alive User-Agent: Mozilla/4.7 [en] (Win98; u)
1xx | Информационное сообщение | ||
2xx | Успешная обработка | ||
200 | OK | Вcе нормально | |
201 | Created | Документ создан | |
3xx | Перенаправление запроса | ||
301 | Moved Permanently | Ресурс перемещен | |
302 | Moved Temporarily | Ресурс перемещен временно | |
4xx | Ошибка клиента | ||
400 | Bad Request | Некорректно составленный запрос | |
401 | Unauthorized | Нужна аутентификация клиента | |
403 | Forbidden | Доступ к ресурсу запрещен | |
404 | Not Found | Запрашиваемый ресурс отсутствует | |
5xx | Ошибка сервера | ||
500 | Internal Server Error | Внутренняя ошибка сервера |
<Response> ::= ( <Content> )? | <HTTP-Version> <Code> <Explanation> CrLf <Resp-Header>* ( <Content> )? <Resp-Header> ::= <Field> : <Value> CrLf CrLf ::= '\r''\n'
Некоторые коды статуса ответа поясняются в табл. 12.
Возможны следующие заголовки ответа:
- Allowed
Перечисляются через пробел доступные для пользователя методы запросов по данному URI. - Public
Перечисляет доступные всем методы запросов. - Content-Length, Content-Type, Content-Encoding и Content-Language
Задают размер содержимого в байтах (подразумевается, что содержимое имеет бинарный формат и не должно разбиваться на строки при чтении), его формат или MIME-тип, кодировку и язык. - Date
Дата создания содержащегося документа или объекта. - Last-Modified
Дата последнего изменения содержащегося объекта. - Expires
Дата, после которой содержащийся объект считается устаревшим. - URI
URI содержащегося объекта. - Title
Заголовок содержащегося документа. - Server
Описывает серверную программу. - Retry-After
Определяет промежуток времени на обработку запроса, до прохождения которого не надо направлять запрос повторно, если ответа на него еще нет.
Пример HTTP-ответа.
HTTP/1.0 200 OK Content-Length: 2109 Content-Type: text/html Expires: 0 Last-Modified: Thu, 08 Feb 2001 09:23:17 GMT Server: Apache/1.3.12 <HTML> <HEAD> <TITLE> … </TITLE> </HEAD> <BODY> … </BODY> </HTML>