HTTP основан на модели клиент-серверной архитектуры и протоколе запросов / ответов без сохранения состояния, который работает посредством обмена сообщениями через надежное соединение TCP / IP.
HTTP-клиент — это программа (веб-браузер или любой другой клиент), которая устанавливает соединение с сервером с целью отправки одного или нескольких сообщений HTTP-запроса. HTTP-сервер — это программа (обычно веб-сервер, такой как веб-сервер Apache, IIS и т. Д.), Который принимает соединения для обслуживания HTTP-запросов путем отправки ответных HTTP-сообщений.
HTTP использует унифицированный идентификатор ресурса (URI) для идентификации данного ресурса и установления соединения. Как только соединение установлено, сообщения HTTP передаются в формате, аналогичном тому, который используется почтой Интернета [RFC5322] и Многоцелевыми расширениями почты Интернета (MIME) [RFC2045]. Эти сообщения включают в себя запросы от клиента к серверу и ответы от сервера к клиенту, которые будут иметь следующий формат:
HTTP-message = <Request> | <Response> ; HTTP/1.1 messages
HTTP-запросы и HTTP-ответы используют общий формат сообщений RFC 822 для передачи требуемых данных. Этот общий формат сообщения состоит из следующих четырех элементов.
- A Start-line
- Zero or more header fields followed by CRLF
- An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
- Optionally a message-body
В следующих разделах мы объясним каждую из сущностей, используемых в HTTP-сообщении.
Старт сообщения
Стартовая строка будет иметь следующий общий синтаксис:
start-line = Request-Line | Status-Line
Мы обсудим строку запроса и строку состояния при обсуждении сообщений HTTP Request и HTTP Response соответственно. А пока давайте посмотрим примеры строки запуска в случае запроса и ответа:
GET /hello.htm HTTP/1.1 (This is Request-Line sent by the client) HTTP/1.1 200 OK (This is Status-Line sent by the server)
Поля заголовка
Поля заголовка HTTP предоставляют необходимую информацию о запросе или ответе или об объекте, отправляемом в теле сообщения. Существует четыре типа заголовков HTTP-сообщений:
-
General-header: Эти поля заголовка имеют общую применимость как для сообщений запроса, так и для ответов.
-
Заголовок запроса: эти поля заголовка применимы только для сообщений запроса.
-
Заголовок ответа. Эти поля заголовка применимы только для ответных сообщений.
-
Заголовок объекта : Эти поля заголовка определяют метаинформацию о теле объекта или, если тело отсутствует, о ресурсе, идентифицированном запросом.
General-header: Эти поля заголовка имеют общую применимость как для сообщений запроса, так и для ответов.
Заголовок запроса: эти поля заголовка применимы только для сообщений запроса.
Заголовок ответа. Эти поля заголовка применимы только для ответных сообщений.
Заголовок объекта : Эти поля заголовка определяют метаинформацию о теле объекта или, если тело отсутствует, о ресурсе, идентифицированном запросом.
Все вышеупомянутые заголовки имеют одинаковый общий формат, и каждое поле заголовка состоит из имени, за которым следует двоеточие (:), и значения поля следующим образом:
message-header = field-name ":" [ field-value ]
Ниже приведены примеры различных полей заголовка:
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 Host: www.example.com Accept-Language: en, mi Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Accept-Ranges: bytes Content-Length: 51 Vary: Accept-Encoding Content-Type: text/plain
Тело сообщения
Часть тела сообщения является необязательной для сообщения HTTP, но если она доступна, то она используется для переноса тела объекта, связанного с запросом или ответом. Если тело объекта связано, то обычно строки заголовков Content-Type и Content-Length указывают природу связанного тела.
Тело сообщения - это то, которое содержит фактические данные HTTP-запроса (включая данные формы и загруженные данные и т. Д.) И данные ответа HTTP с сервера (включая файлы, изображения и т. Д.). Ниже показано простое содержимое тела сообщения:
<html> <body> <h1>Hello, World!</h1> </body> </html>
В следующих двух главах будут использованы объясненные выше концепции для подготовки HTTP-запросов и HTTP-ответов.