[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-kak-obrabatyvat-oshibki-v-rest-api":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},1124,"kak-obrabatyvat-oshibki-v-rest-api",34,"rest-api","REST API","🌐","Как обрабатывать ошибки в REST API?","Правильная обработка ошибок строится на двух принципах: использование корректных HTTP-кодов (4xx\u002F5xx) и возврат структурированного тела ответа с описанием ошибки.\n\nСтандартный формат ответа об ошибке (RFC 7807 — Problem Details):\n```json\n{\n  \"type\": \"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Fvalidation-error\",\n  \"title\": \"Ошибка валидации\",\n  \"status\": 400,\n  \"detail\": \"Поле 'email' содержит некорректное значение\",\n  \"instance\": \"\u002Fapi\u002Fusers\",\n  \"timestamp\": \"2025-01-15T10:30:00Z\",\n  \"errors\": [\n    {\n      \"field\": \"email\",\n      \"message\": \"Некорректный формат email\",\n      \"rejectedValue\": \"not-an-email\"\n    }\n  ]\n}\n```\n\n\u003Cdetails>\u003Csummary>Реализация в Spring с @ControllerAdvice\u003C\u002Fsummary>\n\n```java\n\u002F\u002F DTO для ответа об ошибке\npublic record ErrorResponse(\n    String type,\n    String title,\n    int status,\n    String detail,\n    String instance,\n    LocalDateTime timestamp,\n    List\u003CFieldError> errors\n) {\n    public record FieldError(String field, String message, Object rejectedValue) {}\n}\n```\n\n```java\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n\n    @ExceptionHandler(EntityNotFoundException.class)\n    public ResponseEntity\u003CErrorResponse> handleNotFound(\n            EntityNotFoundException ex, HttpServletRequest request) {\n        ErrorResponse error = new ErrorResponse(\n            \"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Fnot-found\",\n            \"Ресурс не найден\",\n            404,\n            ex.getMessage(),\n            request.getRequestURI(),\n            LocalDateTime.now(),\n            null\n        );\n        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);\n    }\n\n    @ExceptionHandler(MethodArgumentNotValidException.class)\n    public ResponseEntity\u003CErrorResponse> handleValidation(\n            MethodArgumentNotValidException ex, HttpServletRequest request) {\n        List\u003CErrorResponse.FieldError> fieldErrors = ex.getBindingResult()\n            .getFieldErrors().stream()\n            .map(fe -> new ErrorResponse.FieldError(\n                fe.getField(), fe.getDefaultMessage(), fe.getRejectedValue()))\n            .toList();\n\n        ErrorResponse error = new ErrorResponse(\n            \"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Fvalidation-error\",\n            \"Ошибка валидации\",\n            400,\n            \"Переданные данные не прошли валидацию\",\n            request.getRequestURI(),\n            LocalDateTime.now(),\n            fieldErrors\n        );\n        return ResponseEntity.badRequest().body(error);\n    }\n\n    @ExceptionHandler(Exception.class)\n    public ResponseEntity\u003CErrorResponse> handleGeneral(\n            Exception ex, HttpServletRequest request) {\n        ErrorResponse error = new ErrorResponse(\n            \"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Finternal-error\",\n            \"Внутренняя ошибка сервера\",\n            500,\n            \"Произошла непредвиденная ошибка\",\n            request.getRequestURI(),\n            LocalDateTime.now(),\n            null\n        );\n        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\nSpring Boot 3 имеет встроенную поддержку RFC 7807 через `ProblemDetail`:\n```java\n@ExceptionHandler(EntityNotFoundException.class)\npublic ProblemDetail handleNotFound(EntityNotFoundException ex) {\n    ProblemDetail problem = ProblemDetail.forStatusAndDetail(\n        HttpStatus.NOT_FOUND, ex.getMessage());\n    problem.setTitle(\"Ресурс не найден\");\n    problem.setType(URI.create(\"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Fnot-found\"));\n    return problem;\n}\n```\n\n> **На собеседовании:** ключевое — упомянуть RFC 7807 (Problem Details) и `@ControllerAdvice` как стандартные подходы. Частая ошибка — возвращать 200 OK с телом `{\"success\": false}` вместо правильных HTTP-кодов ошибок.","","middle",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как обрабатывать ошибки в REST API? — Gymterview","Правильная обработка ошибок строится на двух принципах: использование корректных HTTP-кодов (4xx\u002F5xx) и возврат структурированного тела ответа с описанием ошибк","Правильная обработка ошибок строится на двух принципах: использование корректных HTTP-кодов (4xx\u002F5xx) и возврат структур",[15,13],"Правильная обработка ошибок строится на двух принципах: использование корректных HTTP-кодов (4xx\u002F5xx) и возврат структурированного тела ответа с описанием ошибки.",true]