WebSocket & REST: Hai cách nói chuyện khác nhau giữa client và server

REST và WebSocket khác nhau thế nào? Một bên nói từng câu, một bên trò chuyện liên tục — cùng khám phá sự khác biệt qua ví dụ dễ hiểu!

Tiết Thanh Minh Hiếu avatar
  • Tiết Thanh Minh Hiếu
  • 4 phút đọc

Chào các bạn 👋
Nếu bạn từng viết API bằng Spring Boot hoặc Node.js/Express, chắc hẳn đã nghe qua hai cái tên quen thuộc: RESTWebSocket.
Lúc đầu, mình cứ nghĩ chúng “na ná” nhau — đều là cách client nói chuyện với server thôi mà.
Nhưng hoá ra… một bên là “gửi thư tay”, còn một bên là “trò chuyện qua điện thoại” 📞.
Cùng mình bóc tách nhé 👇


1️⃣ REST là gì? – “Gửi thư tay” có trật tự 📬

REST (Representational State Transfer) là cách giao tiếp truyền thống trên web, sử dụng HTTP request/response.

Cách hoạt động:

  • Client gửi request (thư tay) đến địa chỉ (endpoint).
  • Server trả lại response (bức thư hồi âm).
  • Mỗi lần trao đổi là một phiên độc lập, không nhớ gì về lần trước.
// Gửi request REST từ client (JS)
fetch("https://api.example.com/users/1")
  .then((res) => res.json())
  .then((data) => console.log(data));

💡 Trong Java, có thể dùng RestTemplate hoặc WebClient:

RestTemplate rest = new RestTemplate();
User user = rest.getForObject("https://api.example.com/users/1", User.class);

Ưu điểm:

✅ Dễ hiểu, dễ debug, được hỗ trợ ở mọi framework. ✅ Rất phù hợp cho CRUD (Create, Read, Update, Delete).

Nhược điểm:

❌ Không phù hợp cho real-time (chat, thông báo, game…). ❌ Mỗi request phải mở – đóng kết nối → tốn tài nguyên khi liên tục gửi dữ liệu.


2️⃣ WebSocket là gì? – “Trò chuyện qua điện thoại” ☎️

WebSocket là giao thức giao tiếp hai chiều, liên tục, được xây dựng trên TCP. Một khi kết nối mở, client và server có thể gửi dữ liệu cho nhau bất cứ lúc nào — không cần request lại.

// Client JavaScript
const socket = new WebSocket("ws://localhost:8080/chat");

socket.onopen = () => {
  console.log("Connected to server!");
  socket.send("Hello from client!");
};

socket.onmessage = (event) => {
  console.log("Server says:", event.data);
};

💡 Bên Java (Spring Boot) có thể dùng @ServerEndpoint hoặc STOMP over WebSocket.

Ưu điểm:

✅ Real-time – dữ liệu cập nhật ngay lập tức. ✅ Kết nối ổn định, ít overhead hơn HTTP request liên tục.

Nhược điểm:

❌ Phức tạp hơn khi triển khai, cần xử lý reconnect, timeout, security. ❌ Không lý tưởng cho các API thuần dữ liệu (ví dụ GET/POST đơn giản).


3️⃣ REST vs WebSocket – Hai phong cách nói chuyện khác nhau

Đặc điểmREST APIWebSocket
Kiểu giao tiếpRequest/Response (một chiều)Full-duplex (hai chiều)
Kết nốiMở và đóng mỗi lần gọiGiữ kết nối lâu dài
Dữ liệu real-timeKhông
Độ phức tạp triển khaiDễTrung bình – cao
Ứng dụng điển hìnhAPI web, mobile appChat app, dashboard, game, IoT

💡 Tưởng tượng:

  • REST: Mỗi lần bạn muốn nói chuyện, bạn viết thư, gửi đi, chờ trả lời.
  • WebSocket: Cầm điện thoại nói chuyện trực tiếp — phản hồi ngay.

4️⃣ Khi nào nên chọn REST, khi nào chọn WebSocket?

Tình huốngGiải pháp tốt nhất
Gửi/nhận dữ liệu tĩnh (user info, bài viết, sản phẩm)REST API
Cập nhật dữ liệu real-time (chat, bảng giá coin, game)WebSocket
Hệ thống lớn cần cache/CDNREST
Dashboard cập nhật liên tụcWebSocket

🧩 Nhiều ứng dụng hiện đại kết hợp cả hai:

  • REST để load dữ liệu ban đầu
  • WebSocket để cập nhật real-time sau đó

5️⃣ Demo nhỏ: Chat app mini 💬

Giả sử mình tạo app chat giữa client và server:

JavaScript (Client):

const socket = new WebSocket("ws://localhost:8080/chat");
socket.onmessage = (event) => console.log("New message:", event.data);

// Gửi tin nhắn
socket.send("Hello from client!");

Spring Boot (Server):

@ServerEndpoint("/chat")
public class ChatEndpoint {
    @OnMessage
    public void onMessage(Session session, String message) throws IOException {
        System.out.println("Received: " + message);
        session.getBasicRemote().sendText("Server received: " + message);
    }
}

➡️ Kết quả: Client và server nói chuyện trực tiếp, không cần request lại liên tục.


6️⃣ Tổng kết – Hai ngôn ngữ, hai phong cách giao tiếp

JavaJavaScript
Spring Boot REST / WebSocketFetch API / Native WebSocket
Phù hợp hệ thống lớn, typing chặtLinh hoạt, dễ debug, học nhanh
“Backend nói chuyện nghiêm túc”“Frontend nói chuyện nhanh nhẹn”

💡 Cả hai đều quan trọng — hiểu REST giúp bạn thiết kế API tốt, hiểu WebSocket giúp bạn xây app real-time hiện đại.


📸 Gợi ý ảnh minh họa:

  • Ảnh 1: sơ đồ REST (request-response arrows)
  • Ảnh 2: sơ đồ WebSocket (kết nối 2 chiều liên tục)
  • Ảnh 3 (thumbnail): hình vui kiểu “REST vs WebSocket boxing match” 🥊

💬 Lời kết

Lúc mới học, mình từng chọn sai công cụ chỉ vì “nghe tên hay hơn”. Giờ thì mình hiểu: REST và WebSocket không đối thủ, mà là đồng đội. Cái hay là học được khi nào nên nói chậm, khi nào nên nói nhanh – như trong giao tiếp thật vậy 😄


Keep learning, keep coding, and let your apps talk smarter! ⚡

Chủ đề

Tiết Thanh Minh Hiếu

Tác giả: Tiết Thanh Minh Hiếu

Từ một sinh viên CNTT, tôi đã tìm thấy niềm đam mê thực sự tại giao điểm giữa AI và Cybersecurity.

Bài viết khác

Async Programming: Promise (JS) vs CompletableFuture (Java) - Battle of Asynchronous!

Async Programming: Promise (JS) vs CompletableFuture (Java) - Battle of Asynchronous!

So sánh cách xử lý bất đồng bộ giữa JavaScript Promise và Java CompletableFuture

Spring Boot vs Node.js: Trải nghiệm backend development của mình

Spring Boot vs Node.js: Trải nghiệm backend development của mình

So sánh thực tế giữa Spring Boot và Node.js qua kinh nghiệm làm dự án backend