WebAppDevLê Đình Thanh, Nguyễn Việt Anh 189 189 24. } 25. } 26. // Thực thi 27. FrontController::proc();
9.4. RESTFUL URL, REST API
URL ngữ nghĩa đƣợc sử dụng phổ biến trong hầu hết các ứng dụng web ngày nay. Tuy chƣa có một tiêu chuẩn nào quy định về cách thức tạo URL ngữ nghĩa,
đa số những ngƣời phát triển ứng dụng web đã vận dụng phong cách REST
(Representational State Transfer)22 cho việc tạo URL. URL đƣợc tạo theo phong cách REST đƣợc gọi là RESTful hay REST-style URL. Theo phong cách REST, mỗi
tài nguyên của ứng dụng web chỉ là một khái niệm, hay là một ánh xạ có tính khái niệm đến các thực thể. Tài ngun khơng phải là thực thể. Bất kỳ thơng tin gì có thể đặt tên đều có thể trở thành tài nguyên: một tài liệu, một hình ảnh, một dịch
vụ, một mục dữ liệu, một bộ sƣu tập các tài nguyên khác. Việc đặt tên cho các tài nguyên và ánh xạ tài nguyên đến URL theo phong cách REST đƣợc mơ tả nhƣ sau: 1. T|i ngun có thể ở dạng sƣu tập hoặc c{ thể. Ví dụ, "forums" là tài nguyên
sƣu tập v| "forum" l| t|i nguyên c{ thể. Chúng ta có thể xác định tài nguyên sƣu tập "forums" bằng URL "/forums" và xác định một tài nguyên cá thể
"forum" bằng URL "/forums/{forumId}".
2. Một tài nguyên có thể chứa các tài nguyên con. Ví dụ, "forum" có thể chứa "posts" và "meta". Mỗi "posts" là một tài nguyên sƣu tập mang thông tin về các bài viết/ý kiến trong một diễn đ|n. Mỗi "meta" là một tài nguyên cá thể mang thông tin mô tả về một diễn đ|n. Quan hệ phân cấp giữa các tài nguyên đƣợc biểu thị bằng dấu chéo trái (/) trong phần đƣờng dẫn (path) của URL. Ví dụ, chúng ta có thể xác định một tài nguyên sƣu tập "posts" bằng URL
"/forums/{forumId}/posts" và xác định một tài nguyên cá thể "post" bằng URL
"/forums/{forumId}/posts/{postId}". Tƣơng tự, một tài nguyên cá thể "meta" có thể đƣợc xác định bằng URL "/forums/{forumId}/meta".
3. Các hàm chức năng cùng với thông số và giá trị trả về, cũng nhƣ dữ liệu vào và dữ liệu ra của chƣơng trình đều đƣợc xem là tài nguyên. Chúng là các
khái niệm về các thủ tục. Tài nguyên điều khiển (controller resource) đƣợc sử dụng để mơ hình hóa những khái niệm này. Ví dụ, "close" là thủ tục đóng
diễn đ|n nhằm không cho ngƣời dùng tiếp tục đƣa nội dung lên diễn đ|n
nữa. Tài nguyên "close" của một diễn đ|n có thể xác định bằng URL
"/forums/{forumId}/close".
4. Tuy nhiên, các thủ tục CRUD (Create, Read, Update, Delete) không nên đƣợc thể hiện bằng tài nguyên điều khiển nhƣ những hàm chức năng khác. Thay
22
REST l| một kiểu/phong c{ch kiến trúc phần mềm/hệ thống đƣợc Roy Fielding đề xuất năm 2000.
WebAppDevLê Đình Thanh, Nguyễn Việt Anh
190 vào đó, chúng đƣợc thể hiện bằng việc kết hợp URL với phƣơng thức HTTP. Ví dụ, các thủ tục CRUD cho bài viết thuộc một diễn đ|n đƣợc thể hiện nhƣ sau:
"GET /forums/{forumId}/posts" Đọc tất cả b|i viết
"GET /forums/{forumId}/posts/{postId}" Đọc một b|i viết
"POST /forums/{forumId}/posts" Thêm mới một b|i viết
"PUT /forums/{forumId}/posts/{postId}" Cập nhật một b|i viết
"DELETE /forums/{forumId}/posts/{postId}" Xóa một b|i viết
5. Có thể sử dụng truy vấn để thực hiện các tính năng chung nhƣ sắp xếp, lọc, phân trang trên tài nguyên sƣu tập. Ví dụ, có thể sử dụng URL sau để thể hiện mong muốn lọc các bài viết thuộc một diễn đ|n đƣợc đăng từ ngày
01/01/2018 trở đi và sắp xếp các bài viết đƣợc đăng gần nhất lên trên: "GET /forums/{forumId}/posts?from=01/01/2018&sort=date&order=desc" 6. Ngoài ra, một vài khuyến nghị khác cũng đã đƣợc đƣa ra cho việc tạo URL
theo phong khách REST nhƣ sử dụng chữ viết thƣờng, sử dụng dấu gạch
ngang (-) để tăng tính dễ đọc, khơng sử dụng dấu gạch dƣới (_), không sử dụng tên mở rộng của tệp, không sử dụng dấu chéo trái ở cuối URL.
Để có RESTful URL, bộ định tuyến cần đƣợc nâng cấp để xử lý URL một cách
tinh tế hơn, bởi vì lúc này tên bó, tên bộ điều khiển và tên hành động là tên của những thực thể không cần xuất hiện trong URL nữa. Bộ định tuyến cần ánh xạ tên tài nguyên sang các thực thể bó, bộ điều khiển và hành động. Một cài đặt của bộ
định tuyến có thể nhƣ sau. Nó kiểm tra phƣơng thức HTTP và đối sánh URL với
các biểu thức chính quy. Nếu cả phƣơng thức HTTP và biểu thức chính quy đƣợc thỏa mãn, bộ định tuyến sẽ trả về tên bó, tên bộ điều khiển, tên hành động cùng
các tham số tƣơng ứng. Ví dụ, nếu phƣơng thức HTTP và URL là "GET /forums/6", hành động viewForumById của bộ điều khiển forum sẽ đƣợc triệu gọi với một tham số có tên là forumId và giá trị là 6 (các dịng 28-33). Ví dụ khác, nếu phƣơng thức HTTP và URL là "PUT /forums/6", hành động updateForumById của bộ điều khiển
forum sẽ đƣợc triệu gọi với hai tham số có tên lần lƣợt là forumId và
forumNewName, với giá trị của forumId là 6, của forumNewName là giá trị của biến forumNewName đƣợc chứa trong thân của yêu cầu HTTP (các dòng 34-41).
1. <?php
2. // Tệp app/core/control/Router.php 3. namespace core\control; 3. namespace core\control;
4.
5. class Router {
6. public static function proc() {