[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-kak-realizovat-rest-api-v-spring":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},1223,"kak-realizovat-rest-api-v-spring",34,"rest-api","REST API","🌐","Как реализовать REST API в Spring?","Spring предоставляет средства для создания REST API через Spring Web MVC и Spring WebFlux (реактивный подход). Ключевые аннотации: `@RestController` (= `@Controller` + `@ResponseBody`), `@RequestMapping`, `@GetMapping`, `@PostMapping`, `@PutMapping`, `@PatchMapping`, `@DeleteMapping`.\n\n\u003Cdetails>\u003Csummary>Полный пример CRUD-контроллера\u003C\u002Fsummary>\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fusers\")\n@RequiredArgsConstructor\n@Validated\npublic class UserController {\n\n    private final UserService userService;\n\n    @GetMapping\n    public ResponseEntity\u003CPage\u003CUserDto>> getAllUsers(\n            @RequestParam(required = false) String name,\n            @PageableDefault(size = 20) Pageable pageable) {\n        Page\u003CUserDto> users = userService.findAll(name, pageable);\n        return ResponseEntity.ok(users);\n    }\n\n    @GetMapping(\"\u002F{id}\")\n    public ResponseEntity\u003CUserDto> getUser(@PathVariable Long id) {\n        UserDto user = userService.findById(id);\n        return ResponseEntity.ok(user);\n    }\n\n    @PostMapping\n    public ResponseEntity\u003CUserDto> createUser(\n            @Valid @RequestBody CreateUserRequest request) {\n        UserDto created = userService.create(request);\n        URI location = ServletUriComponentsBuilder\n            .fromCurrentRequest()\n            .path(\"\u002F{id}\")\n            .buildAndExpand(created.id())\n            .toUri();\n        return ResponseEntity.created(location).body(created);\n    }\n\n    @PutMapping(\"\u002F{id}\")\n    public ResponseEntity\u003CUserDto> replaceUser(\n            @PathVariable Long id,\n            @Valid @RequestBody UpdateUserRequest request) {\n        UserDto updated = userService.replace(id, request);\n        return ResponseEntity.ok(updated);\n    }\n\n    @PatchMapping(\"\u002F{id}\")\n    public ResponseEntity\u003CUserDto> updateUser(\n            @PathVariable Long id,\n            @RequestBody Map\u003CString, Object> updates) {\n        UserDto updated = userService.partialUpdate(id, updates);\n        return ResponseEntity.ok(updated);\n    }\n\n    @DeleteMapping(\"\u002F{id}\")\n    public ResponseEntity\u003CVoid> deleteUser(@PathVariable Long id) {\n        userService.delete(id);\n        return ResponseEntity.noContent().build();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Основные аннотации для параметров\n\n| Аннотация | Назначение | Пример |\n|-----------|-----------|--------|\n| `@PathVariable` | Извлечение из URI | `\u002Fusers\u002F{id}` |\n| `@RequestParam` | Из query-строки | `\u002Fusers?name=Иван` |\n| `@RequestBody` | Десериализация тела запроса | JSON в объект |\n| `@RequestHeader` | Извлечение HTTP-заголовка | `Authorization` |\n| `@CookieValue` | Извлечение значения из cookie | |\n\n\u003Cdetails>\u003Csummary>DTO, валидация и сервисный слой\u003C\u002Fsummary>\n\n```java\npublic record CreateUserRequest(\n    @NotBlank(message = \"Имя не может быть пустым\")\n    String name,\n\n    @Email(message = \"Некорректный формат email\")\n    @NotBlank\n    String email,\n\n    @Min(value = 18, message = \"Минимальный возраст — 18 лет\")\n    Integer age\n) {}\n```\n\n```java\n@Service\n@RequiredArgsConstructor\n@Transactional(readOnly = true)\npublic class UserService {\n\n    private final UserRepository userRepository;\n    private final UserMapper userMapper;\n\n    public UserDto findById(Long id) {\n        return userRepository.findById(id)\n            .map(userMapper::toDto)\n            .orElseThrow(() ->\n                new EntityNotFoundException(\"Пользователь с id=\" + id + \" не найден\"));\n    }\n\n    @Transactional\n    public UserDto create(CreateUserRequest request) {\n        User user = userMapper.toEntity(request);\n        User saved = userRepository.save(user);\n        return userMapper.toDto(saved);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** нужно показать знание основных аннотаций и структуру Controller → Service → Repository. Частая ошибка — не использовать DTO (работать с сущностями напрямую в контроллере) или забыть про `@Valid` для валидации.","","junior",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как реализовать REST API в Spring? — Gymterview","Spring предоставляет средства для создания REST API через Spring Web MVC и Spring WebFlux (реактивный подход). Ключевые аннотации: `@RestController` (= `@Contro","Spring предоставляет средства для создания REST API через Spring Web MVC и Spring WebFlux (реактивный подход). Ключевые ",[15,13],"Spring предоставляет средства для создания REST API через Spring Web MVC и Spring WebFlux (реактивный подход). Ключевые аннотации: `@RestController` (= `@Controller` + `@ResponseBody`), `@RequestMapping`, `@GetMapping`, `@PostMapping`, `@PutMapping`, `@PatchMapping`, `@DeleteMapping`.",true]