Какую структуру ответа API вы используете в рабочих проектах?

«Какую структуру ответа API вы используете в рабочих проектах?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В production-проектах рекомендуется использовать стандартизированную обертку (envelope) для всех ответов API. Это упрощает обработку на клиенте и обеспечивает единообразие.

Типичная структура ответа DTO:

public class ApiResponse<T> {
    private String status; // "success", "error", "fail"
    private T data;        // Полезная нагрузка (может быть null)
    private String message; // Сообщение для пользователя (опционально)
    private int code;       // HTTP-статус или кастомный код ошибки
    // Конструкторы, геттеры, сеттеры
}

Пример использования в Spring REST Controller:

@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity<ApiResponse<UserDto>> getUser(@PathVariable Long id) {
        try {
            UserDto user = userService.getUserById(id);
            ApiResponse<UserDto> response = new ApiResponse<>(
                "success", user, null, HttpStatus.OK.value()
            );
            return ResponseEntity.ok(response);
        } catch (ResourceNotFoundException e) {
            ApiResponse<UserDto> response = new ApiResponse<>(
                "error", null, "User not found", HttpStatus.NOT_FOUND.value()
            );
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
        }
    }
}

Преимущества такого подхода: предсказуемость, централизованная обработка ошибок и удобство для фронтенд-разработчиков.