В чем разница между REST и gRPC протоколами?

«В чем разница между REST и gRPC протоколами?» — вопрос из категории API тестирование, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

REST — это архитектурный стиль для построения API поверх HTTP. Он использует ресурсы (URL), методы (GET, POST, PUT, DELETE) и стандартные статус-коды. Данные обычно передаются в текстовых форматах, таких как JSON или XML. Это делает REST простым для понимания, отладки и интеграции, особенно с веб-приложениями, но менее эффективным по производительности и размеру передаваемых данных.

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

Ключевые отличия с точки зрения тестировщика:

Аспект REST gRPC
Контракт Описывается в документации (OpenAPI/Swagger). Четко определяется в .proto-файле. Тестировщик может использовать сгенерированный код для создания запросов.
Формат данных Текстовый (JSON/XML), легко читается и модифицируется вручную (например, в Postman). Бинарный (Protobuf). Для создания/чтения запросов нужны специальные инструменты или сгенерированные классы.
Производительность Ниже из-за накладных расходов текстовых форматов. Выше благодаря бинарному формату и использованию HTTP/2 (мультиплексирование, сжатие заголовков).
Поддержка потоков Нет нативной поддержки. Реализуется через WebSockets или Server-Sent Events. Есть нативная поддержка всех видов потоковой передачи на уровне протокола.
Инструменты тестирования Postman, Insomnia, curl, встроенные в код HTTP-клиенты. BloomRPC, gRPCurl, evans, генерация клиентов на основе .proto-файла для интеграционных тестов.

Пример тестирования REST (используя curl):

curl -X GET https://api.example.com/users/123 
     -H "Content-Type: application/json"

Пример тестирования gRPC (используя grpcurl):

grpcurl -plaintext -proto user_service.proto 
        -d '{"id": "123"}' 
        localhost:50051 UserService.GetUser

При тестировании gRPC-сервисов важно проверять не только успешные сценарии, но и корректность обработки ошибок (status codes), работу стримов и соответствие данных строгой схеме Protobuf.