← Назад к вопросам

Какую знаешь архитектуру API?

2.0 Middle🔥 191 комментариев
#Тестирование API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Архитектурные стили API

В современной разработке существует несколько ключевых архитектурных стилей API, каждый со своей философией, преимуществами и областями применения. Как QA Engineer с фокусом на тестирование API, я должен не только знать их названия, но и понимать их внутреннее устройство, чтобы эффективно проектировать тесты, предвидеть точки отказа и понимать ограничения систем.

1. REST (Representational State Transfer)

REST — это самый распространенный архитектурный стиль, построенный на принципах клиент-серверного взаимодействия с использованием протокола HTTP.

Ключевые принципы (ограничения REST):

  • Единообразие интерфейса (Uniform Interface): Ресурсы идентифицируются URI, манипуляция ими происходит через стандартные HTTP-методы (GET, POST, PUT, DELETE, PATCH). Ресурсы отделены от их представлений (например, JSON, XML).
  • Отсутствие состояния (Stateless): Каждый запрос от клиента должен содержать всю информацию, необходимую для его обработки. Сервер не хранит состояние сессии между запросами.
  • Кэшируемость (Cacheable): Ответы должны явно или неявно определять, можно ли их кэшировать, чтобы повысить производительность.
  • Слоистая система (Layered System): Клиент не знает, подключен ли он напрямую к серверу или через промежуточные узлы (прокси, балансировщики, шлюзы).

Пример RESTful запроса:

GET /api/v1/users/123 HTTP/1.1
Host: example.com
Accept: application/json
// Ответ
{
  "id": 123,
  "name": "Иван Иванов",
  "email": "ivan@example.com"
}

Для QA: Тестирование REST API фокусируется на проверке корректности кодов состояния HTTP (200 OK, 201 Created, 400 Bad Request, 404 Not Found, 500 Internal Server Error), валидации схемы JSON-ответа, тестировании всех CRUD-операций, безопасности эндпоинтов и соблюдении принципов идемпотентности (PUT, DELETE) и безопасности (GET).

2. GraphQL

GraphQL — это язык запросов и среда выполнения, разработанные Facebook. В отличие от REST, клиент может точно запросить нужные ему данные за один запрос, избегая проблемы недополучения или избыточного получения данных (over-fetching / under-fetching).

Ключевые концепции:

  • Схема (Schema): Строго типизированное описание всех возможных данных и операций (запросы Query, изменения Mutation, подписки Subscription).
  • Единая конечная точка (Single Endpoint): Все запросы отправляются на один URL (обычно /graphql).
  • Запросы, определяемые клиентом: Клиент формирует структуру JSON-подобного запроса, определяя, какие поля и вложенные объекты ему нужны.

Пример GraphQL запроса:

query {
  user(id: "123") {
    name
    email
    posts(limit: 2) {
      title
      createdAt
    }
  }
}

Для QA: Тестирование GraphQL сложнее. Нужно проверять:

  • Валидность и интроспекцию схемы.
  • Корректность работы резолверов для разных структур запросов.
  • Обработку ошибок (ошибки в GraphQL часто возвращаются с HTTP-статусом 200, но с объектом errors в теле ответа).
  • Запросы с глубокой вложенностью (защита от циклических запросов).
  • Производительность (проблема N+1, сложные запросы).

3. gRPC (Google Remote Procedure Call)

gRPC — это высокопроизводительный фреймворк для удаленного вызова процедур (RPC), использующий HTTP/2 в качестве транспорта и Protocol Buffers (Protobuf) в качестве языка описания интерфейса и формата сериализации.

Ключевые особенности:

  • Контрактный подход: Интерфейс строго определяется в .proto-файлах.
  • Бинарный формат: Protobuf бинарный, что делает его очень компактным и быстрым для сериализации/десериализации.
  • Поддержка потоков: Встроенная поддержка унарных, серверных, клиентских и двунаправленных потоковых вызовов.
  • Мультиязычность: Генерация клиентского и серверного кода для множества языков из одного .proto-файла.

Пример определения сервиса в Protobuf:

syntax = "proto3";

service UserService {
  rpc GetUser (GetUserRequest) returns (User);
}

message GetUserRequest {
  int32 user_id = 1;
}

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
}

Для QA: Тестирование требует специальных инструментов (например, grpcurl, BloomRPC, Postman с поддержкой gRPC). Основные направления:

  • Валидация соответствия реализации .proto-контракту.
  • Тестирование всех типов RPC-вызовов (унарные, потоковые).
  • Проверка обработки таймаутов, ошибок и метаданных.
  • Нагрузочное тестирование, так как gRPC часто используется в высоконагруженных микросервисных средах.

4. WebSocket

WebSocket — это протокол полнодуплексной связи поверх TCP, обеспечивающий постоянное двустороннее соединение между клиентом и сервером. Не является архитектурой API в классическом понимании, но критически важен для real-time приложений.

Для QA: Тестирование фокусируется на устойчивости соединения, обработке разрывов и повторном подключении, корректности последовательности сообщений, нагрузке при большом количестве подключений и безопасности.

5. SOAP (Simple Object Access Protocol)

Устаревший, но все еще встречающийся протокол на основе XML. Характеризуется строгой формализацией через WSDL (Web Services Description Language) и WS-* стандарты для безопасности, транзакций и т.д. Тестирование SOAP требует работы с XML, проверки сложных схем (XSD) и заголовков (SOAP Headers).

Вывод для QA Engineer

Выбор архитектуры API напрямую влияет на стратегию тестирования:

  • REST: Акцент на HTTP-методы, статусы, RESTful-дизайн.
  • GraphQL: Акцент на схему, валидацию запросов, предотвращение уязвимостей (например, глубоко вложенных запросов).
  • gRPC: Акцент на контракты (Protobuf), бинарные данные, потоковую передачу. Понимание этих различий позволяет строить более эффективные, целенаправленные и глубокие тестовые сценарии, выходящие за рамки простой проверки статуса 200.