Skip to content

RESTful API ​

REST API là cách để 2 chương trình (thường là client và server) giao tiếp với nhau qua HTTP: client gửi request tới 1 địa chỉ (URL) đại diện cho 1 dữ liệu/tài nguyên cụ thể, server trả về response cho biết kết quả. Thiết kế REST hiện nay là kết quả của một chuỗi giải pháp nối tiếp nhau: mỗi giải pháp giải quyết một vấn đề cụ thể của giải pháp trước, đồng thời để lộ ra một vấn đề mới, từ đó thúc đẩy giải pháp tiếp theo ra đời.

mermaid
flowchart TD
    A["RPC / CORBA / DCOM<br/>gọi hàm ở máy khác qua giao thức riêng"] -->|"giao thức nhị phân,<br/>gắn chặt vào 1 ngôn ngữ/platform"| B["SOAP / XML-RPC<br/>chuẩn hoá bằng XML qua HTTP"]
    B -->|"XML nặng, đặc tả WS-* quá phức tạp,<br/>dùng HTTP như đường ống thuần tuý"| C["REST (Roy Fielding, 2000)<br/>tận dụng đúng HTTP: verb, status code, cache"]
    C -->|"tên gọi REST bị lạm dụng,<br/>không ai đo được API có RESTful thật không"| D["Richardson Maturity Model (2008)<br/>4 mức độ tuân thủ REST"]
    D -->|"nhiều team làm API riêng lẻ,<br/>frontend/mobile phải đợi backend xong mới làm được"| E["API Contract / OpenAPI<br/>đặc tả API trước, cả 2 phía dựa vào đó"]
    E -->|"REST vẫn có giới hạn: over-fetch,<br/>nhiều round-trip cho dữ liệu lồng nhau"| F["GraphQL / gRPC<br/>hướng đi khác cho từng bài toán cụ thể"]
#Giải phápVấn đề được giải quyếtVấn đề mới phát sinh
1RPC / CORBA / DCOMCho phép gọi hàm ở máy khác như gọi hàm localGiao thức nhị phân riêng, gắn chặt vào 1 ngôn ngữ/platform, khó tương thích
2SOAP / XML-RPCChuẩn hoá bằng XML, tương thích được nhiều ngôn ngữ/platform hơnXML nặng, đặc tả WS-* (WS-Security, WSDL...) quá phức tạp, dùng HTTP chỉ như đường ống chứ không tận dụng cơ chế của nó (cache, status code)
3REST (Roy Fielding, luận án tiến sĩ 2000)Tận dụng chính HTTP làm giao thức ứng dụng: HTTP method là hành động, status code là kết quả, URL định danh resource, tận dụng cache sẵn có của webTừ "REST"/"RESTful" bị dùng tràn lan cho bất kỳ API nào chạy trên HTTP, dù không tuân thủ đúng nguyên tắc — không có thước đo chung
4Richardson Maturity Model (2008)Đưa ra 4 mức để đánh giá một API "RESTful" đến đâu (xem bên dưới)Biết đánh giá rồi nhưng nhiều team vẫn thiết kế lệch nhau, không có tài liệu chung cho backend/frontend/mobile cùng tham chiếu
5API Contract / OpenAPI (Swagger)Đặc tả API (endpoint, tham số, response) thành 1 tài liệu chuẩn, cả backend lẫn frontend/mobile cùng dựa vào để làm song songREST thuần vẫn có giới hạn: client hay bị over-fetch/under-fetch dữ liệu, nhiều round-trip khi lấy dữ liệu lồng nhau
6GraphQL / gRPCMỗi hướng giải quyết đúng 1 giới hạn của REST (GraphQL: client tự chọn field cần lấy; gRPC: hiệu năng cao cho giao tiếp nội bộ service-to-service)— (lựa chọn theo bài toán, không thay thế hoàn toàn REST)

Richardson Maturity Model — 4 mức "RESTful thật sự" ​

MứcĐặc điểmVí dụ
0Chỉ có 1 endpoint, mọi hành động gửi qua POST, giống RPC-over-HTTPPOST /api với body mô tả hành động cần làm
1Đã có nhiều resource riêng biệt (URI khác nhau cho từng loại dữ liệu) nhưng vẫn chỉ dùng 1-2 HTTP methodPOST /getUser, POST /updateUser
2Dùng đúng HTTP method (GET/POST/PUT/PATCH/DELETE) và đúng status code cho từng resourceGET /users/123, DELETE /users/123 — phần lớn API gọi là "RESTful" ngày nay dừng ở mức này
3Thêm HATEOAS (Hypermedia as the Engine of Application State) — response trả kèm link tới các hành động/resource liên quan tiếp theoResponse trả về user kèm link "orders": "/users/123/orders" — hiếm khi triển khai đầy đủ trong thực tế

Lưu ý quan trọng: đạt mức 2 là đủ tốt cho phần lớn hệ thống thực tế. Mức 3 (HATEOAS) đúng chuẩn học thuật nhất nhưng ít được dùng vì tăng độ phức tạp mà lợi ích thực tế không tương xứng với hầu hết API nội bộ/mobile-facing.

Các trang tiếp theo đi vào chi tiết từng phần: thiết kế resource/URI, HTTP methods, status code, API Contract, và các quy ước phân trang/lọc/sắp xếp.