RESTful API: Kiến thức thiết yếu cho Backend Developers (phần 1)
I. Cơ bản về REST và RESTful API
1. REST là gì?
REST (Representational State Transfer) là một kiến trúc phần mềm cho phép các hệ thống giao tiếp với nhau một cách hiệu quả. Nó được thiết kế dựa trên các nguyên tắc đơn giản như việc sử dụng HTTP và URL để xác định resources (tài nguyên) và sử dụng các phương thức HTTP (như GET, POST, PUT, DELETE) để thao tác trên chúng.
Nguyên tắc cốt lõi của REST
- Stateless: Mỗi yêu cầu từ client đến server đều phải chứa tất cả thông tin cần thiết để server xử lý. Server không lưu trữ thông tin về trạng thái của client giữa các yêu cầu, giúp giảm tải cho server và tăng tính khả dụng.
- Client-Server Architecture: Tách biệt rõ ràng giữa client và server. Client chịu trách nhiệm cho giao diện người dùng và tương tác với người dùng, trong khi server xử lý logic và dữ liệu. Cho phép phát triển và bảo trì hai phần một cách độc lập.
- Cacheable: Phản hồi từ server có thể được lưu vào bộ nhớ cache, giúp cải thiện hiệu suất và giảm tải cho server. Các client có thể lưu các phản hồi và tái sử dụng chúng mà không cần gửi yêu cầu mới đến server.
- Uniform Interface: REST định nghĩa một giao diện thống nhất cho việc tương tác với tài nguyên. Điều này bao gồm việc sử dụng các phương thức HTTP tiêu chuẩn như GET (lấy dữ liệu), POST (tạo dữ liệu), PUT (cập nhật dữ liệu), và DELETE (xóa dữ liệu).
- Layered System: Kiến trúc REST có thể bao gồm nhiều lớp, giúp tổ chức các thành phần của hệ thống. Client không cần biết liệu nó đang tương tác với một server cuối hay một server trung gian, tạo ra tính linh hoạt trong thiết kế.
2. HTTP Methods chính
- GET: Truy xuất tài nguyên từ server.
- POST: Tạo mới một tài nguyên trên server.
- PUT: Cập nhật hoàn toàn một tài nguyên có sẵn trên server.
- DELETE: Xóa tài nguyên từ server.
3. RESTful API là gì ?
RESTful API là một kiểu API được thiết kế theo các nguyên tắc của kiến trúc REST. RESTful API sử dụng giao thức HTTP để truyền tải dữ liệu giữa client và server.
Đặc điểm của RESTful API
- Dễ sử dụng và dễ hiểu: Do sử dụng các phương thức HTTP tiêu chuẩn và cấu trúc URL rõ ràng, RESTful API dễ dàng cho các nhà phát triển hiểu và sử dụng.
- Dễ mở rộng: RESTful API có khả năng mở rộng tốt vì nó không lưu trạng thái và các client có thể tương tác với server một cách độc lập.
- Tương tác với nhiều định dạng dữ liệu: RESTful API hỗ trợ nhiều định dạng dữ liệu như JSON, XML, HTML, v.v., nhưng JSON là định dạng phổ biến nhất hiện nay vì tính nhẹ và dễ xử lý.
4. Stateless trong REST
Stateless (không trạng thái) có nghĩa là mỗi yêu cầu từ client đến server phải chứa đủ thông tin để server hiểu và xử lý yêu cầu mà không cần dựa vào trạng thái trước đó. Điều này làm cho RESTful API dễ mở rộng và an toàn hơn.
Ý nghĩa và ví dụ về Stateless trong REST
Giả sử client gửi một yêu cầu để lấy thông tin tài khoản người dùng từ server. Trong kiến trúc stateless, mỗi yêu cầu từ client phải bao gồm đủ thông tin cần thiết để server xác thực và phản hồi yêu cầu. Điều này thường bao gồm:
- Token xác thực hoặc thông tin xác minh người dùng (ví dụ: mã API token, JWT).
- Dữ liệu cần thiết để xác định ngữ cảnh yêu cầu (ví dụ: các tham số hoặc dữ liệu bổ sung).
Ví dụ, nếu client gửi yêu cầu GET /user/account để lấy thông tin tài khoản người dùng, yêu cầu này phải chứa token xác thực trong headers, chẳng hạn:
GET /user/account HTTP/1.1
Host: api.example.com
Authorization: Bearer your-access-token
Trong trường hợp này, server không cần biết bất kỳ thông tin nào về trạng thái của client từ yêu cầu trước. Server sẽ đọc token trong mỗi yêu cầu và xác thực nó mà không cần lưu trạng thái của client.
5.URI vs URL
URI (Uniform Resource Identifier) là chuỗi ký tự xác định một tài nguyên trên mạng. Giúp định danh tài nguyên mà không cần chỉ rõ cách truy cập nó. URI có thể chỉ rõ tên của tài nguyên mà không cung cấp thông tin về vị trí của nó.
Nó được chia thành hai loại chính: URL (Uniform Resource Locator) và URN (Uniform Resource Name).
Ví dụ:
- Một URN có thể là: urn:isbn:0451450523 (định danh sách sách theo số ISBN).
- Một URL cũng là một URI, ví dụ: https://www.example.com/page (đường dẫn đến trang web cụ thể).
URL (Uniform Resource Locator) là một loại URI, nó xác định vị trí của một tài nguyên trên mạng và cách thức truy cập tài nguyên đó (thường là thông qua giao thức HTTP, FTP, v.v.). URL không chỉ xác định tài nguyên mà còn cho biết cách truy cập tài nguyên, bao gồm cả giao thức và địa chỉ.
Một URL thường bao gồm các thành phần sau:
- Giao thức: (như http, https, ftp).
- Tên miền: (ví dụ: www.example.com).
- Đường dẫn: (ví dụ: /path/to/resource).
- Tham số truy vấn: (ví dụ: ?id=123).
Ví dụ:
- https://www.example.com/index.html (địa chỉ của một trang web).
- ftp://ftp.example.com/file.txt (đường dẫn đến một tệp tin trên server FTP).
Sự khác biệt giữa URI và URL
- Phạm vi: Tất cả các URL đều là URI, nhưng không phải tất cả các URI đều là URL. URI là khái niệm rộng hơn, bao gồm cả URN và URL.
- Chức năng: URL cung cấp thông tin về vị trí của tài nguyên và cách truy cập nó, trong khi URI chỉ đơn thuần là một định danh cho tài nguyên.
- Ví dụ: Một URI có thể chỉ rõ một tài nguyên mà không cần nói rõ cách truy cập, trong khi URL phải chỉ rõ cả vị trí và phương thức truy cập.
6. Resource trong REST
- Resource (tài nguyên) là một thực thể trong hệ thống có thể được truy cập qua API.
- Mỗi resource có một URI duy nhất, ví dụ: /users/1 đại diện cho người dùng có ID là 1.
II. Principles and practices
1. Các tiêu chuẩn thiết kế RESTful API
Các tiêu chuẩn thiết kế RESTful API
- Stateless: đã giải thích ở trên
- Sử dụng URI có nghĩa: Các URI nên được thiết kế sao cho có nghĩa và dễ hiểu. Chúng nên phản ánh rõ ràng tài nguyên mà chúng đại diện.
- Ví dụ: Thay vì
/getUser/123
, nên sử dụng/users/123
để dễ dàng nhận biết rằng đây là tài nguyên người dùng với ID 123.
- Ví dụ: Thay vì
- Sử dụng các phương thức HTTP đúng chức năng: Việc tuân thủ các phương thức này giúp tăng tính nhất quán và dễ hiểu của API.
- GET: Lấy tài nguyên.
- POST: Tạo tài nguyên mới.
- PUT: Cập nhật tài nguyên hiện có.
- DELETE: Xóa tài nguyên.
- API hỗ trợ các định dạng dữ liệu như JSON, XML
- Hỗ trợ Versioning
- Sử dụng HATEOAS: (phần giải thích chi tiết hơn ở phần tiếp theo về kiến thức nâng cao)
- Cung cấp các liên kết hypermedia trong phản hồi của API giúp client hiểu các bước tiếp theo có thể thực hiện.
- Cung cấp một cách rõ ràng để điều hướng qua các tài nguyên mà không cần phải biết trước các URI.
- Xử lý Lỗi một cách Thống nhất:
- Cung cấp các mã trạng thái HTTP thích hợp cho các phản hồi, cùng với thông điệp lỗi rõ ràng, giúp client hiểu được nguyên nhân lỗi và cách khắc phục.
- Bảo mật
- Thực hiện các biện pháp bảo mật như authentication và authorization để bảo vệ tài nguyên API.
- Có thể sử dụng OAuth, JWT,... để đảm bảo rằng chỉ những người dùng hợp lệ mới có quyền truy cập vào tài nguyên.
2. Status Code phổ biến trong HTTP
- 200 OK: Yêu cầu đã thành công.
- 201 Created: Tài nguyên đã được tạo thành công.
- 204 No Content: Yêu cầu đã thành công, nhưng không có dữ liệu trả về.
- 400 Bad Request: Yêu cầu không hợp lệ.
- 401 Unauthorized: Không có quyền truy cập.
- 403 Forbidden: Truy cập bị từ chối.
- 404 Not Found: Không tìm thấy tài nguyên.
- 500 Internal Server Error: Lỗi từ phía server.
3. Versioning
- Versioning giúp duy trì tính ổn định của API khi có sự thay đổi.
- Điều này giúp bảo đảm rằng các client cũ vẫn có thể hoạt động khi có phiên bản mới của API.
Các phương pháp phổ biến:
- URI Versioning: /v1/users
- Header Versioning: Sử dụng header Accept: application/vnd.example.v1+json
- Query Parameter Versioning: /users?version=1
4. Pagination và Filtering
Pagination giúp giới hạn số lượng dữ liệu trả về, giảm tải server. Phương pháp:
- Sử dụng query params: /users?page=2&limit=10
- Sử dụng các thông số lọc: /users?name=John&status=active
5. Idempotent trong API
Idempotent có nghĩa là nhiều lần thực thi phương thức cũng chỉ cho kết quả như nhau. Ví dụ, GET và PUT là các phương thức idempotent, trong khi POST không phải.
6. CORS (Cross-Origin Resource Sharing)
CORS cho phép chia sẻ tài nguyên từ một miền khác, thường được dùng khi client và server không cùng nguồn. Server phải bật CORS để cho phép client truy cập.
Kết luận
Kiến thức về RESTful API không chỉ là một yếu tố bổ sung mà là một phần thiết yếu trong stack skills của mỗi Backend Developer. RESTful API cho phép các hệ thống giao tiếp một cách hiệu quả và mượt mà, là cầu nối giữa client và server.
Nắm vững các nguyên tắc thiết kế RESTful API giúp các developer xây dựng các ứng dụng linh hoạt, dễ bảo trì và mở rộng, Hơn nữa, với sự gia tăng của các kiến trúc microservices, khả năng thiết kế và triển khai RESTful API trở thành một kỹ năng không thể thiếu, giúp phát triển các ứng dụng phức tạp dễ dàng hơn.
Trong phần 1 của bài viết này, chúng ta đã khám phá những kiến thức cơ bản về RESTful API. Trong phần tiếp theo, chúng ta sẽ đi sâu vào các chủ đề nâng cao hơn Hãy cùng chờ đón những nội dung thú vị và bổ ích trong phần 2!
All Rights Reserved