Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: api design, rest, api, http

Как организовать идемпотентный REST API, чтобы повторный запрос клиента не привёл к дублированию операции?

Вопрос проверяет знание идемпотентности API, практику проектирования безопасных HTTP-сервисов и умение работать с ключами запросов.

Короткий ответ

Идемпотентность достигается введением уникального идентификатора запроса (Idempotency-Key). Сервер сохраняет этот ключ и результат операции, и при повторном запросе возвращает тот же результат без повторного выполнения.

Длинный ответ

Проблема: клиент может отправить повторный запрос (например, из-за сетевого таймаута), и тогда деньги спишутся дважды.

Решение:

  1. Клиент добавляет Idempotency-Key в заголовок.

  2. Сервер сохраняет результат операции в БД вместе с ключом.

  3. Если приходит повторный запрос с тем же ключом — сервер возвращает сохранённый ответ.

func CreatePayment(w http.ResponseWriter, r *http.Request) {
		key := r.Header.Get("Idempotency-Key")
		if resp, ok := storage[key]; ok {
				w.Write(resp)
				return
		}
		// выполняем платёж
		result := []byte("ok")
		storage[key] = result
		w.Write(result)
}

Вывод: идемпотентность обязательна для финансовых и критичных API.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Golang

    Golang

  • Postgres

    Postgres

  • Networks

Ключевые слова

#api design

#rest

#api

#http

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.