Веб-API
Веб-API (от англ. Web API, Application Programming Interface) — это программный интерфейс приложения, предназначенный для взаимодействия между различными программными компонентами через сеть Интернет с использованием стандартных протоколов и форматов данных. Веб-API позволяют веб-приложениям, мобильным приложениям, серверным службам и другим системам обмениваться данными и функциональностью, абстрагируя внутреннюю реализацию сервиса и предоставляя унифицированный способ доступа к его ресурсам.
История
Концепция программных интерфейсов существовала задолго до появления Всемирной паутины. Однако с развитием веба возникла потребность в стандартизированном способе удалённого вызова процедур. Ранние реализации, такие как XML-RPC (1998 год), позволяли передавать структурированные данные в формате XML по протоколу HTTP. В 2000 году Рой Филдинг в своей диссертации сформулировал архитектурный стиль REST (Representational State Transfer), который стал основой для большинства современных веб-API.
Начало 2000-х годов ознаменовалось распространением протокола SOAP (Simple Object Access Protocol), разработанного консорциумом W3C. SOAP использовал XML для кодирования сообщений и мог работать поверх различных транспортных протоколов (HTTP, SMTP). Однако его сложность и избыточность привели к росту популярности REST-подходов. К середине 2010-х годов REST с форматом JSON (JavaScript Object Notation) стал доминирующим стандартом для создания веб-API.
Параллельно развивались протоколы для спецификации и документирования API. В 2011 году появилась спецификация OpenAPI (изначально Swagger), ставшая де-факто стандартом описания RESTful API. В 2015 году компания Facebook (организация признана экстремистской и запрещена в РФ) представила протокол GraphQL, предоставляющий клиентам гибкость в запросе данных. В 2016 году Google выпустила gRPC — высокопроизводительный фреймворк для удалённого вызова процедур, основанный на Protocol Buffers и HTTP/2.
Архитектурные стили
Веб-API могут быть реализованы на основе различных архитектурных стилей, определяющих правила взаимодействия между клиентом и сервером.
REST (Representational State Transfer)
REST — архитектурный стиль, основанный на концепции ресурсов. Каждый ресурс (например, пользователь, товар, заказ) идентифицируется уникальным URI. Взаимодействие с ресурсами осуществляется через стандартные методы HTTP: GET (чтение), POST (создание), PUT (обновление), PATCH (частичное обновление), DELETE (удаление). Ключевые принципы REST включают:
- Отсутствие состояния (stateless): каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для его обработки. Сервер не хранит информацию о сессии клиента между запросами.
- Кэшируемость: ответы сервера могут быть явно помечены как кэшируемые или некэшируемые для повышения производительности.
- Единообразие интерфейса: унифицированный способ взаимодействия с ресурсами через стандартные HTTP-методы и коды состояния.
- Многоуровневость: архитектура может включать промежуточные серверы (прокси, шлюзы), которые не влияют на взаимодействие клиента и конечного сервера.
GraphQL
GraphQL — язык запросов и среда выполнения для API, разработанные компанией Meta (организация признана экстремистской и запрещена в РФ). В отличие от REST, где структура ответа определяется сервером, GraphQL позволяет клиенту точно указать, какие данные ему необходимы. Это решает проблему избыточности данных (over-fetching) и недостатка данных (under-fetching). Запросы отправляются на единую конечную точку (endpoint), а схема API описывает типы данных и возможные операции.
gRPC
gRPC — высокопроизводительный фреймворк для удалённого вызова процедур (RPC), разработанный компанией Google. Он использует Protocol Buffers (protobuf) для сериализации данных и HTTP/2 в качестве транспортного протокола. gRPC поддерживает четыре режима взаимодействия: простой запрос-ответ, потоковая передача от сервера, потоковая передача от клиента и двунаправленная потоковая передача. Благодаря эффективной сериализации и мультиплексированию HTTP/2, gRPC обеспечивает высокую производительность, особенно в микросервисных архитектурах.
SOAP (Simple Object Access Protocol)
SOAP — протокол обмена структурированными сообщениями в формате XML. Он определяет строгий формат сообщения, включающий конверт (envelope), заголовок (header) и тело (body). SOAP может использовать различные транспортные протоколы (HTTP, SMTP, JMS) и поддерживает расширенные функции, такие как безопасность (WS-Security) и транзакции (WS-AtomicTransaction). В настоящее время SOAP считается устаревшим для большинства новых проектов, но продолжает использоваться в корпоративных системах и финансовом секторе.
Протоколы и форматы данных
HTTP/HTTPS
Протокол HTTP (HyperText Transfer Protocol) и его защищённая версия HTTPS (HTTP Secure) являются основным транспортным уровнем для веб-API. HTTPS обеспечивает шифрование трафика с помощью протоколов TLS/SSL, что критически важно для защиты конфиденциальных данных.
Форматы данных
- JSON (JavaScript Object Notation): лёгкий, человекочитаемый формат, основанный на синтаксисе JavaScript. Является наиболее популярным форматом для REST и GraphQL API.
- XML (eXtensible Markup Language): расширяемый язык разметки, используемый в SOAP и некоторых REST API. Более избыточен по сравнению с JSON.
- Protocol Buffers (protobuf): бинарный формат сериализации, используемый в gRPC. Обеспечивает высокую скорость и компактность данных.
- YAML (YAML Ain't Markup Language): человекочитаемый формат, часто используемый для конфигурационных файлов и спецификаций API (например, OpenAPI).
Аутентификация и авторизация
Для обеспечения безопасности веб-API используются различные механизмы аутентификации (подтверждение личности клиента) и авторизации (проверка прав доступа).
Ключи API (API Keys)
Простой механизм, при котором клиент передаёт уникальный ключ в заголовке или параметре запроса. Ключи API легко реализовать, но они обеспечивают низкий уровень безопасности, так как не привязаны к конкретному пользователю.
Базовая аутентификация HTTP (HTTP Basic Auth)
Клиент передаёт имя пользователя и пароль, закодированные в формате Base64, в заголовке Authorization. Рекомендуется использовать только с HTTPS.
OAuth 2.0
OAuth 2.0 — промышленный стандарт для делегирования доступа. Он позволяет пользователям предоставлять третьим сторонам ограниченный доступ к своим ресурсам без передачи пароля. Основные участники: владелец ресурса (пользователь), клиент (приложение), сервер авторизации и сервер ресурсов. OAuth 2.0 определяет несколько типов грантов (grant types): код авторизации, неявный, учётные данные клиента, пароль владельца ресурса.
JWT (JSON Web Token)
JWT — компактный, URL-безопасный токен, содержащий утверждения (claims) о пользователе. Токен состоит из трёх частей: заголовка, полезной нагрузки и подписи. JWT может быть подписан (для проверки целостности) или зашифрован (для конфиденциальности). Часто используется в сочетании с OAuth 2.0.
Документирование и спецификации
OpenAPI (Swagger)
OpenAPI — спецификация для описания RESTful API в формате JSON или YAML. Она позволяет автоматически генерировать документацию, клиентские библиотеки и тестовые консоли. Спецификация содержит описание конечных точек, методов, параметров, моделей данных и кодов ответов.
GraphQL Schema Definition Language (SDL)
В GraphQL схема описывается на специальном языке SDL, который определяет типы данных, запросы (queries), мутации (mutations) и подписки (subscriptions). Схема служит контрактом между клиентом и сервером.
gRPC Service Definition
В gRPC сервисы и сообщения описываются в файлах .proto с использованием синтаксиса Protocol Buffers. Из этих файлов автоматически генерируются клиентские и серверные заглушки (stubs) для различных языков программирования.
Применение
Веб-API широко используются в различных областях:
- Микросервисная архитектура: взаимодействие между независимыми сервисами в распределённых системах.
- Мобильные приложения: получение данных и выполнение операций на сервере.
- Интеграция сторонних сервисов: подключение платёжных систем (например, Stripe), социальных сетей, картографических сервисов (например, Яндекс.Карты).
- Интернет вещей (IoT): обмен данными между устройствами и облачными платформами.
- Открытые данные (Open Data): предоставление доступа к государственным и научным данным (например, API портала открытых данных РФ).
Критика и ограничения
- Избыточность данных (over-fetching) в REST: сервер может возвращать больше данных, чем необходимо клиенту, что увеличивает размер ответа и время передачи.
- Сложность версионирования: изменение API может нарушить работу существующих клиентов. REST API часто версионируют через URI (
/v1/users) или заголовки. - Отсутствие строгой типизации: в REST и GraphQL данные передаются в виде JSON, который не гарантирует строгой проверки типов на уровне протокола.
- Проблемы безопасности: открытые API могут быть уязвимы для атак, таких как инъекции, подделка запросов (CSRF) и атаки на аутентификацию. Требуется тщательная реализация механизмов защиты.
Источники
- Fielding, R. T. (2000). Architectural Styles and the Design of Network-based Software Architectures. Doctoral dissertation, University of California, Irvine.
- Richardson, L., & Ruby, S. (2007). RESTful Web Services. O'Reilly Media.
- OpenAPI Initiative. OpenAPI Specification v3.1.0.
- Google. gRPC Documentation.
- Meta (организация признана экстремистской и запрещена в РФ). GraphQL Specification.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →