Ответ
REST (Representational State Transfer) — это архитектурный стиль для построения распределенных систем, чаще всего используемый для создания веб-сервисов. REST API является предпочтительным выбором во многих, но не во всех, сценариях.
Сильные стороны (когда REST — хороший выбор):
Простота и стандартизация: REST использует стандартные HTTP-методы (
GET
,POST
,PUT
,DELETE
), статусы (200 OK
,404 Not Found
) и форматы данных (чаще всего JSON), что делает его понятным и легким для интеграции с любыми клиентами (веб, мобильные, другие сервисы).Stateless (отсутствие состояния): Каждый запрос от клиента содержит всю необходимую информацию для его обработки. Сервер не хранит состояние клиента между запросами. Это упрощает логику сервера и позволяет легко масштабировать его горизонтально.
Кэшируемость: Ответы на
GET
-запросы могут быть легко кэшированы на стороне клиента или на промежуточных прокси-серверах, что снижает нагрузку на сервер и ускоряет отклик.Публичные API: Благодаря своей простоте и повсеместному распространению, REST является стандартом де-факто для публичных API, которые должны быть доступны широкому кругу разработчиков.
// Пример простого REST эндпоинта на Go с использованием роутера chi
func GetUser(w http.ResponseWriter, r *http.Request) {
// chi - популярный роутер для Go
userID := chi.URLParam(r, "userID")
user, err := db.FindUserByID(userID)
if err != nil {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)
}
Слабые стороны и альтернативы:
Проблема избыточной/недостаточной выборки (Over/Under-fetching): Клиент часто получает либо больше данных, чем ему нужно, либо вынужден делать несколько запросов для получения всех необходимых данных.
- Альтернатива: GraphQL позволяет клиенту точно указать, какие данные он хочет получить в одном запросе.
Производительность: Текстовый формат (JSON) и метаданные HTTP могут создавать накладные расходы.
- Альтернатива: gRPC использует бинарный протокол Protocol Buffers и HTTP/2, что делает его значительно быстрее для коммуникации между микросервисами.
Отсутствие потоковой передачи в реальном времени: REST основан на модели "запрос-ответ" и плохо подходит для задач, требующих постоянного двунаправленного обмена данными.
- Альтернатива: WebSockets или gRPC streaming.