October 7

Клиент-серверная архитектура

Клиент-серверная архитектура — это модель взаимодействия между двумя частями системы: клиентом и сервером. Клиент отправляет запросы серверу, а сервер обрабатывает эти запросы и отправляет ответ.

Основные компоненты:

  1. Клиент — это программа, которая запрашивает информацию или сервис у сервера. Пример: браузер, отправляющий запрос на сайт.
  2. Сервер — это программа, которая получает запросы от клиентов и отправляет ответы. Пример: веб-сервер, который обрабатывает запросы браузера и возвращает веб-страницы.

Пример:

Когда ты заходишь на сайт, браузер (клиент) отправляет запрос на сервер сайта. Сервер обрабатывает запрос и отправляет в ответ HTML-страницу, которая отображается у тебя в браузере. Например:

  • Клиент запрашивает: "Дай страницу example.com".
  • Сервер отвечает: "Вот страница".

Как это работает:

  1. Запрос клиента: клиент отправляет запрос на сервер через интернет.
  2. Обработка на сервере: сервер получает запрос и обрабатывает его (например, получает данные из базы данных).
  3. Ответ сервера: сервер возвращает ответ, который клиент отображает.

Виды клиент-серверных архитектур:

  • Одноуровневая: все запросы и ответы проходят между клиентом и одним сервером.
  • Многоуровневая (трёхуровневая): данные хранятся на одном сервере (например, база данных), а приложения обрабатываются на другом (например, веб-сервер).

Пример с многоуровневой архитектурой:

  1. Клиент отправляет запрос на сервер приложения.
  2. Сервер приложения обрабатывает запрос и взаимодействует с сервером базы данных.
  3. Сервер базы данных отправляет данные обратно на сервер приложения, который передаёт их клиенту.

HTTP-запрос

HTTP-запрос — это сообщение, которое клиент (например, браузер) отправляет на сервер для получения информации или выполнения действия. Запрос состоит из следующих частей:

1. Стартовая строка (Request Line)

Определяет тип запроса, URL-адрес и версию протокола.

  • Метод: определяет тип операции (GET, POST, PUT, DELETE и т.д.).
  • URL: адрес ресурса на сервере.
  • Версия протокола: указывает версию HTTP (например, HTTP/1.1).

Пример стартовой строки:

GET /profile/123 HTTP/1.1

Здесь:

  • GET — метод запроса.
  • /profile/123 — путь к ресурсу (профиль пользователя с ID 123).
  • HTTP/1.1 — версия HTTP.

2. Заголовки (Headers)

Передают дополнительную информацию о запросе, такую как тип данных, тип клиента (браузера), авторизацию и т.д. Каждая пара «ключ-значение» записывается в новой строке.

Пример заголовков:

Host: example.com

User-Agent: Mozilla/5.0

Accept: text/html

Authorization: Bearer <token>

Здесь:

  • Host: example.com — сервер, к которому направлен запрос.
  • User-Agent: Mozilla/5.0 — информация о клиенте.
  • Accept: text/html — тип содержимого, который клиент ожидает получить (HTML в данном случае).
  • Authorization — используется для передачи токенов авторизации.

3. Тело (Body)

Тело запроса передаётся только в методах, которые требуют передачи данных (например, POST или PUT). В GET-запросах тело обычно отсутствует.

Пример тела POST-запроса:

{

"username": "john",

"password": "12345"

}

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

HTTP-ответ — это сообщение, которое сервер отправляет клиенту в ответ на запрос. Он также состоит из нескольких частей:

1. Стартовая строка (Status Line)

Содержит информацию о статусе запроса:

  • Версия протокола: версия HTTP (например, HTTP/1.1).
  • Код состояния: трёхзначное число, которое указывает результат запроса.
  • Сообщение состояния: текстовое описание кода состояния.

Пример стартовой строки ответа:

HTTP/1.1 200 OK

Здесь:

  • HTTP/1.1 — версия HTTP.
  • 200 — код состояния (успех).
  • OK — текстовое описание статуса.

2. Заголовки (Headers)

Содержат метаданные об ответе, такие как тип содержимого, длина данных, кэширование и т.д.

Пример заголовков:

Content-Type: application/json

Content-Length: 347

Здесь:

  • Content-Type: application/json — тип данных в теле ответа (JSON).
  • Content-Length: 347 — длина содержимого в байтах.

3. Тело (Body)

Содержит данные, которые сервер отправляет клиенту, например, HTML-страницу, JSON-объект или файл. Тело может отсутствовать в некоторых ответах, например, при коде 204 No Content.

Пример тела JSON-ответа:

{ "id": 123, "name": "John Doe", "email": "[email protected]" }

Пример полного HTTP-запроса и ответа

HTTP-запрос (GET):

GET /profile/123 HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Accept: application/json Authorization: Bearer abc123

HTTP-ответ:

HTTP/1.1 200 OK Content-Type: application/json Content-Length: 87

{ "id": 123, "name": "John Doe", "email": "[email protected]" }