CÁC ĐẶC TÍNH CỦA REST
Kiến trúc REST hay kiểu REST định nghĩa sáu đặc điểm sau đây cho một dịch vụ web hoạt động theo kiểu RESTful API. Các đặc điểm này còn được gọi là các ràng buộc Fielding. Kiến trúc này tổng quát hóa các nguyên tắc của một dịch vụ web. Các ràng buộc đó là:
Client và server tồn tại một cách độc lập, không phụ thuộc vào nhau. Thông tin duy nhất cần thiết là client cần biết địa chỉ URI của tài nguyên trên máy chủ. Sự tương tác giữa hai thành phần này chỉ là ở hình thức của các yêu cầu (request) từ client và các trả lời từ máy chủ server. Mô hình client/server này giúp tách biệt các yêu cầu khác nhau giữa client/sever và cho phép hai thành phần này có thể phát triển độc lập với nhau.
Phi trạng thái (Stateless)
Các dịch vụ REST phải là phi trạng thái. Từng cuộc gọi API riêng lẻ phải chứa tất cả các thông tin cần thiết mà máy chủ cần biết để thực hiện và trả kết quả, bất chấp những lần gọi khác trước đó từ cùng một người dùng API.
Máy chủ không cần các thông tin khác từ các lần gọi API trước đó để hoàn thành lần gọi API hiện tại. Địa chỉ URI chỉ ra vị trí của tài nguyên và phần thân body sẽ chứa trạng thái của tài nguyên. Một dịch vụ dạng phi trạng thái thì dễ dàng mở rộng, cho phép chúng ta thêm các máy chủ mới một cách dễ dàng mà không cần phải lo lắng về các yêu cầu sau đó đến cùng một máy chủ. Các máy chủ cũng có thể thực hiện cân bằng tải khi cần thiết.
Hỗ trợ tính năng cache
Với dịch vụ REST, các dữ liệu trong kết quả trả về phải được gán nhãn một cách ngầm định là có thể sao lưu cache được hay không. Dịch vụ này chỉ ra khoảng thời gian mà một kết quả còn hiệu lực. Tính năng caching giúp nâng cao hiệu năng trên phía client và khả năng mở rộng trên phía server. Nếu client truy cập đến kết quả đã được cached, client sẽ tránh lặp lại cùng một lần gọi API. Thay vào đó, client chỉ sử dụng kết quả đã được cached. Điều này giúp cho tải trên server giảm, và như vậy giúp gia tăng khả năng mở rộng và hiệu năng của máy chủ.
Các phương thức GET request có thể lưu cache. Thông thường các trình duyệt xem tất cả các GET là có thể lưu trong bộ nhớ cache. Các phương thức POST thì không cache được. Chúng ta có thể làm cho POST có thể cache bằng cách thêm vào Cache-Control header hoặc Expires header trong thông điệp trả về response. Còn các thông điệp PUT và DELETE thì không thể lưu trong cache.
Giao diện nhất quán
Giao diện nhất quán là một thỏa thuận cho giao tiếp giữa client và server. Sự thống nhất đạt được thông qua bốn ràng buộc phụ sau:
Một hệ thống phân lớp tiếp tục được xây dựng trên kiến trúc client/server. Một hệ thống phân lớp chỉ ra rằng có nhiều thành phần khác, chứ không chỉ là client hay server và mỗi hệ thống còn có các lớp khác trong nó. Các lớp này phải dễ dàng thêm, bớt hay thay đổi. Các proxy, thiết bị load balancer...là các ví dụ của các thành phần thêm vào này.
Code theo yêu cầu
Tính năng này là một tùy chọn trong đó cho phép các client sự linh hoạt bằng cách cho phép client tải về các đoạn mã. Client có thể yêu cầu code từ máy chủ và sau đó các kết quả trả về từ máy chủ có chứa các đoạn code, thường ở dưới dạng của một đoạn scrips nếu kết quả trả về ở dạng HTML. Client sau đó có thể thực thi đoạn mã đó.
Kiến trúc REST hay kiểu REST định nghĩa sáu đặc điểm sau đây cho một dịch vụ web hoạt động theo kiểu RESTful API. Các đặc điểm này còn được gọi là các ràng buộc Fielding. Kiến trúc này tổng quát hóa các nguyên tắc của một dịch vụ web. Các ràng buộc đó là:
- Hoạt động theo mô hình Client/server.
- Phi trạng thái (stateless).
- Bộ nhớ đệm cache.
- Giao diện nhất quán (uniform interface).
- Hệ thống phân cấp theo lớp (layered system).
- Code theo yêu cầu.
Client và server tồn tại một cách độc lập, không phụ thuộc vào nhau. Thông tin duy nhất cần thiết là client cần biết địa chỉ URI của tài nguyên trên máy chủ. Sự tương tác giữa hai thành phần này chỉ là ở hình thức của các yêu cầu (request) từ client và các trả lời từ máy chủ server. Mô hình client/server này giúp tách biệt các yêu cầu khác nhau giữa client/sever và cho phép hai thành phần này có thể phát triển độc lập với nhau.
Phi trạng thái (Stateless)
Các dịch vụ REST phải là phi trạng thái. Từng cuộc gọi API riêng lẻ phải chứa tất cả các thông tin cần thiết mà máy chủ cần biết để thực hiện và trả kết quả, bất chấp những lần gọi khác trước đó từ cùng một người dùng API.
Máy chủ không cần các thông tin khác từ các lần gọi API trước đó để hoàn thành lần gọi API hiện tại. Địa chỉ URI chỉ ra vị trí của tài nguyên và phần thân body sẽ chứa trạng thái của tài nguyên. Một dịch vụ dạng phi trạng thái thì dễ dàng mở rộng, cho phép chúng ta thêm các máy chủ mới một cách dễ dàng mà không cần phải lo lắng về các yêu cầu sau đó đến cùng một máy chủ. Các máy chủ cũng có thể thực hiện cân bằng tải khi cần thiết.
Hỗ trợ tính năng cache
Với dịch vụ REST, các dữ liệu trong kết quả trả về phải được gán nhãn một cách ngầm định là có thể sao lưu cache được hay không. Dịch vụ này chỉ ra khoảng thời gian mà một kết quả còn hiệu lực. Tính năng caching giúp nâng cao hiệu năng trên phía client và khả năng mở rộng trên phía server. Nếu client truy cập đến kết quả đã được cached, client sẽ tránh lặp lại cùng một lần gọi API. Thay vào đó, client chỉ sử dụng kết quả đã được cached. Điều này giúp cho tải trên server giảm, và như vậy giúp gia tăng khả năng mở rộng và hiệu năng của máy chủ.
Các phương thức GET request có thể lưu cache. Thông thường các trình duyệt xem tất cả các GET là có thể lưu trong bộ nhớ cache. Các phương thức POST thì không cache được. Chúng ta có thể làm cho POST có thể cache bằng cách thêm vào Cache-Control header hoặc Expires header trong thông điệp trả về response. Còn các thông điệp PUT và DELETE thì không thể lưu trong cache.
Giao diện nhất quán
Giao diện nhất quán là một thỏa thuận cho giao tiếp giữa client và server. Sự thống nhất đạt được thông qua bốn ràng buộc phụ sau:
- Tên của tài nguyên: các tài nguyên được nhận dạng duy nhất bởi URI. Các danh hiệu này là ổn định và không thay đổi trong các lần tương tác, ngay cả khi trạng thái tài nguyên này thay đổi.
- Thao tác các tài nguyên thông qua các định dạng: một client sẽ thao tác các tài nguyên bằng cách gửi các định dạng mới. Server sẽ kiểm soát định dạng tài nguyên và có thể chấp nhận hay từ chối định dạng mới được gửi bởi client.
- Các thông điệp tự mô tả: các thông điệp request/response chứa tất cả các thông tin cần thiết để phía server và phía client có khả năng diễn dịch các thông điệp và quản lý nó tương ứng. Các thông điệp bao gồm các phương thức, giao thức được sử dụng và kiểu của nội dung. Tính năng này giúp mỗi thông điệp là độc lập với nhau.
- Hypermedia as the Engine of Application State (HATEOS): siêu phương tiện (Hypermedia) kết nối các tài nguyên với nhau sao cho máy có thể đọc được. Hypermedia ám chỉ đến các siêu liên kết (hyperlinks, hay đơn giản là các links) mà máy chủ có thể chỉ ra trong kết quả trả về. Hypermedia là một cách thức để máy chủ có thể báo cho client biết những yêu cầu http request nào mà máy clients có thể thực hiện trong tương lai.
Một hệ thống phân lớp tiếp tục được xây dựng trên kiến trúc client/server. Một hệ thống phân lớp chỉ ra rằng có nhiều thành phần khác, chứ không chỉ là client hay server và mỗi hệ thống còn có các lớp khác trong nó. Các lớp này phải dễ dàng thêm, bớt hay thay đổi. Các proxy, thiết bị load balancer...là các ví dụ của các thành phần thêm vào này.
Code theo yêu cầu
Tính năng này là một tùy chọn trong đó cho phép các client sự linh hoạt bằng cách cho phép client tải về các đoạn mã. Client có thể yêu cầu code từ máy chủ và sau đó các kết quả trả về từ máy chủ có chứa các đoạn code, thường ở dưới dạng của một đoạn scrips nếu kết quả trả về ở dạng HTML. Client sau đó có thể thực thi đoạn mã đó.