Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 парсирует и предоставляет данные запроса, критично для разработки эффективных контроллеров и обработчиков.