Как ранее обсуждалось на курсе фронтенд-разработки, сейчас документный обмен через сеть Интернет преимущественно с помощью веб-технологий
Так браузер на компьютере клиента, используя URL, посылает запрос по HTTP-протоколу на сервер, который отвечает набором файлов, которые задает веб-страницу с помощью языков HTML, CSS и JavaScript
Все ресурсы веб-сайтов делятся на два типа:
Работа веб-сети основана на пяти ключевых стандартах:
Протокол HTTP (HyperText Transfer Protocol, Протокол передачи гипертекста) является ключевым участником взаимодействия всех участников веб-сети
Протокол HTTP:
Веб-серверы ещё называют HTTP-серверами, браузеры - HTTP-клиентами, но клиентами могут быть и другие программы: прокси-серверы, поисковые агенты и тому подобное
HTTP работает по принципу запрос-ответ (Request-Response): клиент отправляет запрос, сервер возвращает ответ
HTTP-запрос имеет такую структуру:
МЕТОД /[имя-ресурса][?параметры-запроса] HTTP/номер-версии
Имя-заголовка-1: значение
Имя-заголовка-2: значение
[тело запроса, может отсутствовать]
Здесь:
МЕТОД - один из поддерживаемых методов. Всего есть 8 методов с разным назначением:
| Метод | Назначение |
|---|---|
GET |
Получение ресурса. Не имеет тела, а параметры передаются в строке URL |
POST |
Отправка данных на сервер, такой метод имеет тело запроса |
PUT |
Полное обновление существующего ресурса |
DELETE |
Удаление ресурса |
HEAD |
Аналог GET, но без тела ответа - только заголовки |
OPTIONS |
Запрос информации о доступных методах для ресурса |
TRACE |
Диагностика пути запроса |
CONNECT |
Установка туннеля к серверу |
Метод GET - cамый простой и распространённый метод, использующийся при вводе URL в адресную строку и переходе по ссылке. Метод не имеет тела - данные передаются в строке запроса, например:
GET /search?query=http&lang=ru HTTP/1.1
Host: example.com
Другой распространенный метод POST используется для отправки форм и создания ресурсов. Метод имеет тело запроса - данные передаются внутри сообщения, а не в URL:
POST /q HTTP/1.1
Host: finance.yahoo.com
User-Agent: Mozilla/4.75
Content-Type: application/json
Content-Length: 16
{"key": "value"}
/имя-ресурса - путь к запрашиваемому ресурсу на сервере[?параметры-запроса] - параметры запросы, хранящиеся в URL, например, https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1 – здесь три параметра v, list и start_radioномер-версии - версия протокола (1.0, 1.1 или 2.0)Имя-заголовка-1: значение - заголовокПример запроса (здесь разрывы строки обозначены \r\n):
GET / HTTP/1.1\r\n
Host: httpforever.com\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: ru\r\n
\r\n
Запрос пишется в текстовом формате, причем конец блока заголовков обозначается последовательностью \r\n\r\n. Запрос также содержит информацию о клиенте - его операционную систему (здесь это 64-битная Windows 10/11), его браузер (здесь это Microsoft Edge на базе Chromium), движок рендера (здесь это AppleWebKit), и принимаемые кодировки (например, можно заархивировать контент), форматы документов и язык контента
Некоторые строки пишутся для соблюдения совместимости. Например, Mozilla/5.0 отправляется потому, что серверы отдавали расширенный контент только браузерам Mozilla
HTTP-ответ выглядит так:
HTTP/1.1 200 OK\r\n
Server: nginx/1.18.0 (Ubuntu)\r\n
Date: Sun, 08 Mar 2026 15:13:19 GMT\r\n
Content-Type: text/html\r\n
Last-Modified: Wed, 22 Mar 2023 14:54:48 GMT\r\n
Transfer-Encoding: chunked\r\n
Connection: keep-alive\r\n
ETag: W/"641b16b8-1404"\r\n
Referrer-Policy: strict-origin-when-cross-origin\r\n
X-Content-Type-Options: nosniff\r\n
Feature-Policy: accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none'\r\n
Content-Security-Policy: default-src 'self'; script-src cdnjs.cloudflare.com 'self' 'report-sha256'; style-src cdnjs.cloudflare.com 'self' fonts.googleapis.com 'unsafe-inline'; font-src fonts.googleapis.com fonts.gstatic.com cdnjs.cloudflare.com; frame-ancestors 'none'; report-uri https://scotthelme.report-uri.com/r/d/csp/enforce
Content-Encoding: gzip\r\n
\r\n
[[HTML-документ]]
Здесь содержится информация о типе контента, сервере (nginx/1.18.0 (Ubuntu)), нужных для сайту разрешений браузера (например, геолокация - geolocation 'none')
Первая строка HTTP-ответа содержит трёхзначный код состояния, который сообщает клиенту о результате обработки запроса. Коды делятся на пять категорий:
1xx - информационные
Используются в поясняющих целях, не сообщают об успехе/неуспехе. Чаще всего встречаются при обновлении протокола (например, при подключении веб-сокета)
2xx - успешная обработка
Самые популярные из категории:
200 OK - запрос успешно выполнен, ресурс отправлен клиенту201 Created - запрос успешно выполнен, на сервере создан новый ресурс (для методов PUT/POST)204 No Content - запрос выполнен, но тело ответа отсутствует3xx - перенаправление
Клиенту нужно выполнить дополнительные действия (обычно - повторить запрос по другому URL)
301 Moved Permanently - ресурс перемещён постоянно на новый адрес302 Found - временное перенаправление303 See Other - ресурс доступен по другому URI методом GET304 Not Modified - ресурс не изменился с последнего запроса (то есть кэш актуален)307 Temporary Redirect - ресурс временно перемещён4xx - ошибки клиента
400 Bad Request - запрос неправильно сформирован401 Unauthorized - требуется аутентификация (нужен заголовок Authorization)403 Forbidden - доступ к ресурсу запрещён404 Not Found - ресурс не найден на сервере5xx - ошибки сервера
500 Internal Server Error - внутренняя ошибка сервера501 Not Implemented - сервер не поддерживает запрашиваемый метод505 HTTP Version Not Supported - версия протокола не поддерживается серверомПомимо информации в URL и теле запроса также есть заголовки - метаданные HTTP-сообщений. Они позволяют управлять сессиями, кэшированием, аутентификацией и авторизацией. Заголовки делятся на четыре группы:
Общие заголовки. Могут использоваться как в запросах, так и в ответах. Примером может быть заголовок Connection, у которого есть два значение: keep-alive - сохранить соединение (используется по умолчанию в HTTP/1.1), и close - закрыть соединение (поведение по умолчанию в HTTP/1.0)
Заголовки запроса. Клиент передаёт дополнительную информацию о себе и о запросе. Примеры:
| Заголовок | Описание |
|---|---|
Host |
Указывает, какой сайт запрашивается (нужен для виртуального хостинга) |
User-Agent |
Описывает программу, отправившую запрос (браузер, версия ОС) |
Referer |
URL страницы, с которой пришёл запрос |
Authorization |
Данные авторизации (имя/пароль). Отправляется после ответа 401 |
Заголовки ответа. Сервер передаёт дополнительную информацию об ответе. Например:
| Заголовок | Описание |
|---|---|
Server |
Информация о веб-сервере (необязательный) |
Location |
URL для перенаправления. Используется с кодами 301, 302, 303, 307 |
WWW-Authenticate |
Задаётся вместе с кодом 401. Браузер запрашивает у пользователя логин/пароль |
Заголовки содержания. Описывают тело сообщения - тип данных, длину, кодировку и так далее
Для работы веб-приложения нужен веб-сервер - серверная программа, работающая в фоновом режиме, которая принимает HTTP-запросы от клиентов и возвращает HTTP-ответы (обычно HTML-документы)
Современные веб-серверы состоят из модулей, каждый из которых отвечает за свою задачу:
Важно, что HTTP не поддерживает состояние сеанса. Вся информация о запросе содержится только в самом запросе (заголовках и теле)
Веб-сервер, как программе, нужно оборудование, на котором он будет работать. В качестве такого оборудования, где веб-сервер может хоститься (от host) могут выступать:
Выделенный сервер (Dedicated server) - физический сервер в полном единоличном использовании. Для простеньких проектов выделенным сервером может быть старый ноутбук или одноплатный компьютер, например, Raspberry Pi
К нему есть полный доступ управления, но выделенный сервер имеет высокую стоимость и требует навыков для правильной настройки, чтобы соблюсти надежность и безопасность
Виртуальный приватный сервер (Virtual Private Server, VPS) - виртуальный сервер с выделенными ресурсами
Виртуальный приватный сервер - это оборудование, доступ к которому осуществляется через операционную систему с помощью виртуализации или контейнеризации
У виртуального приватного сервера есть выделенные ресурсы (то есть соседние процессы не влияют на производительность), полный доступ в качестве суперпользователя, высокая гибкость настройки, однако такое решение все еще требует квалификации для настройки и поддержки
Разделенный сервер (Shared Hosting): несколько клиентов используют один физический сервер совместно
Самое дешёвое решение, часто идут бесплатные домены, не требует технических знаний, но сильные ограничения - нельзя настраивать порты и выбирать нестандартные решения
Управляемый сервер (Managed Hosting): провайдер предоставляет конкретное веб-приложение с административным доступом, но управление сервером остается за провайдером. Примером управляемого сервера может быть сервис Tilda
Здесь не нужно разбираться в сервере, но сервер ограничен только возможностями конкретного приложения
Провайдеры, специфичные для приложений (App-specific providers) - платформы для разработчиков с готовыми компонентами (такими как базы данных, репозитории, деплой, мониторинг). Примеры: Google AppEngine, Heroku, Render, VMware Pivotal Cloud Foundry
У таких платформ нижний порог входа по сравнению с VPS, есть автоматизация многих процессов, но функционал ограничен функциями платформы, а при росте приложения может стать дорого и тяжело мигрировать
Рассмотрим платформу Render, основанную в 2018 году. Render позиционируется как современная замена Heroku и поддерживает Node.js, Python, Go, Ruby, Java, PHP и другие языки
Render используется для:
Приложения запускаются в изолированных контейнерах, при этом одно приложение может использоваться несколькими контейнерами, что обеспечивает лёгкое масштабирование
Все подходы к разработке веб-приложений можно разделить на 3 категории:
Программные подходы состояли в создании программой на универсальном языке высокого уровня (или скрипта, который исполнялся с помощью интерпретатора)
Для этого разметка HTML и другие конструкции форматирования встраивались прямо в логику работы программы с помощью операторов вывода
Такой подход ограничивал возможность дизайнерам вносить изменения в оформление или расположение элементов, так как им пришлось открывать исходный код, знать язык программирования и другие инструменты (или помощь программиста🧑💻)
С помощью такого подхода можно динамически формировать содержимое страницы на HTTP-запрос. Первой такой технологией, которая позволила независимо от типа веб-сервера, была Common Gateway Interface (CGI, не путать с Computer-generated imagery), определявшая набор правил для программы, чтобы она могла выполняться для разных ОС и HTTP-серверов
Технология работала так:
main(), которая в стандартный поток вывода выводила HTML-страницуВыглядела она так:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
// Получение переменных окружения
char *method = getenv("REQUEST_METHOD");
char *query = getenv("QUERY_STRING"); // данные запроса
// HTTP-заголовок
printf("Content-Type: text/html; charset=utf-8\r\n\r\n");
printf("<html><body>\n");
printf("<h1>CGI Example in C</h1>\n");
// Информация о методе запроса
printf("<p>Request method: %s</p>\n", method ? method : "unknown");
// Обработка GET
if (method && strcmp(method, "GET") == 0 && query) {
printf("<h2>GET parameters:</h2>\n");
printf("<pre>%s</pre>\n", query);
}
else {
printf("<p>No data received or unsupported method.</p>\n");
}
printf("</body></html>\n");
return 0;
}
Технология CGI позволяла использовать любой язык программирования (в том числе скриптовые, такие как Python или Perl), но были недостатки:
Следующей попыткой стала технология FastCGI - в ней вместо создания нового процесса появилась возможность использования существующего
Далее для веб-сервера Internet Information Server (IIS) от Microsoft, который поставлялся с операционной системой Windows Server, был разработан интерфейс ISAPI
Этот интерфейс позволял расширить стандартные возможности веб-сервера. ISAPI представлял библиотеку функций, с помощью которой программисты могли создавать веб-приложения в виде DLL-модулей (Dynamic-Link Library), что работало намного быстрее CGI-приложений
ISAPI-расширения могут связываться с вызовом файлов, имеющих специальные расширения или содержащимися в заданных каталогах. Также были фильтры, которые использовались для изменения функциональности сервера ISS
Такие приложения обычно использовали языки С++, Delphi или платформу .NET
Потом компания Sun Microsystems (разработчик Java) создала прикладной интерфейс Java Servlet API, который связывал веб-сервер с JVM. Виртуальная машина отвечала за выполнение сервлетов (компонент расширения функционала) и программы, которая управляла данными
В отличии от ISAPI-расширений сервлеты являются переносимыми между разными серверами, ОС и компьютерными архитектурами. Сервлеты могут исполняться одинаково в любой среде, если в ней был совместимый контейнер сервлетов (такой, как Apache Tomcat)
Подходы на основе шаблонов используют в качестве объектов, доступных по URL, не скрипты, а шаблоны
Шаблоны представляют HTML-страницы, но в которых динамический контент заменен на особые теги. Сервер обрабатывает запрос, исполняет бизнес-логику и решает, что подставить вместо этих особых тегов (например, имя аккаунта или новостную ленту)
Первым таким подход стал Server Side Includes (SSI), которая позволяла встраивать особые инструкции в HTML-код:
<html>
<head><title>hello</title></head>
<body>
<! -- #exec cgi http://mysite.org/cgi-bin/example.cgi -- >
</body>
</html>
Здесь внутри <body> встраивался контент, полученный CGI-программой
Позднее компания Macromedia (разработчик почившей платформы Flash), выкупила технологию Cold Fusion у компании Allaire Corporation братьев Аллейров
Она использовала в качестве особых тегов теги с приставкой cf:
<!DOCTYPE html>
<html>
<head>
<title>Пример</title>
</head>
<body>
<h1>Добро пожаловать!</h1>
<!--- Получаем параметр name из строки запроса --->
<cfparam name="url.name" default="гость">
<p>Привет, <cfoutput>#url.name#</cfoutput>!</p>
</body>
</html>
Далее появился скриптовый язык PHP (рекурсивный акроним от PHP: Hypertext Preprocessor), который мог содержать вставки кода с логикой
<b>
<?php
if ($xyz >= 3) {
$output = $myHeading;
} else {
$output = 'DEFAULT HEADING';
}
echo $output;
?>
</b>
Такие вставки обрабатывались препроцессором PHP на стороне сервера
Далее Microsoft разрабатывает Action Server Pages (или ASP), которая объединила шаблоны и доступ к наборам OLE (Object Linking and Embedding - встраивание и линковка объектов) и COM (Component Object Model - модель компонентных объектов). Они уже позволяли получать данные из базы данных по интерфейсу ODBC (Open Database Connectivity)
В отличие от РНР, ASP не связан с одним конкретным скриптовым языком - в качестве стандартного языка используется язык Visual Basic Scripting Edition (VBScript), но может использоваться и JavaScript
Вставки в ASP оформляются в тегах <% ... %>:
<%@ Language=VBScript %>
<html>
<head>
<title>Пример</title>
</head>
<body>
<h1>Данные из базы данных (ODBC)</h1>
<%
' Создаём объект Connection
Dim conn, rs, sql
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DSN=MyDSN;UID=blablabla;PWD=blablabla67;"
' SQL‑запрос
sql = "SELECT EmployeeID, FirstName, LastName, Title FROM Employees WHERE EmployeeID = 127"
' Выполняем запрос, получаем Recordset
Set rs = conn.Execute(sql)
If Not rs.EOF Then
For Each field In rs.Fields
Response.Write "<p>" & field.Value & "</p>"
Next
Else
Response.Write "<p>Нет записей.</p>"
End If
' Закрываем объекты и освобождаем ресурсы
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
</body>
</html>
ASP позволял писать логику и обращение к базе данных прямо в HTML-странице и была встроена в веб-сервер ISS, что делало основным выбором для создания веб-приложения на Windows
SUN в ответ создает Java Server Pages (JSP) для экосистемы Java. Она позволяла встраивать Java-код внутрь HTML-страницы:
<%@ page import="java.io.*" %>
<%! private CustomObject myObject; %>
<h1>My Heading</h1>
<%
for(int i = 0; i < myObject.getCount(); i++) { %>
<p>Item #<%= i %> is '<%= myObject.getItem(i) %>' . </p>
<% } %>
Такой код преобразуется в код сервлета, а HTML-разметка - в операторы вывода. Позже появилась возможность использовать JSP-теги, такие как <jsp:useBean> для внедрения зависимостей и <jsp:getProperty> для получения значения свойства
Потом придумали объектные среды, такие как фреймворки. Фреймворки представляют платформу, определяющую структуру
Фреймворк разделяет программные модули, ответственные за создание контента (непосредственно бизнес-логика), от модулей, который ответственны за показ этого контента в определенном формате
Сейчас есть два подхода:
Подходы, основанные на наборе специальных веб-страниц, связанных с описаниями классов, объекты которых будут создаваться и использоваться при их вызове (например, ASP.Net Web Forms и JSP)
Для их создания используются специальные теги, обрабатываемые на стороне сервера
Подходы на основе использования классов, соответствующих архитектурному шаблону MVC - Модель-Представление-Контроллер (Model-View-Controller)
Шаблон MVC состоит из трех модулей:
Модель - это набор классов, реализующих бизнес-логику
Эти классы отвечают за обработку сущностей и операции с базой данных
Представление - набор шаблонов, отвечающих за взаимодействие с пользователем через интерфейс пользователя
Модуль представления формирует HTML-страницы, в которых тем или иным способом представлены сущности модели
Контроллер - связка между модулями модели и представления
Контроллер получает данные HTTP-запроса, передает их в модуль модели для обработки. Далее контроллер выбирает нужный модуль представления и передает ему данные от модели

Такое разделение веб-приложения упрощает структуру за счет более строго разделения его уровней
Таким образом, разработчик получает полный контроль над формируемым HTML-документом, и облегчается задача выполнения тестирования приложения
Примерами технологий разработки на основе MVC являются:
Домен (или предметная область) — это реальная сфера деятельности бизнеса. Модель — это абстракция, которая упрощённо описывает домен, предметы в нем и их взаимоотношений
На этом строится ключевая идея предметно-ориентированного проектирования (Domain-Driven Design, DDD) - приложение должно быть точной моделью реального бизнеса
Такой подход требует дополнительных ресурсов при проектировании архитектуры, однако полученная архитектура получается понятной для разработчиков, которые знакомы с языком домена, и позволяет бизнес-логике не зависеть от технических деталей и реализации
Для начала нужно обеспечить единый, “вездесущий” язык между разработчиками и бизнес-экспертами
Единый язык представляет из себя описание терминов, концептов и того, как бизнес должен работать
Для того, чтобы создать такой язык, для начала нужно посмотреть, как работать бизнес, определить ключевые бизнес-события, команды и процессы, и задокументировать это, используя диаграммы
Иногда домен разделяют и получают ограниченные контексты - четкие границы, внутри которых у модели и понятий единого языка есть точное значение. Так самолет в контексте продажи имеет смысл модели и количество мест в нем; для техобслуживания - это серийный номер и дата последней проверки
Далее из единого языка выделяют сущности - представления вещей в нашей проблемной области
Например, для того, чтобы сделать карту метро, помогающую составить маршрут, нужны сущности:
Сущность обладает некоторыми свойствами:
Сущности - ключевое понятие в предметно-ориентированном дизайне, но чаще всего на уровне кода разработчики оперируют с объектами со значениеми (Value Object). Они:
Также сущности содержат бизнес-логику. Модель, где бизнес-логика содержится в сервисах, а не сущностях, называется анемичной и считается анти-паттерном
Также выделяют агрегат - группу сущностей и объектов со значениями, которая должна оставаться последовательно при сохранении
Далее идут сервисы - представления бизнес-процессов в предметной области. Сервис представляют поведения сущностей, у них нет внутреннего состояния, и чаще всего они соединяют множество объектов
Для сохранения состояния сущностей используют:
Также используют репозиторий для связи с агрегатом
Далее идет прикладной слой, который включает прикладные сервисы - они координируют управлением, то есть вызывают репозитории, запускают доменные сервисы, управляют транзакциями
За ним идет инфраструктурный слой. Инфраструктурные сервисы не содержат бизнес-логики, а только базовые инструменты для поддержания инфраструктуры (например, сервис для отправки сообщения по электронной почте)