← Назад к вопросам

Что такое request в Spring?

1.0 Junior🔥 211 комментариев
#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Request в Spring

Request в Spring - это объект, представляющий HTTP запрос, отправленный клиентом на сервер. Spring предоставляет различные способы работы с запросами в контроллерах и фильтрах, автоматически парсируя и предоставляя данные в удобном формате.

Основные компоненты HTTP Request

HTTP запрос состоит из:

Request Line: метод (GET, POST), путь (/api/users), версия HTTP Headers: метаинформация (Content-Type, Authorization, User-Agent) Body: данные запроса (обычно JSON или form data) Query Parameters: параметры в URL (?page=1&limit=10) Path Variables: переменные в пути (/users/{id})

Получение данных Request в Spring Controller

1. Использование HttpServletRequest

Это низкоуровневый способ, дающий доступ ко всему:

import org.springframework.web.bind.annotation.*;
import jakarta.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @GetMapping()
    public String getUsers(HttpServletRequest request) {
        // Получаем метод запроса
        String method = request.getMethod(); // GET
        
        // Получаем полный URI
        String uri = request.getRequestURI(); // /api/users
        
        // Получаем query параметр
        String page = request.getParameter("page"); // "1"
        
        // Получаем header
        String authHeader = request.getHeader("Authorization");
        
        // Получаем все headers
        Enumeration<String> headerNames = request.getHeaderNames();
        
        return "Method: " + method + ", URI: " + uri;
    }
}

2. Использование аннотаций (рекомендуется)

Это более удобный и чистый способ:

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    // @RequestParam - для query параметров
    @GetMapping
    public List<User> listUsers(
        @RequestParam(defaultValue = "1") int page,
        @RequestParam(defaultValue = "10") int limit
    ) {
        // URL: /api/users?page=2&limit=20
        System.out.println("Page: " + page + ", Limit: " + limit);
        return userService.getUsers(page, limit);
    }
    
    // @PathVariable - для переменных в пути
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // URL: /api/users/123
        return userService.findById(id);
    }
    
    // @RequestBody - для данных из body запроса
    @PostMapping
    public User createUser(@RequestBody UserRequest request) {
        // POST /api/users с JSON body:
        // { "name": "John", "email": "john@example.com" }
        return userService.create(request.getName(), request.getEmail());
    }
    
    // @RequestHeader - для headers
    @GetMapping("/profile")
    public User getUserProfile(
        @RequestHeader("Authorization") String token
    ) {
        return userService.getUserByToken(token);
    }
}

Использование RequestEntity и ResponseEntity

RequestEntity - это более удобный способ работы с полным request:

import org.springframework.http.RequestEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/orders")
public class OrderController {
    
    @PostMapping
    public ResponseEntity<?> createOrder(
        RequestEntity<OrderRequest> request
    ) {
        // Получаем всё про request
        HttpMethod method = request.getMethod(); // POST
        URI url = request.getUrl();
        HttpHeaders headers = request.getHeaders();
        OrderRequest body = request.getBody();
        
        System.out.println("Content-Type: " + headers.getContentType());
        System.out.println("Order: " + body);
        
        Order created = orderService.create(body);
        return ResponseEntity.ok(created);
    }
}

WebRequest и NativeWebRequest

Это абстракция сверху HttpServletRequest, портативнее для тестирования:

import org.springframework.web.context.request.WebRequest;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/products")
public class ProductController {
    
    @GetMapping
    public List<Product> getProducts(WebRequest request) {
        // Получаем параметр
        String category = request.getParameter("category");
        
        // Получаем header
        String acceptLanguage = request.getHeader("Accept-Language");
        
        // Проверяем, если ли параметр
        boolean hasCategory = request.checkNotModified("some-etag");
        
        return productService.getByCategory(category);
    }
}

Работа с diferentes типами Request Body

JSON Request

@PostMapping("/users")
public User createUser(@RequestBody UserRequest request) {
    // Content-Type: application/json
    // { "name": "Alice", "email": "alice@example.com" }
    return userService.create(request);
}

class UserRequest {
    private String name;
    private String email;
    // getters, setters, constructor
}

Form Data Request

@PostMapping("/login")
public ResponseEntity<?> login(
    @RequestParam String username,
    @RequestParam String password
) {
    // Content-Type: application/x-www-form-urlencoded
    // username=john&password=secret123
    User user = authService.authenticate(username, password);
    return ResponseEntity.ok(user);
}

Multipart File Request

import org.springframework.web.multipart.MultipartFile;

@PostMapping("/upload")
public ResponseEntity<?> uploadFile(
    @RequestParam MultipartFile file,
    @RequestParam Long userId
) {
    // Content-Type: multipart/form-data
    String fileName = file.getOriginalFilename();
    byte[] fileBytes = file.getBytes();
    
    fileService.save(userId, fileName, fileBytes);
    return ResponseEntity.ok("File uploaded");
}

Request Context в Servlet Filter

Иногда нужно обработать request в фильтре, до попадания в контроллер:

import org.springframework.stereotype.Component;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
public class LoggingFilter implements Filter {
    
    @Override
    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain
    ) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        
        long startTime = System.currentTimeMillis();
        
        System.out.println("Request: " + httpRequest.getMethod() + 
                         " " + httpRequest.getRequestURI());
        
        // Пропускаем дальше по цепи
        chain.doFilter(request, response);
        
        long duration = System.currentTimeMillis() - startTime;
        System.out.println("Completed in " + duration + "ms");
    }
}

Request с аутентификацией

import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/protected")
public class ProtectedController {
    
    @GetMapping("/profile")
    public User getMyProfile(
        Authentication authentication,
        HttpServletRequest request
    ) {
        // authentication - текущий залогиненный пользователь
        String username = authentication.getName();
        
        // request - полная информация о запросе
        String token = request.getHeader("Authorization");
        
        return userService.findByUsername(username);
    }
}

Валидация Request

Spring поддерживает валидацию через Jakarta Validation API:

import jakarta.validation.Valid;
import jakarta.validation.constraints.*;

class CreateUserRequest {
    @NotBlank(message = "Name is required")
    private String name;
    
    @Email(message = "Invalid email format")
    private String email;
    
    @Min(value = 18, message = "Must be 18+")
    private int age;
}

@PostMapping
public User createUser(@Valid @RequestBody CreateUserRequest request) {
    // Spring автоматически валидирует данные
    // Если невалидно - вернёт 400 Bad Request
    return userService.create(request);
}

Обработка исключений при парсировании Request

import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;

@ControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<?> handleValidationError(
        MethodArgumentNotValidException ex
    ) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage())
        );
        return ResponseEntity.badRequest().body(errors);
    }
}

Асинхронная обработка Request

import org.springframework.scheduling.annotation.Async;
import java.util.concurrent.CompletableFuture;

@PostMapping("/process")
public CompletableFuture<String> processData(
    @RequestBody DataRequest request
) {
    // Request обрабатывается асинхронно
    return CompletableFuture.supplyAsync(() -> 
        heavyService.process(request)
    ).thenApply(result -> "Processed: " + result);
}

Request в Spring - это ключевое понятие в веб-приложениях. Понимание того, как Spring парсирует и предоставляет данные запроса, критично для разработки эффективных контроллеров и обработчиков.

Что такое request в Spring? | PrepBro