Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. В этой записи мы с тобой разберем, как отвечает HTTP сервер на запросы клиента. Как всегда: понятно и с примерами, но если тебе что-то будет непонятно — не стесняйся спросить в комментариях. Ответ ты получишь, как минимум, HTTP. Как ты уже догадался, в этой записи мы с тобой будем говорить про HTTP ответы сервера, а конкретнее: про строку состояния HTTP ответа сервера, немного поговорим про коды состояния HTTP ответа, посмотрим какие заголовки сервер может посылать в ответ на запрос и разберем несколько примеров HTTP ответа сервера.

HTTP ответы сервера: строка состояния HTTP ответа, коды состояния, заголовки HTTP ответа, примеры

HTTP ответы сервера: строка состояния HTTP ответа, коды состояния, заголовки HTTP ответа, примеры

Структура HTTP ответа сервера

Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол. HTTP ответы – это HTTP сообщение, которое посылает сервер в ответ на запрос клиента. Ответы HTTP сервера строго регламентированы и имеют четкую структуру. Структура HTTP ответа сервера состоит из:

  1. Строки состояния HTTP ответа, в которой сервер указывает версию HTTP протокола и код состояния.
  2. Нуля или нескольких полей HTTP заголовка, разделенных между собой символом CRLF.
  3. Пустой строки (в этой строке должен быть только символ CRLF), эта строка обозначает окончание полей заголовка.
  4. Необязательное тело HTTP сообщения.

Для тех кому непонятно словесное описание структуры HTTP ответа сервера приведем пример:

[php]

Response      = Status-Line               ;

*( general-header         ;

| response-header        ;

| entity-header )        ;

CRLF

[ message-body ]          ;

[/php]

Мы обозначили структуру HTTP ответа сервера. Давайте теперь рассмотрим каждую из составляющих HTTP ответа сервера в отдельности.

Строка состояния HTTP ответа сервера

Первая строка в HTTP ответе – это строка состояния, иначе Status-Line. Она состоит из версии протокола HTTP, числового кода состояния HTTP сервера и поясняющей фразы. Окончание строки состояния в HTTP ответе является символ CRLF. Пример строки состояния HTTP ответа сервера:

[php] Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF [/php]

Вот таким нехитрым образом записывается строка состояния в HTTP ответ. Да, кстати, строка состояния — это параметр HTTP.

Код состояния HTTP ответа и поясняющая фраза

О кодах состояния HTTP ответа я планирую написать несколько отдельных публикаций с пояснениями и дополнениями, а вот в этой записи мы ограничимся лишь кратким обзором кодов состояний HTTP ответа, иначе статья была бы не полной.

Вообще, правильно говорить элемент кода состояния или Status-Code – это целочисленный трехразрядный код результата понимания и удовлетворения запроса клиента. Грубо говоря, это число, которое показывает то, как сервер понял запрос клиента. К коду состояния HTTP ответа идет поясняющая фраз, которая предназначена для людей, чтобы те понимали, что в итоге случилось. Давайте сведем в таблицу коды состояний  HTTP сервера и дадим к ним пояснения:

Номер Код состояния HTTP сервера и его описание
1 1xx: информационный код состояния HTTP сервера

Все коды состояний, начинающиеся с единицы говорят клиенту о том, что их запрос получен и находится в обработке  и называются они — информационные коды состояния.
2 2xx: успешный код состояния HTTP сервера

Все коды состояний, начинающиеся с двойки говорят клиенту о том, что действие закончилось успешно: получено, понято и обработано, такие коды называются успешные HTTP коды.
3 3xx: код перенаправления HTTP сервера

Все коды состояния, начинающиеся с тройки говорят клиенту о том, что для продолжения работы ему нужно совершить какие-то действия, это коды получили название кодов перенаправления HTTP сервера.
4 4xx: коды ошибок HTTP клиента

Все коды состояния, начинающиеся с четверки говорят нам о том, что ошибка происходит по вине клиента (неверный синтаксис, устаревший протокол и прочее), из-за чего сервер не может корректно отработать и дать ответ. Их называют коды ошибок HTTP клиента.
5 5xx: коды ошибок HTTP сервера

Все коды состояний, начинающиеся с пятерки, говорят нам о том, что произошла ошибка на стороне сервера HTTP. И они получили называние коды ошибок HTTP сервера.

 

Приведем набор кодов состояний в HTTP и поясняющие фразы к ним:

[php]

Status-Code    = «100»   ; Продолжать, Continue

| «101»   ; Переключение протоколов,

; Switching Protocols

| «200»   ; OK

| «201»   ; Создан, Created

| «202»   ; Принято, Accepted

| «203»   ; Не авторская информация,

; Non-Authoritative Information

| «204»   ; Нет содержимого, No Content

| «205»   ; Сбросить содержимое, Reset

; Content

| «206»   ; Частичное содержимое, Partial

; Content

| «300»   ; Множественный выбор, Multiple

; Choices

| «301»   ; Постоянно перенесен, Moved

; Permanently

| «302»   ; Временно перемещен, Moved

; Temporarily

| «303»   ; Смотреть другой, See Other

| «304»   ; Не модифицирован, Not Modified

| «305»   ; Используйте прокси-сервер, Use

; Proxy

| «400»   ; Испорченный Запрос, Bad Request

| «401»   ; Несанкционированно, Unauthorized

| «402»   ; Требуется оплата, Payment

; Required

| «403»   ; Запрещено, Forbidden

| «404»   ; Не найден, Not Found

| «405»   ; Метод не дозволен, Method Not

; Allowed

| «406»   ; Не приемлем, Not Acceptable

| «407»   ; Требуется установление

; подлинности через прокси-сервер,

; Proxy Authentication Required

| «408»   ; Истекло время ожидания запроса,

; Request Timeout

| «409»   ; Конфликт, Conflict

| «410»   ; Удален, Gone

| «411»   ; Требуется длина, Length Required

| «412»   ; Предусловие неверно,

; Precondition Failed

| «413»   ; Объект запроса слишком большой,

; Request Entity Too Large

| «414»   ; URI запроса слишком длинный,

; Request-URI Too Long

| «415»   ; Неподдерживаемый медиа тип,

; Unsupported Media Type

| «500»   ; Внутренняя ошибка сервера,

; Internal Server Error

| «501»   ; Не реализовано, Not Implemented

| «502»   ; Ошибка шлюза, Bad Gateway

| «503»   ; Сервис недоступен, Service

; Unavailable

| «504»   ; Истекло время ожидания от шлюза,

; Gateway Timeout

| «505»   ; Не поддерживаемая версия HTTP,

; HTTP Version Not Supported

| extension-code

 

extension-code = 3DIGIT

 

Reason-Phrase  = *<TEXT не включающий CR, LF>

[/php]

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

Поля заголовка HTTP ответа

Поля заголовка HTTP ответа необходимы серверу для того, чтобы передать дополнительную информацию клиенту, которая не может быть помещена в строку состояния. Поля заголовка HTTP ответа помогают клиенту правильно обработать HTTP сообщение сервера. Так же поля заголовка HTTP ответа могут содержать дополнительную информацию о сервере и о дальнейшем доступе к ресурсу, указанному в URI (URI в HTTP):

[php]

response-header = Age                     ;

| Location                ;

| Proxy-Authenticate      ;

| Public                  ;

| Retry-After             ;

| Server                  ;

| Vary                    ;

| Warning                 ;

| WWW-Authenticate        ;

[/php]

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

Пример HTTP ответа сервера

Давайте теперь посмотрим пример HTTP ответа сервера, помните, мы запрашивали у сервера HTML документ в записи про HTTP запросы? Давайте теперь посмотрим, какой ответ нам даст HTTP сервер:

[php]

HTTP/1.1 200 OK

Date: Mon, 27 Jul 2009 12:28:53 GMT

Server: Apache/2.2.14 (Win32)

Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT

Content-Length: 88

Content-Type: text/html

Connection: Closed

<html>

<body>

<h1>Hello, World!</h1>

</body>

</html>

[/php]

А теперь давайте посмотрим, какой ответ нам даст HTTP сервер, если произойдет ошибка и сервер не сможет найти требуемую нам страницу:

[php]

HTTP/1.1 404 Not Found

Date: Sun, 18 Oct 2012 10:36:20 GMT

Server: Apache/2.2.14 (Win32)

Content-Length: 230

Connection: Closed

Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC «-//IETF//DTD HTML 2.0//EN»>

<html>

<head>

<title>404 Not Found</title>

</head>

<body>

<h1>Not Found</h1>

<p>The requested URL /t.html was not found on this server.</p>

</body>

</html>

[/php]

И третий пример покажет нам, что ответит HTTP сервер, если обнаружит, что клиент пользуется другой версией HTTP протокола:

[php]

HTTP/1.1 400 Bad Request

Date: Sun, 18 Oct 2012 10:36:20 GMT

Server: Apache/2.2.14 (Win32)

Content-Length: 230

Content-Type: text/html; charset=iso-8859-1

Connection: Closed

 

<!DOCTYPE HTML PUBLIC «-//IETF//DTD HTML 2.0//EN»>

<html>

<head>

<title>400 Bad Request</title>

</head>

<body>

<h1>Bad Request</h1>

<p>Your browser sent a request that this server could not understand.</p>

<p>The request line contained invalid characters following the protocol string.</p>

</body>

</html>

[/php]

Вот так легко и просто мы разобрались с HTTP ответами сервера.

Возможно, эти записи вам покажутся интересными


Выберете удобный для себя способ, чтобы оставить комментарий

This article has 5 comments

  1. webLamer Reply

    Спасибо за полное разъяснения кодов состояний ответ сервера и за полный список кодов в HTTP ответах, этой страничкой, как справочником пользоваться буду: очень удобно, когда всё в одном месте!

  2. Колясик Reply

    Вы писали про символ CRLF, что это такое, я понимаю, что вопрос не про HTTP ответы, так всё понятно, кроме этого преславутого CRLF.

    • Кирилл Reply

      Символ CRLF — свдивунть каретку перетянуть бумагу, что-то вроде этого, этот символ идет со времен мейнфреймов и означает перевод на новую строку. В сообщениях HTTP, не важно, запрос то или ответ, данный символ означает окончание строки. Если строка содержит только символ CRLF, то это означает окончание блока.

  3. Котейка Reply

    Кирилл, спасибо, как всегда — отлично, ясно и доступно! 🙂 Только вот не понятно какие значения могут быть в полях заголовка? Все ваши публикации пересмотрела и про сообщения и про ответа, и даже про запросы, дошла до самых первых статей в рубрике HTTP, но ответа не нашла 🙁

    • Кирилл Reply

      Про поля заголовков в HTTP сообщениях будет отдельная публикация, надеюсь, что скоро!

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Loading Disqus Comments ...