Главная » Java, Web » Сообщения HTTP

0

В этом разделе содержится подробная информация о сообщениях HTTP в соответствии с описанием протокола HTTP.

Типы сообщений

HTTP-сообщения состоят из запросов клиента серверу и ответов сервера клиенту.

HTTP-message = Request | Response ; HTTP/1.1 messages Запросы и ответы состоят из строки, открывающей запрос или ответ, одного или нескольких заголовоков, пустой строки, отделяющей заголовки от тела сообщения (строка, которая ничего не содержит перед CRLF) и тело сообщения, которое может отсутствовать:

generic-message = start-line

*message-header CRLF [ message-body ]

start-line = Request-Line | Status-Line

Заголовки сообщений

Заголовки сообщений бывают заголовками общего назначения, заголовками запросов, заголовками ответов или заголовками сущностей (вставляемых в сообщение данных). Каждый заголовок состоит из имени, за которым ставится двоеточие, после которое следует значение. Имена чувствительны к регистру. Перед значением может быть вставлено произвольное количество пробелов (LWS, SP). Поля в заголовках могут занимать несколько строк, каждая дополнительная строка в поле заголовка должна начинаться с одного или нескольких SP или НТ.

j Формат заголовков

message-header = field-name ":" [ field-value ] CRLF

field-name = token

field-value = *(field-content | LWS)

field-content = Оначение поля — *TEXT или комбинация из token, tspecials, quoted-string>

Порядок следования заголовков не имеет значения. Однако, как правило, заголовки общего назначения вставляют в первую очередь, затем используются заголовки запросов, заголовки ответов и заголовки сущностей. Заголовки с одним и тем же именем могут встречаться в сообщении только в том случае, если поле значения заголовка состоит из списка значений, разделяемых запятыми. Такие заголовки могут быть сведены в один заголовок без изменения семантики. При этом может быть значимым порядок появления одинаковых заголовков, если значим порядок появления значений, указываемых в таком заголовке через запятую.

Тело сообщения

Тело заголовка, если оно присутствует, используется для вложения в него сущности (данных), связанной с сообщением. Тело сообщения отличается от тела сущности только в том случае, если используется кодировка, тогда ЭТО ДОЛЖНО быть отражено В заголовке Transfer-Encoding.

message-body = entity-body

I <entity-body закодировано в соответствии с Transfer-Encoding> Наличие тела сообщения в запросе связано с необходимостью использовать заголовки Content-Length И Transfer-Encoding. Именно ИХ появление сигнализирует о наличии тела сообщения. Тело сообщения может быть вставлено в ответ в том случае, если запрос позволяет использование тел сущностей.

Возможность включения в ответ тела сообщения зависит от того, каков был запрос и каков статус ответа. Ответы на запросы типа head не могут содержать тела сообщения. Это справедливо даже в том случае, если заголовок выглядит так, что сообщение содержит тело. Все ответы, содержащие статусы ответа lxx (informational), 2 04 (no content) и 304 (not modified) не могут содержать тело ответа. Все прочие ответы содержат тело ответа, которое, однако, может иметь нулевую длину.

Длина сообщения

При вставке в ответ тела сообщения, его длина определяется в соответствии со следующими правилами (в порядке старшинства).

Все ответы, которые не должны включать в себя тело сообщения (статус- коды ответов lxx, 204, 304 и ответы на запросы head), заканчиваются с обнаружением первой пустой строки после заголовков вне зависимости от того, содержит ли заголовок поля сущности.

Если присутствует заголовок Transfer-Encoding, который указывает на кодировку "chunked", то длина определяется этой кодировкой.

Если присутствует заголовок content-Length, то длина сообщения считается равной значению этого заголовка.

Если сообщение использует тип "muitipart/byteranges", то длина сообщения определяется в соответствии с прилагаемым телом сообщения. Этот заголовок следует использовать только в том случае, если клиент умеет анализировать такой ответ.

Заголовки общего типа

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

Заголовки общего типа

general-header = Cache-Control I Connection I Date | Pragma

I Transfer-Encoding I Upgrade I Via

Запросы серверу

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

! Формат запроса

Request       = Request-Line

*(general-header I request-header I entity-header) CRLF

[ message-body ]

Request-Line

Request-Line начинается с указания метода, за которым указывается Request-URi и версия протокола, после чего следует CRLF. Элементы отделены друг от друга пробелом (или несколькими пробелами) SP. Использовать CR или LF не разрешается (за исключением завершающего CRLF).

Формат запроса

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

Методы

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

Method         = "OPTIONS"

| "GET" I "HEAD"

| "POST" I "PUT" | "DELETE" I "TRACE"

I extension-method extension-method = token

Разрешенные для использования методы должны быть указаны в заголовке Allow. Статус-код ответа всегда содержит информацию о том, разрешен ли используемый метод на данном ресурсе. Если метод не разрешен, то сервер обязан возвратить заголовок с указанием статус-кода 4 05 (Method Not Allowed). Если метод известен, но не допускается его использование для ресурса запроса, если метод не распознан, то возвращается статус-код 501 (Not implemented). Методы get и head должны поддерживаться всеми серверами.

Request-URI

Request-URI — это идентификатор запрашиваемого ресурса:

Request-URI = "*" | absoluteURI | abs_path

Пример запроса

GET http://www.w3.org/pub/WWW/TheProject.html НТТР/1.1

Заголовки запросов

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

Формат заголовков запроса

request-header =    Accept

I               Accept-Charset

I               Accept-Encoding

I               Accept-Language

I               Authorization

|               From

I               Host

I               If-Modified-Since

I               If-Match

|               If-None-Mat ch

|               If-Range

|                If-Unmodified-Since

I                Max-Forwards

I                Proxy-Authorization

I                Range

I                Referer

I                User-Agent

Ответы сервера

Поле обработки запроса сервер отправляет клиенту ответ.

Формат ответа                                                                                                                                     j

Response      = Status-Line

*(general-header I response-header I entity-header) CRLF

[ message-body ]

Строка статус-кода

Эта строка используется для указания статус-кода.

Формат строки статус-кода                                                                                                              j

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

Статус-код Status Code и пояснение Reason-Phrase

Статус-код — это трехзначное число. Пояснение Reason-phrase — строка, поясняющая значение этого кода. Первая цифра статус-кода имеет следующий смысл:

?   lxx: informational — запрос получен, вычисления продолжаются;

?   2хх: Success — запрос получен, распознан и принят к исполнению;

?   Зхх: Redirection — для завершения запроса необходимо предпринять дополнительные действия;

?   4хх: client Error — запрос содержит неверный синтаксис и не может быть выполнен;

?   5хх: server Error — сервер не смог выполнить запрос.

Статус-коды и строка пояснения

Status-Code =   "100"   ; Continue

I               "101"   ; Switching Protocols

I               "200"   ; OK

I               "201"   ; Created

|               "202"   ; Accepted

I               "203"   ; Non-Authoritative Information

|               "204"   ; No Content

I               "205"   ; Reset Content

I               "206"   ; Partial Content

I               "300"   ; Multiple Choices

I               "301"   ; Moved Permanently

I               "302"   ; Moved Temporarily

I               "303"   ; See Other

I               "304"   ; Not Modified

I               "305"   ; Use Proxy

|               "400"   ; Bad Request

I               "401"   ; Unauthorized

|               "402"   ; Payment Required

I               "403"   ; Forbidden

|               "404"   ; Not Found

I               "405"   ; Method Not Allowed

I               "4 06"  ; Not Acceptable

|               "407"   ; Proxy Authentication Required

I               "408"   ; Request Time-out

I               "409"   ; Conflict

I               "410"   ; Gone

|               "411"   ; Length Required

|               "412"   ; Precondition Failed

|               "413"   ; Request Entity Too Large

|               "414"   ; Request-URI Too Large

I               "415"   ; Unsupported Media Type

I               "500"   ; Internal Server Error

I               "501"   ; Not Implemented

I               "502"   ; Bad Gateway

I               "503"   ; Service Unavailable

I               "504"   ; Gateway Time-out

I               "505"   ; HTTP Version not supported

I extension-code extension-code = 3DIGIT

Reason-Phrase = *<TEXT, excluding CR, LF>

Заголовки ответа

Заголовки ответа позволяют серверу отправлять дополнительную информацию клиенту.

Заголовки ответов

response-header =   Age

I               Location

I               Proxy-Authenticate

I               Public

I               Retry-After

I               Server

I               Vary

|               Warning

I               WWW-Authenticate

Сущности Entity

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

Заголовки сущностей

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

Заголовки для сущностей

entity-header = Allow

I               Content-Base

I               Content-Encoding

I               Content-Language

I               Content-Length

I               Content-Location

I               Content-MD5

I               Content-Range

I               Content-Type

I               ETag

|               Expires

I               Last-Modified

I               extension-header

extension-header    = message-header

Тело сущности

Тело сущности передается в следующем формате: entity-body = *OCTET

?      Тип данных сущности

Если в сообщении присутствует тело сущности, то необходимо указать тип данных, используемых в теле сущности, для этого используются заголовки Content-Type и Content-Encoding. Схема модели выглядит следующим образом:

entity-body := Content-Encoding(Content-Type(data))

content-Type описывает тип, a content-Encoding описывает дополнительно использованный тип кодировки, примененный к данным. Не существует кодировки, используемой по умолчанию.

?      Длина сущности

Длина тела сущности — это длина тела сообщения.

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии