Thẻ

#rest-api

99 Ngày Spring — Ngày 20: CORS

Ngày 20 của 99 Ngày Spring: same-origin policy — luật của trình duyệt, preflight OPTIONS và vì sao một lần gọi sinh hai request, cấu hình @CrossOrigin và global theo profile, cùng các quy tắc an toàn: không mở * ở production, đọc lỗi CORS ở DevTools, và cái bẫy khi thêm Spring Security.

16 thg 8, 20266 phút36
99 Ngày Spring — Ngày 19: Upload & download file

Ngày 19 của 99 Ngày Spring: upload với MultipartFile và tên lưu trữ do server sinh, giới hạn max-file-size/max-request-size với lỗi 413 chuẩn ProblemDetail, download stream qua Resource với Content-Disposition, chặn path traversal bằng normalize + startsWith, và checklist an toàn cho production.

15 thg 8, 20265 phút172
99 Ngày Spring — Ngày 18: Phân trang & sắp xếp API

Ngày 18 của 99 Ngày Spring: vì sao không trả cả bảng trong một response, Pageable tự bind page/size/sort từ query param, bọc Page thành PageResponse DTO để giữ hợp đồng ổn định, convention sắp xếp nhiều tiêu chí, và hai chốt an toàn — giới hạn max-page-size, whitelist field được sort.

14 thg 8, 20265 phút163
99 Ngày Spring — Ngày 17: Mapping DTO với MapStruct

Ngày 17 của 99 Ngày Spring: vì sao không trả thẳng entity, chi phí ẩn của map thủ công, MapStruct sinh code mapping lúc biên dịch từ interface khai báo, tùy biến với @Mapping và @MappingTarget, cùng unmappedTargetPolicy = ERROR biến field bỏ sót thành lỗi build.

13 thg 8, 20266 phút105
99 Ngày Spring — Ngày 16: Xử lý lỗi toàn cục

Ngày 16 của 99 Ngày Spring: tập trung xử lý lỗi về một điểm với @RestControllerAdvice + @ExceptionHandler, chuẩn hóa body lỗi theo ProblemDetail (RFC 7807), kiểm soát response cho lỗi validation của @Valid, và handler dự phòng cho 500 — log chi tiết ở server, trả thông điệp chung cho client.

12 thg 8, 20266 phút50
99 Ngày Spring — Ngày 15: ResponseEntity & status code

Ngày 15 của 99 Ngày Spring: bảng status code tối thiểu (200/201/204/400/404/409/500) với ranh giới 4xx vs 5xx, ResponseEntity điều khiển status–header–body, nghi thức 201 Created + Location cho POST, 204 cho DELETE, và nguyên tắc "lỗi thì ném, đừng tự build".

11 thg 8, 20265 phút43
99 Ngày Spring — Ngày 14: Bean Validation — @Valid & bộ constraint chuẩn

Ngày 14 của 99 Ngày Spring: Bean Validation khai báo luật ngay trên DTO — @Valid kích hoạt, bộ constraint chuẩn (@NotBlank vs @NotEmpty vs @NotNull, @Size, @Email, @Min/@Max), bẫy int vs Integer, validate object lồng nhau không tự lan, và lỗi 400 gom một lượt.

10 thg 8, 20265 phút66
99 Ngày Spring — Ngày 13: @RequestBody & DTO — đừng công khai entity ra API

Ngày 13 của 99 Ngày Spring: @RequestBody + Jackson deserialize JSON thành object, DTO là hợp đồng API — chặn lỗ hổng mass assignment chiều vào và rò rỉ dữ liệu chiều ra, request/response DTO khác nhau là bình thường, và Jackson annotations tinh chỉnh hợp đồng JSON.

9 thg 8, 20266 phút76
99 Ngày Spring — Ngày 12: Request mapping & tham số — @PathVariable, @RequestParam

Ngày 12 của 99 Ngày Spring: @PathVariable hứng định danh trong đường dẫn, @RequestParam hứng bộ lọc sau dấu hỏi (required/defaultValue), quy tắc chọn path hay query, mapping trùng nổ lúc khởi động, và chuẩn thiết kế URL danh từ số nhiều.

8 thg 8, 20265 phút49