Bezdepbonusu7Программирование: статьи и ответы

Основы веба

Что такое API: объясняем простыми словами на примерах

Редакция Bezdepbonusu78 мин чтения

API - это набор правил, по которым программы обмениваются данными: клиент отправляет запрос, сервер возвращает ответ, чаще всего в JSON. Разбираем, как устроен REST API, что такое эндпоинты и методы, и отправляем первые запросы из терминала, Python и JavaScript.

Сетевые кабели серверной стойки, через которые идут запросы к API
Фото: Federal Bureau of Investigation, Public domain, Wikimedia Commons
Содержание
  1. Суть API
  2. Виды API
  3. Принципы REST
  4. Методы и эндпоинты
  5. Запрос и ответ
  6. Первый запрос
  7. Ключи и лимиты
  8. Частые ошибки
  9. Инструменты
  10. Частые вопросы

Что такое API простыми словами

API (Application Programming Interface, программный интерфейс приложения) - это набор правил, по которым одна программа просит другую что-то сделать или отдать данные. Программа-клиент отправляет запрос в оговорённом формате, программа-сервер отвечает тоже в оговорённом формате. Как устроен сервер внутри, клиенту знать не нужно.

Удобная аналогия - меню в кафе. Вы не идёте на кухню и не командуете поваром. Вы выбираете позицию из меню, официант передаёт заказ, через какое-то время приносит блюдо. Меню и есть API: список того, что можно заказать, и правила, как это сделать. Если попросить блюдо, которого в меню нет, вы получите отказ, а не импровизацию повара.

С API вы сталкиваетесь каждый день, даже если не пишете код:

  • приложение погоды берёт прогноз у метеосервиса через его API;
  • кнопка "Войти через Яндекс ID" или "Войти через VK" работает через API этих сервисов;
  • интернет-магазин передаёт сумму платёжному шлюзу и получает статус оплаты;
  • бот в Telegram получает и отправляет сообщения через Telegram Bot API.

Для разработчика API - это способ не изобретать всё самому. Не нужно строить свою карту, если можно запросить координаты у картографического сервиса. Не нужно хранить курсы валют, если их отдаёт банк.

Какие бывают API

Слово API используют в нескольких смыслах, и новичков это путает. Когда на собеседовании спрашивают "работали с API?", почти всегда имеют в виду веб-API, то есть обмен данными по сети через HTTP. Но есть и другие варианты.

ВидГде встречаетсяПример
REST APIБольшинство публичных веб-сервисовGET /users/42 возвращает пользователя в JSON
GraphQLСложные интерфейсы, где клиент сам выбирает поляОдин адрес /graphql, запрос описывает нужные поля
gRPCОбщение микросервисов внутри компанииБинарный формат Protocol Buffers, высокая скорость
SOAPБанки, госсистемы, старые корпоративные системыXML-конверты и строгая схема WSDL
API библиотекиЛюбой язык программированияФункции модуля json в Python
API браузераФронтендfetch, localStorage, Geolocation API

Дальше речь пойдёт о REST API: с него начинают почти все, и именно его чаще всего просят в вакансиях junior-разработчиков.

REST API: принципы без зубрёжки

REST - это не протокол и не библиотека, а архитектурный стиль. Его описал Рой Филдинг в диссертации 2000 года. На практике REST API - это API поверх HTTP, которое придерживается нескольких договорённостей:

  1. Всё - ресурсы. Пользователь, заказ, товар. У каждого ресурса есть адрес: /users - список пользователей, /users/42 - конкретный пользователь.
  2. Действие задаёт HTTP-метод, а не адрес. Правильно DELETE /users/42, неправильно GET /deleteUser?id=42.
  3. Сервер не помнит клиента между запросами (stateless). Каждый запрос несёт всё нужное, включая токен авторизации.
  4. Клиент и сервер разделены. Одно и то же API обслуживает сайт, мобильное приложение и чужие интеграции.
  5. Ответы можно кешировать, если сервер это разрешил заголовками.

Строго "по Филдингу" REST реализован редко. Когда разработчики говорят "у нас REST", чаще имеют в виду: ресурсы в URL, методы HTTP, данные в JSON, понятные коды ответа. Для старта этого достаточно.

HTTP-методы и эндпоинты

Эндпоинт (endpoint) - это конкретный адрес API плюс метод. GET /orders и POST /orders - два разных эндпоинта, хотя путь одинаковый. Основные методы:

  • GET - получить данные. Ничего не меняет на сервере, повторный вызов безопасен.
  • POST - создать новый ресурс. Два одинаковых POST обычно создадут два заказа.
  • PUT - заменить ресурс целиком.
  • PATCH - изменить часть полей, например только email.
  • DELETE - удалить ресурс.

Свойство "повтор не меняет результат" называют идемпотентностью. GET, PUT и DELETE идемпотентны, POST нет. Это важно, когда запрос оборвался по таймауту и клиент решает, можно ли его безопасно повторить.

Ещё одна деталь - параметры. Фильтры и сортировку обычно передают в строке запроса: GET /products?category=books&sort=price&page=2. Данные для создания или изменения передают в теле запроса, чаще всего в формате JSON.

Из чего состоят запрос и ответ

Любой обмен с REST API - это пара "запрос - ответ". В запросе четыре части:

  • метод - GET, POST и так далее;
  • URL - адрес ресурса с параметрами;
  • заголовки - служебная информация: Content-Type: application/json, Authorization: Bearer ...;
  • тело - данные, которые вы отправляете (у GET тела обычно нет).

Ответ сервера состоит из кода статуса, заголовков и тела. Код показывает итог одним числом: 200 - всё хорошо, 201 - ресурс создан, 404 - не найдено, 500 - сломалось на сервере. Подробный разбор всех частых кодов есть в статье про коды ответов HTTP.

Тело ответа современные API почти всегда отдают в JSON. Так выглядит ответ на запрос пользователя:

{
  "id": 42,
  "login": "anna_dev",
  "email": "anna@example.com",
  "is_active": true,
  "roles": ["user", "editor"]
}

Если синтаксис JSON пока непривычен, загляните в отдельный разбор формата JSON и работы с ним: там про типы данных, ошибки парсинга и модуль json в Python.

Как отправить первый запрос к API: пошагово

Для тренировки подойдут открытые API без регистрации. GitHub API отдаёт публичные данные без ключа (с лимитом 60 запросов в час на IP), а JSONPlaceholder - учебный сервис с фейковыми постами, который принимает и POST.

Шаг 1. curl в терминале

curl есть в Linux, macOS и в Windows 10/11. Получаем профиль пользователя:

curl https://api.github.com/users/octocat

Создаём запись методом POST с JSON в теле (в Linux и macOS):

curl -X POST https://jsonplaceholder.typicode.com/posts \
  -H "Content-Type: application/json" \
  -d '{"title": "test", "body": "hello", "userId": 1}'

Сервер ответит кодом 201 и вернёт объект с присвоенным id. Данные на самом деле не сохраняются, сервис только имитирует создание.

Шаг 2. Python и библиотека requests

Установите библиотеку командой pip install requests, лучше внутри виртуального окружения:

import requests

r = requests.get("https://api.github.com/users/octocat", timeout=10)
r.raise_for_status()          # бросит исключение на 4xx и 5xx
user = r.json()               # JSON -> словарь Python
print(user["login"], user["public_repos"])

Шаг 3. JavaScript и fetch

Тот же запрос из браузера или Node.js 18+:

const res = await fetch("https://api.github.com/users/octocat");
if (!res.ok) throw new Error("HTTP " + res.status);
const user = await res.json();
console.log(user.login, user.public_repos);

Обратите внимание: fetch не считает 404 или 500 ошибкой и не бросает исключение. Проверять res.ok нужно самому.

Ключи, токены и лимиты запросов

Большинство полезных API требуют авторизацию. Сервис должен понимать, кто к нему пришёл, чтобы считать лимиты и выставлять счета. Встречаются три основных варианта:

  1. API-ключ - длинная строка, которую выдают в личном кабинете. Передаётся в заголовке или параметре запроса.
  2. Bearer-токен - заголовок Authorization: Bearer <токен>. Часто живёт ограниченное время.
  3. OAuth 2.0 - пользователь сам разрешает приложению доступ к своим данным, приложение получает токен. Так работает вход через внешние аккаунты.

Почти у каждого API есть лимиты (rate limit): сколько запросов можно сделать за минуту или час. При превышении сервер отвечает кодом 429 Too Many Requests, иногда с заголовком Retry-After, где указано, сколько секунд подождать.

Никогда не пишите ключ прямо в коде. Положите его в переменную окружения или файл .env, добавьте .env в .gitignore и читайте через os.environ["API_KEY"]. Ключи, случайно отправленные в публичный репозиторий, боты находят за минуты. Если это уже случилось, сразу отзовите ключ в кабинете сервиса: удаление коммита не помогает, история остаётся.

Как устроены коммиты и почему из истории ничего не пропадает, хорошо видно в шпаргалке по командам Git.

Типичные ошибки новичка при работе с API

  • Путают 401 и 403. 401 - сервер не понял, кто вы: токена нет или он просрочен. 403 - сервер понял, кто вы, но прав не хватает.
  • Забывают заголовок Content-Type. Без application/json сервер может не распознать тело и вернуть 400 или 415. В requests используйте параметр json= вместо data=: он сам сериализует словарь и выставит заголовок.
  • Не ставят таймаут. В requests по умолчанию таймаута нет, и скрипт может висеть бесконечно, если сервер не отвечает.
  • Сталкиваются с CORS и думают, что API сломан. Браузер блокирует запросы к чужому домену, если сервер их явно не разрешил. Из curl или Python тот же запрос работает. Решается на стороне сервера или через собственный бэкенд-прокси.
  • Не читают документацию. Формат дат, пагинация, обязательные поля - всё это описано в доках. У многих API есть интерактивная документация Swagger UI, где запрос можно отправить прямо со страницы.
  • Обращаются к полям без проверки. Если API вернул ошибку, в JSON не будет ожидаемых ключей, и код упадёт с KeyError. Сначала проверяйте код ответа.

Чем тестировать API и как тренироваться

Для ручных запросов кроме curl удобны программы с интерфейсом: Postman, Insomnia, Bruno. Они сохраняют коллекции запросов, подставляют переменные окружения и красиво показывают JSON. Ещё один вариант - расширения для VS Code вроде REST Client или Thunder Client: запросы пишутся в обычном текстовом файле рядом с кодом.

Лучший способ понять API - написать своё. На Python это делается за вечер с FastAPI или Flask:

from fastapi import FastAPI

app = FastAPI()

@app.get("/hello/{name}")
def hello(name: str):
    return {"message": f"Привет, {name}!"}

Запуск: pip install "fastapi[standard]", затем fastapi dev main.py. По адресу http://127.0.0.1:8000/docs FastAPI сам построит интерактивную документацию в формате OpenAPI. Дальше можно добавить базу данных, POST-эндпоинт и коды ошибок, а потом упаковать сервис в контейнер по гайду Docker для начинающих. Больше материалов по языку собрано в разделе Python.

Частые вопросы

Чем API отличается от REST API?

API - общее название любого программного интерфейса. REST API - его частный случай: веб-API поверх HTTP, где данные представлены ресурсами с адресами, а действия задаются методами GET, POST, PUT, PATCH и DELETE.

Обязательно ли API работает с JSON?

Нет. REST API может отдавать XML, CSV или что угодно ещё, а gRPC использует бинарный формат. Но для публичных веб-API JSON стал стандартом де-факто: он компактный и легко читается в любом языке.

Что такое эндпоинт?

Это конкретная точка входа в API: адрес плюс HTTP-метод. Например, GET /users/42 возвращает пользователя, а DELETE /users/42 удаляет его. Путь одинаковый, эндпоинты разные.

Где взять бесплатный API для практики?

Для старта подойдут GitHub API (публичные данные без ключа, с лимитом), учебный JSONPlaceholder с фейковыми постами и пользователями, а также открытые API погоды и курсов валют с бесплатным тарифом. Условия бесплатного доступа периодически меняются, сверяйтесь с документацией сервиса.

Что значит ошибка 429 Too Many Requests?

Вы превысили лимит запросов. Подождите время из заголовка Retry-After, если он есть, добавьте паузы между запросами или кеширование результатов.

Источники

  • RFC 9110. HTTP Semantics, IETF, 2022
  • HTTP request methods, MDN Web Docs, 2026
  • Requests: HTTP for Humans, Python Software Foundation / requests, 2026
  • GitHub REST API documentation, GitHub, 2026
  • Architectural Styles and the Design of Network-based Software Architectures, University of California, Irvine (Roy Fielding), 2000

PythonJavaScriptAPI

Похожие материалы

Версии программ и команды проверены на дату публикации. Если что-то изменилось, сверяйтесь с официальной документацией. Нашли неточность? Напишите на admin@bezdepbonusu7.win.