post-image

Validate dữ liệu Rest API trong Spring Boot

Spring Data JPA Thực hành Tổng quan

NỘI DUNG BÀI VIẾT

Validation là hành động kiểm tra tính hợp lệ của dữ liệu. Việc này giúp cho hệ thống hoạt động an toàn, đảm bảo, tránh xử lý dữ liệu lỗi,… và cũng giúp ngăn chặn một số cuộc tấn công phổ biến như SQL injection hoặc XSS.

Ví dụ khi nhập dữ liệu vào form đăng kí, cần thực hiện validate dữ liệu form để đảm bảo:

  • Trường username không được trống
  • Password phải đủ độ khó
  • Email phải đúng định dạng email

Đấy, tất cả những việc kiểm tra dữ liệu trước xử lý đều được gọi là validation. Chúng ta vào thực hành nhé!

THAM KHẢO WEBSITE SPRING BOOT

Maven dependency

Như đã đề cập ở trên, thì trong bài này chúng ta sẽ triển khai validate dữ liệu cho Rest API. Do vậy chúng ta bắt buộc phải thêm spring-boot-starter-web. Ngoài ra, mình thêm Lombok dependency để sinh các hàm constructor, getter, tự động.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>Code language: HTML, XML (xml)

Cuối cùng, dependency quan trọng nhất của chúng ta là spring-boot-starter-validation cung cấp các annotation dùng để validate dữ liệu.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>Code language: HTML, XML (xml)

Tạo DTO

Trong hầu hết các Rest API đều sử dụng các DTO như là một class dùng để giao tiếp giữa client và server, chúng ta không nên sử dụng trực tiếp một entity để truyền vào nhận giữa client-server vì đôi lúc có những thông tin trong entity không nên trả về cho server ví dụ như password của user. Như vậy sử dụng DTO cho phép chúng ta toàn quyền quyết định những dữ liệu dùng trong giao tiếp giữa client và server.

THAM GIA KHÓA HỌC LẬP TRÌNH

Tạo một UserDTO

@Data
public class UserDTO {
    private long id;
    @NotBlank(message = "Name is mandatory")
    private String name;
    @NotBlank(message = "Email is mandatory")
    private String email;
    @Min(value = 18, message = "Age can not be less than 18")
    @Max(value = 50, message = "Age can not be greater than 50")
    private Integer age;
}Code language: CSS (css)
  • @Data sẽ tương đương với annotation @Getter + @Setter + @ToString + @EqualsAndHashCode + @NoArgsConstructor
  • @Min: value truyền vào không thế nhỏ hơn tham số được khai báo.
  • @Max: value truyền vào không thế lớn hơn tham số được khai báo.
  • @NotBlank: chuỗi truyền vào không thế blank

Tạo Controller

Cuối cùng, sau khi có DTO, chúng ta sẽ tiến hành tạo controller để nhận các request từ client gửi lên server, sau đó tiến hành validate dữ liệu.

@RestController
public class UserController {
    @PostMapping("/users")
    ResponseEntity<String> addUser(@Valid @RequestBody UserDTO userDTO) {
        return ResponseEntity.ok("User is valid");
    }
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return errors;
    }
}Code language: JavaScript (javascript)

Trong đó, @Valid annotation được sử dụng với các tham số đầu vào trong Rest method, Spring Boot sẽ tìm kiếm những tham số được chú thích với annotation để thực hiện các kiểm tra như đã định nghĩa trước đó. Khi các tham số không đáp ứng đủ điều kiện mà chúng ta đã đặt ra trước đó, Spring Boot sẽ ném MethodArgumentNotValidException.

KHOÁ HỌC LẬP TRÌNH DÀNH CHO NGƯỜI MỚI

Do vậy chúng ta cần sử dụng @ExceptionHandler annotation để bắt MethodArgumentNotValidException ném ra từ Spring Boot khi có lỗi validate để xử lý và trả về kết quả lỗi cho client.

Để kiểm thử chúng ta sẽ khởi chạy ứng dụng và request với những thông tin không hợp lệ

curl -d "{\"age\":10}" -H "Content-Type: application/json" -X POST http://localhost:8080/users
---
{
    "name": "Name is mandatory",
    "age": "Age can not be less than 18",
    "email": "Email is mandatory"
}Code language: JavaScript (javascript)

Trên đây là cách mà tôi validate dữ liệu API trong Spring Boot Hãy ghi nhớ hoặc lưu lại bài viết để có thể tìm ra và sử dụng một cách nhanh chóng. Nếu có gì thiếu sót, hãy comment phía dưới nhé

Happy learning!!!

Leave a Reply

Your email address will not be published. Required fields are marked *