API - интерфейсы прикладного программирования
API
API
Человек общается с компьютером через ввод и вывод - соответствующие устройства. А устройство, точнее, его компоненты между собой, общаются через череду сигналов. Эти сигналы структурируются в наборы данных, которые отправляются пакетами по протоколам. Но как программы друг друга понимают? Ответ - при помощи единообразия, в виде API.
Приложение А отправляет запросы в Приложение Б, получает на них ответы. Аналогично и Приложение Б шлёт запросы, получая ответы. Они оба общаются на едином языке и придерживаются определённых правил. Эти правила - API.
API (Application Programming Interface) — это набор правил, методов и инструментов, позволяющих различным программам или сервисам взаимодействовать друг с другом. Можно привести в пример реальную жизнь - когда вы приходите в ресторан, вы не говорите напрямую поварам свои пожелания - к вам подходит официант, предоставляет меню с возможным ассортиментом, вы выбираете нужный, даёте указания официанту, который и действует аналогично API - посредник между вами и кухней.
API обычно состоит из:
- Точек доступа (endpoints, эндпоинты) — URL, по которым можно обращаться.
- Методов HTTP — GET, POST, PUT, PATCH, DELETE и др.
- Параметров запроса — пути, строка запроса (query string), заголовки, тело.
- Формата данных — JSON, XML, Protobuf и т.д.
- Документации — описание возможностей, примеры использования, ограничения.
Контракт интерфейса
Контракт интерфейса — это формальное соглашение между разработчиками клиента и сервера. Он описывает, как сервисы взаимодействуют друг с другом.
Контракт определяет доступные методы, адреса ресурсов, форматы входных и выходных данных, возможные коды ответов. Он служит основой для разработки, тестирования и документирования.
OpenAPI
Что такое Open API
OpenAPI — это стандарт для описания веб-API. Ранее стандарт назывался Swagger. Спецификация позволяет описать интерфейс в формате YAML или JSON.

Преимущества использования спецификации:
- Автоматическая генерация документации
- Создание клиентских библиотек для разных языков
- Генерация серверного кода
- Валидация запросов и ответов
- Визуализация через инструменты вроде Swagger UI
Базовая структура документа в формате YAML:
openapi: 3.1.0
info:
title: API для управления задачами
description: Сервис для создания, чтения, обновления и удаления задач
version: 1.0.0
servers:
- url: https://api.example.com/v1
description: Продуктивный сервер
- url: https://dev-api.example.com/v1
description: Тестовый сервер
Описание путей и методов
Раздел paths содержит описание всех доступных адресов и методов:
paths:
/tasks:
get:
summary: Получить список всех задач
description: Возвращает массив задач с возможностью фильтрации
parameters:
- name: status
in: query
description: Фильтр по статусу задачи
required: false
schema:
type: string
enum: [pending, completed, cancelled]
- name: limit
in: query
description: Максимальное количество задач в ответе
required: false
schema:
type: integer
default: 20
minimum: 1
maximum: 100
responses:
'200':
description: Успешный ответ
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Task'
'401':
description: Неавторизованный доступ
post:
summary: Создать новую задачу
description: Добавляет задачу в систему
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TaskCreate'
responses:
'201':
description: Задача создана
content:
application/json:
schema:
$ref: '#/components/schemas/Task'
'400':
description: Некорректные данные
'401':
description: Неавторизованный доступ
/tasks/{taskId}:
get:
summary: Получить задачу по идентификатору
parameters:
- name: taskId
in: path
description: Уникальный идентификатор задачи
required: true
schema:
type: integer
minimum: 1
responses:
'200':
description: Задача найдена
content:
application/json:
schema:
$ref: '#/components/schemas/Task'
'404':
description: Задача не найдена
put:
summary: Обновить задачу полностью
parameters:
- name: taskId
in: path
required: true
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TaskUpdate'
responses:
'200':
description: Задача обновлена
content:
application/json:
schema:
$ref: '#/components/schemas/Task'
'404':
description: Задача не найдена
patch:
summary: Частично обновить задачу
parameters:
- name: taskId
in: path
required: true
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TaskPatch'
responses:
'200':
description: Задача обновлена
content:
application/json:
schema:
$ref: '#/components/schemas/Task'
delete:
summary: Удалить задачу
parameters:
- name: taskId
in: path
required: true
schema:
type: integer
responses:
'204':
description: Задача удалена
'404':
description: Задача не найдена
Описание схем данных
Раздел components/schemas содержит определения моделей данных:
components:
schemas:
Task:
type: object
required:
- id
- title
- status
- createdAt
properties:
id:
type: integer
description: Уникальный идентификатор задачи
example: 123
title:
type: string
description: Заголовок задачи
maxLength: 200
example: "Подготовить отчет"
description:
type: string
description: Подробное описание задачи
nullable: true
example: "Собрать данные за квартал и оформить презентацию"
status:
type: string
description: Текущий статус задачи
enum: [pending, completed, cancelled]
example: "pending"
priority:
type: string
description: Приоритет задачи
enum: [low, medium, high]
default: "medium"
example: "high"
dueDate:
type: string
format: date-time
description: Срок выполнения задачи
nullable: true
example: "2026-03-15T18:00:00Z"
createdAt:
type: string
format: date-time
description: Дата и время создания задачи
example: "2026-02-26T10:30:00Z"
updatedAt:
type: string
format: date-time
description: Дата и время последнего обновления
nullable: true
example: "2026-02-26T14:45:00Z"
TaskCreate:
type: object
required:
- title
properties:
title:
type: string
maxLength: 200
description:
type: string
nullable: true
status:
type: string
enum: [pending, completed, cancelled]
default: "pending"
priority:
type: string
enum: [low, medium, high]
default: "medium"
dueDate:
type: string
format: date-time
nullable: true
TaskUpdate:
type: object
required:
- title
- description
- status
- priority
- dueDate
properties:
title:
type: string
maxLength: 200
description:
type: string
nullable: true
status:
type: string
enum: [pending, completed, cancelled]
priority:
type: string
enum: [low, medium, high]
dueDate:
type: string
format: date-time
nullable: true
TaskPatch:
type: object
properties:
title:
type: string
maxLength: 200
description:
type: string
nullable: true
status:
type: string
enum: [pending, completed, cancelled]
priority:
type: string
enum: [low, medium, high]
dueDate:
type: string
format: date-time
nullable: true
Типы данных в схемах
В схемах можно использовать следующие типы:
string— текстовая строкаinteger— целое числоnumber— число с плавающей точкойboolean— логическое значениеarray— массив значенийobject— объект с полями
Для строковых полей доступны форматы:
date— дата в форматеYYYY-MM-DDdate-time— дата и время в формате ISO 8601email— адрес электронной почтыuuid— универсальный уникальный идентификаторuri— универсальный идентификатор ресурса
Обязательность полей
Ключевое слово required определяет, какие поля обязательны для заполнения. Список обязательных полей указывается в виде массива строк с именами полей.
Поле nullable: true разрешает передавать значение null для опциональных полей.
Ограничения значений
Для числовых полей можно задать ограничения:
minimum— минимальное значениеmaximum— максимальное значениеexclusiveMinimum— строгое ограничение снизуexclusiveMaximum— строгое ограничение сверху
Для строковых полей:
minLength— минимальная длина строкиmaxLength— максимальная длина строкиpattern— регулярное выражение для валидации
Для массивов:
minItems— минимальное количество элементовmaxItems— максимальное количество элементовuniqueItems— требование уникальности элементов
Примеры данных
Ключевое слово example или examples позволяет привести образцы данных. Это помогает понять формат запросов и ответов без дополнительных пояснений.
Коды ответов HTTP
Стандартные коды состояния:
200— успешный запрос201— ресурс создан204— успешный запрос без тела ответа400— некорректный запрос401— неавторизованный доступ403— запрещенный доступ404— ресурс не найден409— конфликт при создании или обновлении422— ошибки валидации данных500— внутренняя ошибка сервера
Версионирование API
Версионирование позволяет вносить изменения в интерфейс без нарушения работы существующих клиентов.
Способы указания версии:
В пути:
GET /v1/tasks
GET /v2/tasks
В заголовке:
GET /tasks
Accept: application/vnd.example.v1+json
В параметре запроса:
GET /tasks?version=1
Рекомендуемый подход — указание версии в пути. Это делает версию явной и упрощает маршрутизацию запросов.
Параметры запроса
Параметры могут передаваться разными способами:
В пути (path):
GET /tasks/123
В строке запроса (query):
GET /tasks?status=pending&limit=10
В заголовках (header):
Authorization: Bearer token123
В теле запроса (body):
{
"title": "Новая задача",
"priority": "high"
}
Форматы содержимого
Наиболее распространенные форматы:
application/json— данные в формате JSONapplication/xml— данные в формате XMLmultipart/form-data— передача файловapplication/x-www-form-urlencoded— форма в кодировке URL
Документирование
Поля summary и description содержат краткое и подробное описание операции. Поле description поддерживает форматирование Markdown для создания структурированной документации.
Валидация данных
Спецификация позволяет описать правила валидации для входных данных. Это обеспечивает согласованность формата запросов и ответов между клиентом и сервером.
Автоматизация
На основе спецификации можно генерировать:
- Документацию в формате HTML
- Клиентские библиотеки для различных языков программирования
- Серверный код с заглушками для обработчиков
- Тесты для проверки соответствия реализации спецификации
SDK
SDK (Software Development Kit) — это набор готовых библиотек, инструментов и примеров кода, предназначенных для работы с определённым API. Используется тогда, когда хочется не писать HTTP-запросы вручную, а использовать удобный интерфейс на своём языке.
К примеру, Telegram предоставляет такой набор инструментов, благодаря чему на стороне сервера нужно лишь подключить библиотеку, указать токен и использовать готовые методы для работы без необходимости расписывать логику базовых действий, к примеру, отправки сообщений. SDK скрывает сетевые детали и предоставляет простой интерфейс.
REST
Что такое REST?
REST API (Representational State Transfer) является архитектурным стилем, использующем стандартные HTTP-методы. Это самый распространённый подход для реализации веб-сервисов - можно просто определить эндпоинт, методы, параметры, формат и разработать серверный бэкенд-код, который будет «принимать» запросы и «отвечать» на них. На стороне клиента проблем ещё меньше - там просто нужно, к примеру, сделать кнопку, которая будет формировать запрос и отправлять его по эндпоинту.
Он основан на следующих принципах:
- Стандартные методы HTTP.
- Ресурсо-ориентированная адресация (URL как ресурсы).
- Отсутствие состояния (stateless).
- Поддержка разных форматов данных (обычно JSON или XML).
REST (Representational State Transfer) — это архитектурный стиль для создания веб-сервисов, основанный на использовании HTTP-протокола. REST API предоставляет набор правил для взаимодействия между клиентом и сервером через стандартные HTTP-методы.
Этот подход лучше использовать для простых CRUD-операций, и если нужно разработать API быстро, без лишней настройки.
Каждый ресурс имеет уникальный URL (Uniform Resource Locator), а данные отправляются, как правило, в формате JSON или XML. Каждый запрос содержит всю необходимую информацию для его обработки. Сервер не хранит состояние клиента между запросами. Чуть позже мы углубимся в API и REST.
Документацией REST можно считать документацию HTTP.
Стандартные методы HTTP, используемые в REST:
- GET — получение данных.
- POST — создание нового ресурса.
- PUT/PATCH — обновление существующего ресурса.
- DELETE — удаление ресурса.
RESTful
Приложение, следующее принципам REST, называется RESTful.
RESTful API представляет собой интерфейс для взаимодействия между клиентом и сервером через стандартные методы протокола HTTP. Каждый ресурс в системе имеет уникальный идентификатор — адрес (URL), по которому к нему можно обратиться.
Архитектура REST основана на шести ключевых принципах:
- Клиент-серверная модель разделяет пользовательский интерфейс от обработки данных. Клиент отвечает за представление информации, сервер — за хранение и управление ресурсами. Такая декомпозиция упрощает разработку и масштабирование.
- Отсутствие состояния означает, что каждый запрос от клиента к серверу содержит всю необходимую информацию для его обработки. Сервер не сохраняет контекст предыдущих запросов. Каждое взаимодействие автономно и независимо.
- Кэширование позволяет клиенту или промежуточным прокси хранить ответы сервера для повторного использования. Это снижает нагрузку на сервер и ускоряет работу приложения. Ответы должны явно указывать, можно ли их кэшировать.
- Единообразие интерфейса обеспечивает согласованный способ взаимодействия с ресурсами. Ресурсы идентифицируются через стандартные адреса, операции выполняются через стандартные методы, сообщения передаются в стандартных форматах.
- Многоуровневая система позволяет строить архитектуру из нескольких слоев. Клиент взаимодействует с промежуточными серверами, которые могут выполнять функции балансировки нагрузки, безопасности или кэширования, не зная о конечном сервере.
- Код по требованию является опциональным принципом. Сервер может передавать клиенту исполняемый код, расширяющий его функциональность. Этот принцип применяется редко в современных веб-API.
Создание REST API
Как создать свой REST API?
- Определить, какие данные будут передаваться.
- Определить, какие операции нужно поддерживать (CRUD: Create, Read, Update, Delete).
- Определить, кто будет использовать API (фронтенд, мобильное приложение, другие сервисы).
- Выбрать и определить базовый путь, например, /api/v1.
- Для каждого типа данных определить URL-пути:
- GET /users – получить список пользователей
- GET /users/123 – получить пользователя с ID 123
- POST /users – создать нового пользователя
- PUT /users/123 – обновить пользователя
- DELETE /users/123 – удалить пользователя
- Определить необходимость и добавить параметры запроса - фильтрация, сортировка, пагинация.
- Определить формат обмена данными (обычно JSON).
- Определить структуру запросов и ответов, к примеру:
// Пример запроса
{
"name": "John",
"email": "john@example.com"
}
// Пример ответа
{
"id": 123,
"name": "John",
"created_at": "2025-04-05T10:00:00Z"
}
- Настроить маршруты (роутинг) - сопоставить URL + HTTP-метод → обработчик.
- В обработчиках нужно написать возможности:
- чтения входящих данных из заголовков, строки запроса или тела;
- проверку данных (валидацию);
- обращение к БД или другому источнику данных (например, файл);
- формирование ответа - статус, заголовки, тело;
- обработка ошибок.
Обычно в готовых SDK уже имеются некоторые написанные решения, порой можно просто пользоваться имеющимися свойствами и методами объектов.
- Добавить авторизацию (если нужна, но очевидно она всегда нужна для безопасности) - JWT, OAuth, API ключи. По возможности, кстати, нужно придерживаться и иных мер безопасности - использование HTTPS, ограничение доступа по CORS, валидация данных и логирование действий.
- Задокументировать, указав описание всех эндпоинтов, примеры запросов и ответов, описание кодов и ошибок. Для этого можно использовать Open API / Swagger.
- Проверять работу всех методов можно через Postman, curl, Swagger UI.
- После тестирования, сервис разворачивается на бэкенд-сервере, допустим на хостинге, и когда будет определен хост, можно будет уже отправлять запросы. До этого момента, на этапе тестирования, его можно выполнять на локальной машине.
Итого:
- клиент отправляет HTTP-запрос на конкретный URL;
- сервер определяет маршрут и вызывает функцию-обработчик;
- обработчик получает данные, может взаимодействовать с БД или даже другими API;
- сервер формирует HTTP-ответ и отправляет его обратно клиенту.

REST — это стиль, а не строгий протокол, может быть реализован на любом языке программирования, легко масштабируется, хорошо документируется.
Другие API
А как же другие API?
GraphQL API запрашивает только нужные данные, гибко управляя структурой ответа, используется для SPA, микросервисов, сложных данных.
SOAP API более старый протокол с жёсткой структурой, основанный на XML. Его можно встретить в устаревших корпоративных системах.
gRPC API высокопроизводительный (ведь там RPC-протокол), работает поверх HTTP/2, использует Protobuf. В высоконагруженных системах с микросервисами можно часто встретить такой стиль.
WebSocket API, как мы уже не раз отметили, использует двустороннее постоянное соединение.
SSE (Server-Sent Events) использует одностороннюю передачу данных от сервера к клиенту - новости, уведомления, мониторинг.
OAuth 2.0 API — это протокол авторизации, который позволяет приложениям получать ограниченный доступ к ресурсам пользователя без необходимости знать его пароль. К примеру, это авторизация через Google/Facebook, подключение к Google Drive или Dropbox, работа с банковскими API. OAuth 2.0 использует токены , такие как:
- access_token — временный ключ для доступа к ресурсам
- refresh_token — для получения нового access_token
Front API — это не общепринятый термин, но его можно интерпретировать как API, которое используется для взаимодействия с фронтендом (клиентской частью) приложения. В более широком смысле это может означать:
- API для клиентских приложений - предоставление данных и функциональности для веб-приложений, мобильных приложений или десктопных клиентов.
- REST/GraphQL API - часто такие API используются для передачи данных между сервером и клиентом.
Кстати говоря о фронте, следует отметить, что как раз для работы с API в JavaScript используют метод fetch():
fetch('/api/user/profile', {
method: 'GET',
headers: { Authorization: 'Bearer <token>' }
})
fetch() — это встроенный в браузер метод , позволяющий отправлять HTTP-запросы к серверу и получать данные без перезагрузки страницы. Он возвращает Promise , который разрешается в объект ответа (Response), а затем можно обработать тело ответа (например, как JSON или текст). Синтаксис прост - fetch(input, init). input это URL, по которому делается запрос (строка) или объект Request, а init (необязательный) это объект с настройками запроса: метод, заголовки, тело и т.д.
После вызова fetch(), вы получаете объект Response.
Основные свойства Response:
- .ok — возвращает true, если статус 200–299.
- .status — HTTP-статус ответа (например, 200, 404).
- .statusText — текстовое описание статуса (например, "OK", "Not Found").
- .headers — объект Headers, содержащий заголовки ответа.
- .url — фактический URL ответа (может отличаться от запрошенного при редиректах).
Методы для получения тела:
- .json() — парсит тело как JSON.
- .text() — возвращает тело как строку.
- .blob() — возвращает как Blob (например, изображения).
- .formData() — возвращает как FormData.
- .arrayBuffer() — возвращает как массив ArrayBuffer.
fetch() подчиняется политике CORS (Cross-Origin Resource Sharing), если сервер не разрешает кросс-доменные запросы, браузер блокирует их, а для авторизации может потребоваться установка заголовков или использование credentials.
Web API — это общий термин, обозначающий API, доступные через веб-интерфейс. Это могут быть как серверные API (например, REST, GraphQL), так и клиентские API (например, браузерные API).
Основные типы Web API:
Серверные API :
- RESTful API: стандартный подход к созданию веб-сервисов.
- GraphQL API: гибкий запрос данных с возможностью выбора полей.
- SOAP API: устаревший протокол для веб-сервисов.
Клиентские API :
- DOM API: управление HTML-документами в браузере.
- Fetch API: выполнение HTTP-запросов из браузера.
- Geolocation API: получение географических данных пользователя.
Fluent API — это стиль программирования, при котором методы возвращают объект, позволяя «цеплять» вызовы методов друг за другом. Используется в ORM, билдерах SQL, тестовых фреймворках. Этот подход часто используется для создания удобного и читаемого кода.
FastAPI — это современный веб-фреймворк для создания API на Python. Он известен своей высокой производительностью, простотой использования и поддержкой асинхронного программирования. Основан на на Starlette и Pydantic, что делает его одним из самых быстрых фреймворков.
Чит-лист FastAPI - https://cheatsheets.zip/fastapi
Starlette — это лёгкий и быстрый веб-фреймворк для Python, предназначенный для создания асинхронных веб-приложений и API. Он является основой таких проектов, как FastAPI , и известен своей производительностью и гибкостью.
Pydantic — это библиотека Python для валидации данных и управления конфигурацией с использованием аннотаций типов. Она автоматически проверяет данные на соответствие ожидаемым типам и структурам.
SignalR — это библиотека для ASP.NET Core, которая позволяет реализовать реальное взаимодействие между клиентом и сервером. Она поддерживает двустороннюю связь через WebSocket, Server-Sent Events (SSE) и Long Polling. Именно оно используется для чатов, онлайн-игр, обновлений.
Long Polling — это техника для реализации асинхронного взаимодействия между клиентом и сервером в веб-приложениях. Она позволяет клиенту ожидать новые данные от сервера, не отправляя постоянные запросы.
Как работает:
- Клиент отправляет HTTP-запрос на сервер.
- Сервер держит соединение открытым до тех пор, пока не появятся новые данные или истечет таймаут.
- Как только данные доступны, сервер отправляет ответ, и клиент сразу же отправляет новый запрос.
Каждая программа, которая поддерживает какой-то свой метод взаимодействия, может предоставлять свой интерфейс, и как правило, он будет характерен именно для взаимодействия соответствующего продукта - Kubernetes API, Telegram API, Windows API, WhatsApp API, Google Maps API, Twitter/X API и прочие.