[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-kak-rabotaet-keshirovanie-v-rest":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},1127,"kak-rabotaet-keshirovanie-v-rest",34,"rest-api","REST API","🌐","Как работает кэширование в REST?","Кэширование — одно из шести ограничений REST, реализуемое через HTTP-заголовки Cache-Control, ETag и Last-Modified для снижения нагрузки на сервер и ускорения ответов клиенту.\n\n### 1. Cache-Control\n\nЗаголовок, управляющий политикой кэширования:\n```\nCache-Control: max-age=3600          — кэшировать на 1 час\nCache-Control: no-cache              — проверять актуальность при каждом запросе\nCache-Control: no-store              — не кэшировать вообще\nCache-Control: public, max-age=86400 — кэшировать публично на 24 часа\nCache-Control: private, max-age=600  — кэшировать только на клиенте\n```\n\n### 2. ETag (Entity Tag)\n\nСервер возвращает хеш содержимого ресурса. Клиент при повторном запросе отправляет его для проверки:\n```\nПервый запрос:\nGET \u002Fapi\u002Fusers\u002F42 → 200 OK, ETag: \"33a64df...\"\n\nПовторный запрос:\nGET \u002Fapi\u002Fusers\u002F42, If-None-Match: \"33a64df...\"\n→ 304 Not Modified (если ресурс не изменился)\n```\n\n### 3. Last-Modified \u002F If-Modified-Since\n\nАналогичен ETag, но использует дату последнего изменения:\n```\nОтвет: Last-Modified: Fri, 10 Jan 2025 12:00:00 GMT\nПовторный запрос: If-Modified-Since: Fri, 10 Jan 2025 12:00:00 GMT\n→ 304 Not Modified (если не изменился)\n```\n\n\u003Cdetails>\u003Csummary>Реализация в Spring\u003C\u002Fsummary>\n\nShallow ETag (Spring автоматически считает ETag от тела ответа):\n```java\n@Configuration\npublic class WebConfig {\n\n    @Bean\n    public FilterRegistrationBean\u003CShallowEtagHeaderFilter> shallowEtagHeaderFilter() {\n        FilterRegistrationBean\u003CShallowEtagHeaderFilter> filter =\n            new FilterRegistrationBean\u003C>(new ShallowEtagHeaderFilter());\n        filter.addUrlPatterns(\"\u002Fapi\u002F*\");\n        return filter;\n    }\n}\n```\n\nРучное управление кэшированием:\n```java\n@GetMapping(\"\u002Fusers\u002F{id}\")\npublic ResponseEntity\u003CUser> getUser(@PathVariable Long id) {\n    User user = userService.findById(id);\n\n    return ResponseEntity.ok()\n        .cacheControl(CacheControl.maxAge(Duration.ofMinutes(30)))\n        .eTag(String.valueOf(user.getVersion()))\n        .lastModified(user.getUpdatedAt().toInstant())\n        .body(user);\n}\n\n\u002F\u002F Условный запрос с ETag\n@GetMapping(\"\u002Fusers\u002F{id}\")\npublic ResponseEntity\u003CUser> getUser(@PathVariable Long id,\n                                     WebRequest request) {\n    User user = userService.findById(id);\n    String etag = String.valueOf(user.getVersion());\n\n    if (request.checkNotModified(etag)) {\n        return null; \u002F\u002F Spring вернёт 304 автоматически\n    }\n\n    return ResponseEntity.ok()\n        .eTag(etag)\n        .body(user);\n}\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** нужно знать три механизма (Cache-Control, ETag, Last-Modified) и код 304 Not Modified. Частая ошибка — путать no-cache (проверять актуальность) и no-store (не кэшировать вообще).","","middle",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как работает кэширование в REST? — Gymterview","Кэширование — одно из шести ограничений REST, реализуемое через HTTP-заголовки Cache-Control, ETag и Last-Modified для снижения нагрузки на сервер и ускорения о","Кэширование — одно из шести ограничений REST, реализуемое через HTTP-заголовки Cache-Control, ETag и Last-Modified для с",[15,13],"Кэширование — одно из шести ограничений REST, реализуемое через HTTP-заголовки Cache-Control, ETag и Last-Modified для снижения нагрузки на сервер и ускорения ответов клиенту.",true]