Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - HTTP - Структура протокола28 мая 2011Оглавление: 1. HTTP 2. Преимущества 3. Недостатки и проблемы 4. Программное обеспечение 5. История развития 6. Структура протокола 7. Примеры диалогов HTTP 8. Основные механизмы протокола 9. Особенности протокола Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:
Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом, так как указывает на тип запроса/ответа. Исключением является версия 0.9 протокола, у которой сообщение запроса содержит только стартовую строку, а сообщения ответа только тело сообщения. Стартовая строкаСтартовые строки различаются для запроса и ответа. Строка запроса выглядит так:
Здесь:
Чтобы запросить страницу данной статьи, клиент должен передать строку:
Стартовая строка ответа сервера имеет следующий формат:
Здесь:
Например, на предыдущий наш запрос клиентом данной страницы сервер ответил строкой:
МетодыМетод HTTP последовательность из любых символов, кроме управляющих и разделителей, указывающая на основную операцию над ресурсом. Обычно метод представляет собой короткое английское слово, записанное заглавными буквами. Обратите внимание, что название метода чувствительно к регистру. Каждый сервер обязан поддерживать как минимум методы GET и HEAD. Если сервер не распознал указанный клиентом метод, то он должен вернуть статус 501. Если серверу метод известен, но он неприменим к конкретному ресурсу, то возвращается сообщение с кодом 405. В обоих случаях серверу следует включить в сообщение ответа заголовок Allow со списком поддерживаемых методов. Кроме методов GET и HEAD, часто применяется метод POST. OPTIONSИспользуется для определения возможностей веб-сервера или параметров соединения для конкретного ресурса. В ответ серверу следует включить заголовок Allow со списком поддерживаемых методов. Также в заголовки ответа может включаться информация о поддерживаемых расширениях. Предполагается, что запрос клиента может содержать тело сообщения для указания интересующих его сведений. Формат тела и порядок работы с ним в настоящий момент не определён. Сервер пока должен его игнорировать. Аналогичная ситуация и с телом в ответе сервера. Для того, чтобы узнать возможности всего сервера, клиент должен указать в URI звёздочку «*». Запросы «OPTIONS * HTTP/1.1» могут также применяться для проверки работоспособности сервера и тестирования на предмет поддержки сервером протокола HTTP версии 1.1. Результат выполнения этого метода не кэшируется. GETИспользуется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»: Согласно стандарту HTTP, запросы типа GET считаются идемпотентными многократное повторение одного и того же запроса GET должно приводить к одинаковым результатам. Это позволяет кэшировать ответы на запросы GET. Кроме обычного метода GET, различают ещё условный GET и частичный GET. Условные запросы GET содержат заголовки If-Modified-Since, If-Match, If-Range и подобные. Частичные GET содержат в запросе Range. Порядок выполнения подобных запросов определён стандартами отдельно. HEADАналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Запрос HEAD обычно применяется для извлечения метаданных, проверки наличия ресурса и чтобы узнать, не изменился ли он с момента последнего обращения. Заголовки ответа могут кэшироваться. При несовпадении метаданных ресурса с соответствующей информацией в кэше копия ресурса помечается как устаревшая. POSTПрименяется для передачи пользовательских данных заданному ресурсу. Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы на сервер. В отличие от метода GET, метод POST не считается идемпотентным, то есть многократное повторение одних и тех же запросов POST может возвращать разные результаты. При результатах выполнения 200 и 204 в тело ответа следует включить сообщение об итоге выполнения запроса. Если был создан ресурс, то серверу следует вернуть ответ 201 с указанием URI нового ресурса в заголовке Location. Сообщение ответа сервера на выполнение метода POST не кэшируется. PUTПрименяется для загрузки содержимого запроса на указанный в запросе URI. Если по заданному URI не существовало ресурса, то сервер создаёт его и возвращает статус 201. Если же был изменён ресурс, то сервер возвращает 200 или 204. Сервер не должен игнорировать некорректные заголовки Content-* передаваемые клиентом вместе с сообщением. Если какой-то из этих заголовков не может быть распознан или не допустим при текущих условиях, то необходимо вернуть код ошибки 501. Фундаментальное различие методов POST и PUT заключается в понимании предназначений URI ресурсов. Метод POST предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT, клиент предполагает, что загружаемое содержимое соответствует находящемуся по данному URI ресурсу. Сообщения ответов сервера на метод PUT не кэшируются. PATCHАналогично PUT, но применяется только к фрагменту ресурса. DELETEУдаляет указанный ресурс. TRACEВозвращает полученный запрос так, что клиент может увидеть, какую информацию промежуточные серверы добавляют или изменяют в запросе. LINKУстанавливает связь указанного ресурса с другими. UNLINKУбирает связь указанного ресурса с другими. CONNECTПреобразует соединение запроса в прозрачный TCP/IP туннель, обычно чтобы содействовать установлению защищенного SSL соединения через не шифрованный прокси. Коды состоянияКод состояния является частью первой строки ответа сервера. Он представляет собой целое число из трех арабских цифр. Первая цифра указывает на класс состояния. За кодом ответа обычно следует отделённая пробелом поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа. Примеры: 201 Webpage Created 403 Access allowed only for registered users 507 Insufficient Storage Клиент узнаёт по коду ответа о результатах его запроса и определяет, какие действия ему предпринимать дальше. Набор кодов состояния является стандартом, и они описаны в соответствующих документах RFC. Введение новых кодов должно производиться только после согласования с IETF. Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода. В настоящее время выделено пять классов кодов состояния.
ЗаголовкиЗаголовки HTTP это строки в HTTP-сообщении, содержащие разделённую двоеточием пару параметр-значение. Формат заголовков соответствует общему формату заголовков текстовых сетевых сообщений ARPA. Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой. Примеры заголовков: Server: Apache/2.2.11 PHP/5.3.0 Last-Modified: Sat, 16 Jan 2010 21:16:42 GMT Content-Type: text/plain; charset=windows-1251 Content-Language: ru В примере выше каждая строка представляет собой один заголовок. При этом то, что находится до первого двоеточия, называется именем, а что после неё значением. Все заголовки разделяются на четыре основных группы:
Именно в таком порядке рекомендуется посылать заголовки получателю. Все необходимые для функционирования HTTP заголовки описаны в основных RFC, ссылки на которые есть в конце этой статьи. При этом если вам не будет хватать существующих, то можете смело вводить свои. Традиционно к именам таких дополнительных заголовков добавляют префикс «X-» для избежания конфликта имён с возможно существующими. Например, как в заголовках X-Powered-By или X-Cache. Некоторые разработчики используют свои индивидуальные префиксы. Примерами таких заголовков могут служить Ms-Echo-Request и Ms-Echo-Reply, введённые корпорацией Microsoft для расширения WebDAV. Тело сообщенияТело HTTP сообщения, если оно присутствует, используется для передачи тела объекта, связанного с запросом или ответом. Тело сообщения отличается от тела объекта только в том случае, когда применяется кодирование передачи, что указывается полем заголовка Transfer-Encoding. message-body = entity-body | <entity-body закодированно согласно Transfer-Encoding> Поле Transfer-Encoding ДОЛЖНО использоваться для указания любого кодирования передачи, примененного приложением в целях гарантирования безопасной и правильной передачи сообщения. Поле Transfer-Encoding - это свойство сообщения, а не объекта, и, таким образом, может быть добавлено или удалено любым приложением в цепочке запросов/ответов. Правила, устанавливающие допустимость тела сообщения в сообщении, отличны для запросов и ответов. Присутствие тела сообщения в запросе отмечается добавлением к заголовкам запроса поля заголовка Content-Length или Transfer-Encoding. Тело сообщения МОЖЕТ быть добавлено в запрос только когда метод запроса допускает тело объекта . Включается или не включается тело сообщения в сообщение ответа зависит как от метода запроса, так и от кода состояния ответа. Все ответы на запрос с методом HEAD НЕ ДОЛЖНЫ включать тело сообщения, даже если присутствуют поля заголовка объекта, заставляющие поверить в присутствие объекта. Никакие ответы с кодами состояния 1xx, 204, и 304 НЕ ДОЛЖНЫ содержать тела сообщения. Все другие ответы содержат тело сообщения, даже если оно имеет нулевую длину. Просмотров: 13008
|