[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-kak-proektirovat-rest-api-dlya-svyazannykh-resursov":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},1228,"kak-proektirovat-rest-api-dlya-svyazannykh-resursov",34,"rest-api","REST API","🌐","Как проектировать REST API для связанных ресурсов?","Проектирование API для связанных ресурсов строится на выборе между вложенными URI, ссылками через идентификаторы и развёрнутыми ресурсами в зависимости от типа связи и потребностей клиента.\n\n### 1. Вложенные ресурсы (Sub-resources)\n\nДля отношения «один-ко-многим»:\n```\nGET    \u002Fapi\u002Fusers\u002F42\u002Forders         — все заказы пользователя 42\nPOST   \u002Fapi\u002Fusers\u002F42\u002Forders         — создать заказ для пользователя 42\nGET    \u002Fapi\u002Fusers\u002F42\u002Forders\u002F7       — заказ 7 пользователя 42\nDELETE \u002Fapi\u002Fusers\u002F42\u002Forders\u002F7       — удалить заказ 7\n```\n\n### 2. Ссылки через идентификаторы\n\n```json\n{\n  \"id\": 7,\n  \"product\": \"Ноутбук\",\n  \"userId\": 42,\n  \"categoryId\": 5\n}\n```\n\n### 3. Развёрнутые (embedded) ресурсы\n\nВключайте связанные данные по запросу для сокращения количества запросов:\n```\nGET \u002Fapi\u002Forders\u002F7?expand=user,items\n```\n```json\n{\n  \"id\": 7,\n  \"status\": \"DELIVERED\",\n  \"user\": {\"id\": 42, \"name\": \"Иван\"},\n  \"items\": [{\"id\": 1, \"product\": \"Ноутбук\", \"quantity\": 1}]\n}\n```\n\n### 4. Отношение многие-ко-многим\n\nИспользуйте связующий ресурс:\n```\nGET    \u002Fapi\u002Fusers\u002F42\u002Froles          — роли пользователя\nPUT    \u002Fapi\u002Fusers\u002F42\u002Froles\u002F3        — назначить роль 3\nDELETE \u002Fapi\u002Fusers\u002F42\u002Froles\u002F3        — убрать роль 3\n```\n\n### 5. Правила глубины вложенности\n\n- Один уровень — хорошо: `\u002Fusers\u002F42\u002Forders`\n- Два уровня — допустимо: `\u002Fusers\u002F42\u002Forders\u002F7`\n- Три и более — избегайте. Вместо `\u002Fusers\u002F42\u002Forders\u002F7\u002Fitems\u002F3` используйте `\u002Forder-items\u002F3`\n\n\u003Cdetails>\u003Csummary>Реализация в Spring\u003C\u002Fsummary>\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fusers\u002F{userId}\u002Forders\")\n@RequiredArgsConstructor\npublic class UserOrderController {\n\n    private final OrderService orderService;\n\n    @GetMapping\n    public ResponseEntity\u003CList\u003COrderDto>> getUserOrders(\n            @PathVariable Long userId,\n            @RequestParam(required = false) String status) {\n        List\u003COrderDto> orders = orderService.findByUserId(userId, status);\n        return ResponseEntity.ok(orders);\n    }\n\n    @PostMapping\n    public ResponseEntity\u003COrderDto> createOrder(\n            @PathVariable Long userId,\n            @Valid @RequestBody CreateOrderRequest request) {\n        OrderDto order = orderService.create(userId, request);\n        URI location = URI.create(\"\u002Fapi\u002Fusers\u002F\" + userId + \"\u002Forders\u002F\" + order.id());\n        return ResponseEntity.created(location).body(order);\n    }\n\n    @GetMapping(\"\u002F{orderId}\")\n    public ResponseEntity\u003COrderDto> getOrder(\n            @PathVariable Long userId,\n            @PathVariable Long orderId) {\n        OrderDto order = orderService.findByIdAndUserId(orderId, userId);\n        return ResponseEntity.ok(order);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\nПринцип: если ресурс имеет смысл только в контексте родительского — используйте вложенные URI. Если ресурс самостоятелен — выделяйте его на верхний уровень.\n\n> **На собеседовании:** нужно знать все подходы (вложенные URI, идентификаторы, expand) и правило глубины вложенности (не более 2-3 уровней). Частая ошибка — глубокая вложенность URI или неиспользование параметра expand для уменьшения количества запросов.","","middle",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как проектировать REST API для связанных ресурсов? — Gymterview","Проектирование API для связанных ресурсов строится на выборе между вложенными URI, ссылками через идентификаторы и развёрнутыми ресурсами в зависимости от типа ","Проектирование API для связанных ресурсов строится на выборе между вложенными URI, ссылками через идентификаторы и развё",[15,13],"Проектирование API для связанных ресурсов строится на выборе между вложенными URI, ссылками через идентификаторы и развёрнутыми ресурсами в зависимости от типа связи и потребностей клиента.",true]