Ответ
Контракт API — это формальное соглашение, определяющее правила взаимодействия между клиентом и сервером. Он включает следующие ключевые компоненты:
Основные элементы API-контракта:
- Эндпоинты (URL-адреса) — пути к ресурсам (например,
/api/users,/api/orders/{id}) - HTTP-методы — операции над ресурсами: GET, POST, PUT, PATCH, DELETE
- Параметры запроса — три типа:
- Path parameters (
/users/{id}) - Query parameters (
?page=1&limit=10) - Headers (
Authorization: Bearer <token>)
- Path parameters (
- Тело запроса и ответа — формат данных (обычно JSON или XML) и их структура
- Коды состояния HTTP — 200 (OK), 201 (Created), 400 (Bad Request), 404 (Not Found), 500 (Internal Server Error)
- Схемы данных (модели) — точное определение структуры объектов, включая типы полей, обязательность и валидацию
- Аутентификация и авторизация — используемые механизмы: API-ключи, OAuth 2.0, JWT-токены
- Скоростные ограничения (Rate limiting) — правила ограничения количества запросов
- Ошибки и их формат — унифицированная структура сообщений об ошибках
Пример контракта в формате OpenAPI (Swagger):
openapi: 3.0.0
paths:
/users/{userId}:
get:
summary: Получить пользователя по ID
parameters:
- name: userId
in: path
required: true
schema:
type: integer
responses:
'200':
description: Успешный ответ
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'404':
description: Пользователь не найден
components:
schemas:
User:
type: object
required:
- id
- name
properties:
id:
type: integer
example: 42
name:
type: string
example: "Иван Иванов"
email:
type: string
format: email
Практическое значение: Четкий контракт позволяет фронтенд- и бэкенд-разработчикам работать параллельно, автоматически генерировать клиентский код и документацию, а также создавать стабильные интеграционные тесты.
Ответ 18+ 🔞
Да ты послушай, что за дичь творят эти ваши айтишники! Сидят, блядь, и договариваются, как им друг с другом общаться, как будто на базаре не поделили что-то. А на деле-то — контракт API, сука! Это как устав в армии, только для серверов и клиентов. Нарушил — получи пизды в виде пятисотой ошибки.
Вот смотри, из чего эта бумажка состоит, чтобы не быть, прости господи, распиздяем:
Что там внутри, в этой хуйне:
- Эндпоинты (URL-адреса) — это типа адреса квартир, куда стучаться.
/api/users— все жильцы,/api/orders/{id}— конкретный заказ, где{id}это номер квартиры, блядь. - HTTP-методы — это что ты делать собрался в этой квартире. Пришёл GET — посмотреть, что внутри. POST — занести новый диван. PUT или PATCH — старый диван переставить. DELETE — диван нахуй выкинуть.
- Параметры запроса — а это ты с чем пришёл-то? Три вида:
- Path parameters (
/users/42) — номер в паспорте, прямо в адресе. - Query parameters (
?page=1&limit=10) — как в магазине: «Дайте десяток, начиная с первой полки». - Headers (
Authorization: Bearer <token>) — это типа пропуск на территорию, шепчешь на ухо охраннику.
- Path parameters (
- Тело запроса и ответа — суть разговора. Обычно на языке JSON, чтоб всем понятно было. «Хочу вот такой диван (JSON)» — «Получай, мудак, вот такой диван (тоже JSON)».
- Коды состояния HTTP — эмоции сервера. 200 — «всё пиздато, на». 201 — «диван занёс, молодец». 400 — «ты мне какую-то хуйню прислал, переделывай». 404 — «такой квартиры, идиот, нет». 500 — «у меня внутри всё ебнулось, иди погуляй».
- Схемы данных (модели) — чертёж дивана. Жёсткая инструкция: длина — число, цвет — строка, а
isComfy— булевый, обязательный, ёпта! Без этого — не соберёшь. - Аутентификация и авторизация — как докажешь, что ты не верблюд и имеешь право диван трогать. API-ключ, OAuth, JWT-токен — без этой бумажки ты хуй, а не клиент.
- Скоростные ограничения (Rate limiting) — чтоб не дрочил API без остановки. «Больше ста запросов в минуту — получи по ебалу и иди поспи».
- Ошибки и их формат — чтобы когда всё ебнулось, было понятно, ЧТО именно. Не просто «ошибка», а «Вася, у тебя в поле
emailвместо почты —ыфвафыва, иди исправляй, кретин».
Вот тебе пример, как это на их охуенном языке OpenAPI выглядит:
openapi: 3.0.0
paths:
/users/{userId}:
get:
summary: Получить пользователя по ID
parameters:
- name: userId
in: path
required: true
schema:
type: integer
responses:
'200':
description: Успешный ответ
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'404':
description: Пользователь не найден
components:
schemas:
User:
type: object
required:
- id
- name
properties:
id:
type: integer
example: 42
name:
type: string
example: "Иван Иванов"
email:
type: string
format: email
А зачем этот цирк, спросишь? А затем, чувак, чтобы фронтендер, который кнопочки рисует, и бэкендер, который с базой данных ебется, могли работать отдельно и не орать друг на друга каждый день. По контракту можно даже код сгенерить автоматом и тесты написать. Короче, доверия ебать ноль, поэтому всё на бумаге, в рот меня чих-пых!