DTO là gì?

DTO (Data Transfer Object) là một object trung gian dùng để truyền dữ liệu giữa client – server hoặc giữa các service trong ứng dụng web/API theo kiến trúc RESTful API.

DTO chỉ chứa các thông tin cần thiết mà client hoặc service khác cần (ví dụ: Login Form chỉ cần thông tin email/username và password). Khác với Entity là đối tượng ánh xạ trực tiếp với database, nếu sử dụng Entity để truyền dữ liệu thì sẽ dư thừa các thông tin không cần thiết, ngoài ra còn có khả năng làm lộ cấu trúc database.

Việc sử dụng DTO trong giao tiếp API giúp:

  • Tách biệt giữa lớp Entity/Model với dữ liệu truyền ra ngoài API
  • Ẩn thông tin nhạy cảm
  • Định dạng dữ liệu đầu vào/đầu ra theo nhu cầu của client
  • Tăng hiệu suất ứng dụng
  • Validate dữ liệu đầu vào
  • Dễ dàng bảo trì, test và mở rộng

Sử dụng DTO Request/Response trong ứng dụng RESTful API

Request DTO: là dữ liệu gửi từ client đến server, ví dụ thông tin đăng nhập, thông tin đặt hàng, cập nhật sản phẩm.

type LoginRequest struct {
    Email    string `form:"email" binding:"required,email"`
    Password string `form:"password" binding:"required"`
}
Sử dụng Request giúp dễ dàng nhận và validate dữ liệu (binding), tách biệt với entity, dễ dàng bảo trì mở rộng nếu API cập nhật.
Response DTO: là dữ liệu server trả về client. Ví dụ phản hồi đăng nhập, danh sách sản phẩm, kết quả đặt hàng.
type LoginResponse struct {
    Message string `json:"message"`
    Token   string `json:"token"`
}
Sử dụng Response sẽ chỉ phản hồi về client các thông tin cần thiết, tránh dữ liệu nhạy cảm (password, userid,…), ngoài ra client có thể dễ dàng format dữ liệu cần thiết.
So với sử dụng Entity thì phản hồi trả về Response DTO an toàn và nhanh hơn.

Ví dụ Request và Response trong Case đăng nhập

Khi người dùng đăng nhập, Client sẽ gửi về 1 Form chứa thông tin đăng nhập (email, password). Thông tin này sẽ được server gán vào LoginRequestLoginService sẽ làm việc với đối tượng này.
    var request req.LoginRequest
    if err := c.ShouldBind(&request); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
LoginService sẽ kiểm tra thông tin đăng nhập, nếu hợp lệ thì sẽ khởi tạo một JWT token và message đăng nhập thành công, cả 2 được lưu trong LoginResponse và sẽ được trả về cho client.
JWT token này sẽ dùng để xác thực người dùng với các yêu cầu cần xác thực (cập nhật thông tin, đặt hàng).
var response res.LoginResponse
user, err := ctrl.service.Login(request.Email, request.Password)
    if err != nil {
        response.Message = "Login failed"
        response.Token = ""
        c.JSON(http.StatusUnauthorized, response)
        return
    }
    token, err := utils.GenerateToken(user.ID)
    if err != nil {
        response.Message = "Error generating token"
        response.Token = ""
        c.JSON(http.StatusInternalServerError, response)
        return
    }
    response.Message = "Login successful"
    response.Token = token
    c.JSON(http.StatusOK, response)

 

About the Author

Đức Phát

View all author's posts

Leave a Comment

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

Bài viết khác

Blockchain

Blockchain là gì? Blockchain là một công nghệ sổ cái phân tán (distributed ledger) lưu trữ dữ liệu dưới dạng các khối (blocks) được liên kết với nhau theo chuỗi (chain) bằng các hàm băm mật mã (cryptographic hash). Mỗi khối chứa danh sách các giao dịch, dấu thời gian, và tham chiếu đến khối […]

Computer Graphics

1. Ray Tracing Là một kỹ thuật mô phỏng ánh sáng trong đồ họa máy tính nhằm tạo ra hình ảnh cực kỳ chân thực. Phương pháp này dựa trên việc mô phỏng hành trình của các tia sáng từ mắt người (camera) đi vào không gian 3D, và tính toán cách chúng tương tác […]

Tìm hiểu RabbitMQ

RabbitMQ là gì? RabbitMQ là một message broker, triển khai giao thức AMQP (Advanced Message Queuing Protocol). Nhiệm vụ chính là tiếp nhận, lưu trữ tạm thời và chuyể n tiếp message giữa các Producer (gửi) và Consumer (nhận). Mục đích sử dụng RabbitMQ: phân tách các thành phần khác nhau trong hệ thống, xử […]

So sánh GORM vs go-pg vs Bun

Cộng đồng GORM Là ORM phổ biến nhất trong cộng đồng Go. Có nhiều tài liệu, ví dụ, StackOverflow câu trả lời, và nhiều package hỗ trợ mở rộng. Nhiều developer đã từng dùng Gorm. go-pg Từng rất phổ biến khi chỉ dùng PostgreSQL, nhưng đang bị Bun thay thế dần. Ít được duy trì […]

Docker

Docker là gì? Docker là một nền tảng mã nguồn mở cho phép bạn đóng gói, phân phối và chạy ứng dụng bên trong các “container” – những môi trường ảo nhẹ, cô lập nhưng vẫn chia sẻ nhân hệ điều hành của máy chủ. Khái niệm then chốt ở đây là “containerization”: thay vì […]

Kiểm thử phần mềm

Testing là gì? Quá trình kiểm thử phần mềm (software testing) là một chuỗi hoạt động có hệ thống nhằm đánh giá chất lượng, độ ổn định và tính đúng đắn của một ứng dụng so với yêu cầu ban đầu. Không đơn thuần chỉ là tìm ra lỗi, testing còn giúp đảm bảo rằng […]