GET, PUT, DELETE идемпотентны по спецификации. POST не идемпотентен; для повторных отправок используют идемпотентные ключи: клиент шлет Idempotency-Key, сервер кеширует результат по ключу и при повторном запросе возвращает тот же ответ. В Go: middleware извлекает ключ, проверяет кеш (Redis/БД), при совпадении возвращает сохраненный ответ, иначе выполняет handler и сохраняет результат.
key := r.Header.Get("Idempotency-Key")
if key != "" {
if cached, ok := cache.Get(key); ok { writeResponse(w, cached); return }
}
resp := doWork()
cache.Set(key, resp)
writeResponse(w, resp)