API Validation là gì?

API Validation (kiểm tra tính hợp lệ của dữ liệu đầu vào API) là quá trình kiểm tra dữ liệu gửi đến API để xác định dữ liệu có đáp ứng các quy tắc đã đặt ra hay không, chẳng hạn như kiểu dữ liệu, độ dài, định dạng và các điều kiện nghiệp vụ, trước khi tiếp tục xử lý.

Mục đích của API Validation

  • Đảm bảo tính hợp lệ của dữ liệu: Kiểm tra các trường bắt buộc (required fields), kiểu dữ liệu, định dạng và giới hạn giá trị để hạn chế dữ liệu không hợp lệ được xử lý hoặc lưu trữ.
  • Hỗ trợ bảo mật: Phát hiện và từ chối dữ liệu không đáp ứng quy tắc đầu vào. Tuy nhiên, validation không thay thế các biện pháp bảo mật chuyên biệt như truy vấn tham số hóa (parameterized queries) để phòng chống SQL Injection hoặc mã hóa đầu ra phù hợp (output encoding) để giảm nguy cơ XSS.
  • Cung cấp thông báo lỗi rõ ràng: Khi dữ liệu không hợp lệ, API có thể trả về mã trạng thái HTTP như 400 Bad Request cùng thông tin lỗi để client biết dữ liệu nào cần được điều chỉnh.

Các loại API Validation phổ biến

  • Client-side Validation: Kiểm tra dữ liệu ngay phía người dùng (trình duyệt hoặc ứng dụng di động) để phản hồi nhanh và phát hiện lỗi trước khi gửi request đến server. Tuy nhiên, bước này không thay thế được việc kiểm tra ở phía server.
  • Server-side Validation: Kiểm tra dữ liệu đầu vào trên server trước khi tiếp tục xử lý hoặc lưu vào database. Đây là bước bắt buộc đối với dữ liệu cần được bảo vệ vì các kiểm tra ở phía client có thể bị bỏ qua hoặc vượt qua (bypass).
  • Schema / Data Type Validation: Kiểm tra cấu trúc dữ liệu, các trường bắt buộc và kiểu dữ liệu có đúng với quy định hay không. Ví dụ: trường age phải là số nguyên, trường email phải có định dạng phù hợp và trường name không được vượt quá độ dài cho phép.
  • Business Logic Validation: Kiểm tra dữ liệu có đáp ứng các quy tắc nghiệp vụ của hệ thống hay không. Ví dụ: số dư tài khoản phải đủ để thực hiện giao dịch rút tiền hoặc mã giảm giá vẫn còn hiệu lực và đáp ứng điều kiện sử dụng.

Lưu ý, Client-side và Server-side Validation được phân loại theo nơi thực hiện kiểm tra, trong khi Schema / Data Type và Business Logic Validation được phân loại theo nội dung kiểm tra. Vì vậy, các loại này có thể kết hợp với nhau trong quá trình xử lý một request.

Ví dụ thực tế

Giả sử xây dựng API đăng ký tài khoản với các trường username, email và password.

  • Client-side Validation: Khi người dùng nhập email sai định dạng hoặc mật khẩu quá ngắn, giao diện hiển thị thông báo lỗi ngay lập tức.
  • Server-side Validation: Khi nhận request, server kiểm tra lại dữ liệu thay vì tin tưởng kết quả kiểm tra từ client.
  • Schema / Data Type Validation: Server kiểm tra các trường bắt buộc, kiểu dữ liệu và độ dài mật khẩu có đáp ứng quy định hay không.
  • Business Logic Validation: Server kiểm tra username hoặc email đã được tài khoản khác sử dụng hay chưa. Nếu đã tồn tại, hệ thống từ chối đăng ký.

Qua ví dụ trên, có thể thấy validation có thể kiểm tra dữ liệu ở nhiều cấp độ, từ cấu trúc và định dạng đến các quy tắc nghiệp vụ của hệ thống.

Validation hoạt động như thế nào?

Khi client gửi một request đến API, server cần kiểm tra dữ liệu đầu vào trước khi thực hiện các thao tác tiếp theo. Nếu dữ liệu không đáp ứng các điều kiện đã quy định, API có thể từ chối request và trả về thông tin lỗi. Nếu dữ liệu hợp lệ, request được chuyển sang các bước xử lý tiếp theo.

Quá trình này có thể được mô tả qua ba bước:

Bước 1: Client gửi request

Giả sử người dùng gửi thông tin đăng ký gồm username, email và password đến API:

POST /api/users HTTP/1.1
Content-Type: application/json

{
  "username": "nguyenvana",
  "email": "[email protected]",
  "password": "StrongPass123"
}

Dữ liệu được gửi trong request body dưới định dạng JSON.

Bước 2: API kiểm tra dữ liệu đầu vào

Khi nhận request, server kiểm tra dữ liệu theo các quy tắc đã thiết lập, chẳng hạn:

  • Các trường bắt buộc có được cung cấp hay không.
  • Kiểu dữ liệu và định dạng có phù hợp hay không.
  • Mật khẩu có đáp ứng yêu cầu về độ dài hay không.
  • Email hoặc username đã tồn tại trong hệ thống hay chưa.

Nếu dữ liệu không hợp lệ, API có thể dừng quá trình xử lý và trả về lỗi. Nếu dữ liệu hợp lệ, request được chuyển sang các bước tiếp theo, chẳng hạn tạo tài khoản và lưu thông tin vào database.

Bước 3: API trả về kết quả

Trường hợp 1: Dữ liệu hợp lệ

Nếu thông tin đăng ký đáp ứng các quy tắc và tài khoản được tạo thành công, API có thể trả về 201 Created:

HTTP/1.1 201 Created
Content-Type: application/json

{
  "id": 101,
  "username": "nguyenvana",
  "email": "[email protected]"
}

Trường hợp 2: Dữ liệu không hợp lệ

Giả sử người dùng gửi email sai định dạng. API có thể từ chối request và trả về 400 Bad Request cùng thông tin lỗi:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "message": "Validation failed",
  "errors": {
    "email": "Email format is invalid"
  }
}

Response cho biết dữ liệu đầu vào không đáp ứng yêu cầu. Client có thể dựa vào thông tin lỗi để hiển thị thông báo phù hợp cho người dùng.

Như vậy, validation giúp phát hiện dữ liệu không hợp lệ trước khi thực hiện các thao tác tiếp theo, hạn chế lỗi dữ liệu và cung cấp thông tin phản hồi rõ ràng cho client.

Ví dụ API Validation

Để hiểu rõ hơn cách API Validation hoạt động trong thực tế, hãy xem xét API tạo sản phẩm mới với hai trường name và price.

Giả sử hệ thống đặt ra các quy tắc sau:

  • name: Bắt buộc phải có và không được để trống.
  • price: Phải là số lớn hơn 0.

Trường hợp 1: Dữ liệu hợp lệ

Client gửi request tạo sản phẩm với tên và giá hợp lệ:

POST /api/products HTTP/1.1
Content-Type: application/json

{
  "name": "Keyboard",
  "price": 500000
}

API kiểm tra dữ liệu và xác nhận rằng các trường đáp ứng quy tắc đã đặt ra. Nếu sản phẩm được tạo thành công, server trả về 201 Created cùng thông tin sản phẩm:

HTTP/1.1 201 Created
Content-Type: application/json

{
  "id": 101,
  "name": "Keyboard",
  "price": 500000
}

Trong trường hợp này, dữ liệu hợp lệ nên request được xử lý thành công và sản phẩm mới được tạo.

Trường hợp 2: Dữ liệu không hợp lệ

Giả sử client gửi request với giá sản phẩm bằng -100:

POST /api/products HTTP/1.1
Content-Type: application/json

{
  "name": "Keyboard",
  "price": -100
}

Theo quy tắc đã đặt ra, giá sản phẩm phải lớn hơn 0. Vì vậy, API từ chối dữ liệu và trả về 400 Bad Request cùng thông tin lỗi:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "message": "Validation failed",
  "errors": {
    "price": "Price must be greater than 0"
  }
}

Response cho biết trường price không đáp ứng yêu cầu. Client có thể sử dụng thông tin này để hiển thị thông báo và yêu cầu người dùng nhập lại dữ liệu.

Qua ví dụ trên, có thể thấy API Validation giúp kiểm tra dữ liệu đầu vào theo các quy tắc đã thiết lập trước khi tiếp tục xử lý request. Khi dữ liệu hợp lệ, API có thể thực hiện thao tác tạo sản phẩm; khi dữ liệu không hợp lệ, API trả về thông tin lỗi để client biết nguyên nhân và điều chỉnh dữ liệu.

Kết luận

API Validation là một phần quan trọng trong quá trình xử lý dữ liệu đầu vào của API. Nó giúp phát hiện dữ liệu không hợp lệ, áp dụng các quy tắc nghiệp vụ và cung cấp thông tin lỗi để client có thể xử lý phù hợp.

Hiểu cách validation hoạt động sẽ giúp lập trình viên xây dựng API đáng tin cậy hơn, hạn chế lỗi dữ liệu và tạo nền tảng cho việc xử lý lỗi trong các ứng dụng Backend.

Nguồn tham khảo

 

Bài viết khác

API Error Handling

API Error Handling là gì? API Error Handling (xử lý lỗi API) là quá trình phát hiện, quản lý và phản hồi các lỗi xảy ra trong quá trình API tiếp nhận request hoặc xử lý yêu cầu. Mục tiêu là giúp API phản hồi một cách nhất quán, cung cấp thông tin lỗi phù […]

JSON & HTTP Status Codes

JSON là gì? JSON (JavaScript Object Notation) là một định dạng dữ liệu dạng văn bản, có cấu trúc đơn giản và dễ đọc, thường được sử dụng để trao đổi dữ liệu giữa các chương trình. JSON tổ chức dữ liệu thông qua các cặp key-value, đối tượng (object) và mảng (array). Mặc dù […]

REST API

REST API là gì? API là gì? API (Application Programming Interface), hay giao diện lập trình ứng dụng, là tập hợp các giao diện và quy tắc cho phép các phần mềm hoặc thành phần phần mềm tương tác với nhau. API đóng vai trò như một hợp đồng quy định cách bên sử dụng […]

Go Channels & Go Context

1. Go Channels & Go Context là gì? Trong Go, goroutine cho phép chương trình chạy nhiều công việc đồng thời. Tuy nhiên, khi có nhiều goroutine cùng hoạt động, chúng cần một cách để trao đổi kết quả, phối hợp thời điểm thực thi và dừng công việc khi không còn cần thiết.  Đây […]

Goroutine & Concurrency

1. Concurrency là gì? Concurrency là khả năng tổ chức nhiều công việc để chúng có thể tiến triển xen kẽ hoặc đồng thời trong cùng một khoảng thời gian. Thay vì phải thực hiện tất cả công việc theo một trình tự duy nhất, chương trình có thể chuyển đổi giữa nhiều công việc […]

Go Fundamentals

1. Go là gì? Go (Golang) là ngôn ngữ lập trình go thường được sử dụng trong backend, REST API, hệ thống mạng, công cụ dòng lệnh, cloud infrastructure và các dịch vụ chạy đồng thời. Go là ngôn ngữ biên dịch và có hệ thống kiểu dữ liệu tĩnh (statically typed). Điều này có […]

Leave a Reply

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