Giải thích cho vợ về REST
restful
12
White

Ngoc Dao viết ngày 20/03/2016

10 năm trước, khi Rails 1.2 ra đời nó đã tạo ra cơn sốt REST. Ngày nay REST là cái lập trình viên mới vào nghề đã phải học, nhưng vào thời điểm ấy nó còn là cái cực kì mới lạ và hấp dẫn, làm mọi người đều phải đổ xô tìm hiểu và viết về nó.

Đây là bản dịch tiếng Việt của bài viết How I Explained REST to My Wife của Ryan Tomayko, do anh Trần Trường Đức Giang thực hiện năm 2007 khi còn là sinh viên. Anh Giang trước làm cho Yahoo!, hiện là sếp lớn của một công ty phần mềm ở Saigon. Bài viết giải thích một cách dễ hiểu về khái niệm và cấu trúc của REST, một hướng đi để giải quyết vấn đề lấy nội dung thông tin từ các trang web bằng việc đọc các trang web đã được định dạng. REST được Roy Fielding, tác giả của giao thức HTTP tạo ra, hứa hẹn mang lại sức sống mới cho web.

Phong trào học tiếng Nhật đang lên, bạn nào tò mò có thể tham khảo bản tiếng Nhật ở đây.

Bây giờ mời các bạn vào phần chính của câu chuyện giữa Ryan và vợ anh ta.

Vợ: Roy Fielding là ai?

Ryan: Là một ông nào đấy và là một người thông minh.

Vợ: Vậy à! Thế thì ông ta làm gì?

Ryan: Ông ta giúp sức viết ra web server đầu tiên. Sau đó thì còn làm rất nhiều nghiên cứu để giải thích sự hoạt động của web. Tên của ông ta có trên bảng giải thích chi tiết (specifications) về giao thức (protocol) mà em thường dùng để lấy trang tin từ server về trình duyệt của mình đấy.

Vợ: Vậy nó hoạt động thế nào?

Ryan: Web à?

Vợ: Vâng.

Ryan: Hmm, thật ra nó khá tuyệt đấy. Một điều buồn cười là nó hầu như được đánh giá không đúng giá trị của nó. Giao thức mà anh đang nói đến, HTTP, nó có khả năng đảm nhận mọi thứ mà người ta thường hay bỏ qua với một vài lý do nào đấy.

Vợ: Ý anh là cái “http” mà em vẫn thường gõ vào trình duyệt đấy à?

Ryan:Đúng thế đấy. Phần đầu tiên thông báo cho trình duyệt giao thức nào được dùng. Cái mà em gõ vào là một trong những thứ quan trọng nhất trong lịch sử máy tính đấy.

Vợ: Tại sao thế anh?

Ryan: Bởi vì nó có khả năng diễn tả vị trí của một thứ gì đấy ở bất kì nơi nào từ bất kỳ nơi nào trên thế giới này. Nó là nền tảng của web. Em cứ xem nó giống nhưng là tọa độ của GPS đối với tri thức và thông tin.

Vợ: Cho các trang web à?

Ryan: Thật ra là cho mọi thứ. Roy Fielding nói rất nhiều về các thứ mà nó trỏ đến trong các đề tài nghiên cứu của mình mà anh đã nói đến. Web được xây dựng trên một kiểu kiến trúc gọi là “REST”. REST cung cấp định nghĩa cho một “tài nguyên” (resource) mà các thứ đấy trỏ đến.

Vợ: Thế trang web là một tài nguyên à?

Ryan: Một dạng như vậy đấy. Trang web là “phần trình diễn” (presentation) cho tài nguyên. Tài nguyên chỉ là những khái niệm. Như URLs mà em vẫn thường gõ vào trình duyệt ấy…

Vợ: Em biết URL là gì mà…

Ryan: À, đúng rồi nhỉ. Cái đấy dùng để nói với trình duyệt về việc có những khái niệm (concept) ở chỗ nào ấy. Trình duyệt có thể đi hỏi về phần trình diễn xác định cho khái niệm ấy. Ở trường hợp này thì trình duyệt sẽ hỏi về trang web là phần trình diễn cho khái niệm.

Vợ: Giống như thế nào?

Ryan: Hmm. Có một khái niệm họ gọi là “Dịch vụ web” (Web Services). Nó có nghĩa là có rất nhiều thứ cho rất nhiều người nhưng khái niệm cơ bản vẫn là làm sao để máy tính có thể sử dụng web như con người làm vậy.

Vợ: Vậy có phải là 1 thứ giống robot không?

Ryan: Không hẳn là như vậy. Anh không nói là máy tính sẽ ngồi xuống bàn và duyệt web. Nhưng máy tính có thể sử dụng những giao thức tương đồng với nhau để truyền tin tức qua lại với nhau. Chúng ta đã sử dụng nó trong 1 thời gian dài nhưng không có một kỹ thuật nào hoạt động tốt khi chúng ta muốn có thể nói chuyện với tất cả các máy tính trên toàn thế giới này.

Vợ: Tại sao không?

Ryan: Bởi vì nó không được thiết kế để hoạt động như thế. Khi Fielding và cộng sự của ông ta bắt đầu xây dựng web thì làm thế nào để có thể nói chuyện với bất cứ máy tính nào trên toàn thế giới là sự quan tâm chính. Phần lớn các kỹ thuật chúng ta sử dụng ngày nay đều không có những yêu cầu như vậy. Em chỉ cần nói chuyện với 1 nhóm nhỏ các máy tính thôi.

Vợ: Vậy bây giờ anh muốn nói chuyện với toàn bộ các máy tính à?

Ryan: Đúng rồi và hơn thế nữa. Chúng ta cần có thể nói chuyện với tất cả các máy tính về mọi thứ nằm trên tất cả các máy tính khác. Do đó, chúng ta cần có cách nào đấy để làm cho 1 máy tính nói với một máy khác về “tài nguyên” mà có thể có trên máy khác.

Vợ: Là thế nào?

Ryan: Cứ cho rằng em đang nói chuyện với chị của em và chị ta muốn mượn cây chổi hay gì đấy. Em không có nó nhưng mẹ em thì có. Thế là em bảo chị đi mượn cây chổi ở chỗ của mẹ. Điều này diễn ra thường xuyên trong đời sống và nó cũng diễn ra trong suốt thời gian máy tính bắt đầu nói chuyện.

Vợ: Thế thì máy tính dùng cách nào để nói về vị trí của mấy thứ đấy cho máy khác? Ryan: Dĩ nhiên là bằng URL. Nếu mọi thứ mà máy tính cần nói về có 1 URL tương ứng thì em thật sự đã tạo ra một “kiểu tương đồng máy tính của một danh từ” (the machine equivalent of a noun). Theo đó anh, em và toàn thế giới đã đồng ý là việc nói chuyện về các danh từ theo một kiểu xác định nào đấy là rất quan trọng.

Vợ: Đúng rồi!

Ryan: Máy tính không có một danh từ tổng quát (universal noun), chính vì vậy mới không được. Mỗi ngôn ngữ lập trình, cơ sở dữ liệu hay các dạng hệ thống khác đều có những cách khác nhau để nói về danh từ. Đó là vì sao URL rất quan trọng. Nó khiến cho các hệ thống này nói với các hệ thống khác về các danh từ của nó.

Vợ: Nhưng khi em nhìn vào trang web, em đâu có nghĩ nó như thế đâu.

Ryan: Không ai nghĩ như vậy cả. Ngoài Fielding và các cộng sự ra. Chính vì vậy mà máy tính vẫn chưa được.

Vợ: Thế còn động từ, đại từ và tính từ thì sao?

Ryan: Thật vui khi em hỏi vì đó lại là một khía cạnh lớn khác của REST. Động từ có ở khắp mọi nơi.

Vợ: Em chỉ đùa thôi.

Ryan: Đúng là đùa thật nhưng thực ra nó không đùa tí nào cả. Động từ rất quan trọng. Có một khái niệm rất quan trọng trong lập trình và khoa học máy tính (Computer Science – CS) gọi là “đa hình thái” (polymorphism). Đây là một cách nói để chỉ về việc cách danh từ khác nhau có thể được gắn kết với cùng một động từ.

Vợ: Em chưa hiểu lắm.

Ryan: Vậy à. Hãy nhìn cái bàn uống cafe xem. Danh từ là những cái nào? Tách, khay, tờ báo, cái điều khiển. Bây giờ em có thể làm gì với các thứ đấy?

Vợ: Em vẫn chưa hiểu…

Ryan: Em có thể “lấy” (GET) nó chứ? Em có thể cầm nó lên. Em có thể đập nó. Em có thể đốt nó. Em có thể gắn kết các động từ giống nhau cho từng vật ấy.

Vợ: Ra là thế… vậy thì?

Ryan: Cái này quan trọng. Sẽ là sao nếu thay vì anh có thể nói với em “lấy cái tách”, “lấy tờ báo”, “lấy cái điều khiển”; sẽ là sao nếu chúng ta cần những động từ khác nhau cho các danh từ? Anh không thể dùng từ “lấy” một cách tổng quát được, nhưng như vậy vẫn tốt hơn việc phải nghĩ ra một từ mới cho mỗi cặp danh từ/động từ.

Vợ: Ừ nhỉ. Thật là lạ.

Ryan: Đúng là vậy đấy. Bộ não chúng ta đủ linh hoạt để biết rằng một động từ có thể được gắn kết với nhiều danh từ khác nhau. Một số động từ thì đặc biệt hơn những từ khác và chỉ áp dụng được với một nhóm nhỏ các danh từ. Chẳng hạn em không thể “lái cái tách” hay “uống cái xe”. Những một số động từ thì mang ý nghĩa tổng quá như GET, PUTDELETE.

Vợ: Nhưng anh không thể DELETE cái tách.

Ryan: Đúng, nhưng em có thể quẳng nó đi mà. Đó lại là một trò đùa nữa.

Vợ: Đúng rồi!

Ryan: Dù thế nào đi nữa thì giao thức HTTP mà Fielding và cộng sự của ông ta đã tạo ra chẳng qua chỉ là gắn kết các động từ vào danh từ. Chẳng hạn khi em đi đến 1 trang web, trình duyệt dùng HTTP GET trên URL mà em gõ vào và trả trở lại một trang web.

Các trang web thường là có nhiều hình ảnh phải không? Đó là những tài nguyên tách biệt khác. Trang web chỉ cần chỉ định URL đến các hình ảnh đấy và trình duyệt sẽ tạo ra thêm nhiều HTTP GET nữa trên các tài nguyên ấy cho đến khi toàn bộ chúng được hiển thị ra. Nhưng điều quan trọng ở đấy là với rất nhiều loại danh từ khác nhau có thể có cùng một cách đối xử. Với những danh từ như hình ảnh, văn bản, video, mp3, slideshow, v..v em để có thể GET tất các thứ ấy bằng cách chỉ định URL.

Vợ: Nghe như GET là một động từ khá quan trọng nhỉ?

Ryan: Đúng thế. Đặc biệt là khi em dùng trình duyệt, bởi vì trình duyệt chỉ chủ yếu là GET mọi thứ về. Nó không làm các loại tương tác khác với các tài nguyên. Đây thật sự là một vấn đề vì nó khiến mọi người hiểu làm là HTTP chỉ là để GET. Nhưng thật ra HTTP là một giao thức tổng quát dùng để gắn kết động từ với danh từ.

Vợ: Tuyệt! Nhưng em vẫn chưa thấy nó làm thay đổi vấn đề gì cả. Thế những loại danh từ, động từ nào là anh muốn?

Ryan: Danh từ thì có nhiều nhưng nó không ở dạng đúng của nó. Hãy nghĩ về chuyện em duyệt hàng ở Amazon.com để tìm mua cho anh một món quà Noel. Tưởng tượng mỗi sản phẩm là một danh từ. Bây giờ nếu nó hiện diện ở phần trình diễn mà máy tính có thể hiểu thì em có thể làm được nhiều điều rất gọn gàng.

Vợ: Tại sao máy tính lại không hiểu một trang web bình thường?

Ryan: Vì trang web được thiết kế để có thể hiểu được bởi con người. Máy tính không cần quan tâm đến layout hay kiểu mẫu (styling) gì cả. Về cơ bản, máy tính chỉ cần có dữ liệu. Lý tưởng mà nói thì mỗi URL sẽ có “phần trình diễn người hiểu”(human readable presentation) và một “phần trình diễn máy hiểu” (machine readable presentation). Khi máy tính GET tài nguyên nào, nó sẽ yêu cầu phần trình diễn máy hiểu. Và khi trình duyệt GET tài nguyên cho người, nó sẽ yêu cầu phần trình diễn người hiểu.

Vợ: Vậy người ta cần làm định dạng máy tính cho tất cả các trang của họ à?

Ryan: Nếu nó có giá trị. Nãy giờ chúng ta nói về vấn để này một cách khá trừu tượng. Để thay đổi hãy nói về một ví dụ thực tế.

Em là một cô giáo, ở trường anh cá là em có một hệ thống máy tính lớn, hoặc 3 hay 4 hệ thống gì đấy để cho em có thể quản lý học sinh. Việc quản lý như lớp học, thứ hạng, thông tin liên lạc khẩn cấp của học sinh, thông tin về sách vở em dạy v.v . Nếu hệ thống là nền Web thì có thể có URL cho từng danh từ có liên quan như: student, teacher, class, book, room, v.v .

Ngay bây giờ, lấy URL thông qua trình duyệt sẽ trả lại cho em 1 trang web. Nếu có một phần trình diễn máy hiểu cho mỗi URL thì thật là bình thường để cài các công cụ mới vào hệ thống bởi vì tất cả các thông tin đều được thiết định ở một dạng tiêu chuẩn. Nó cũng sẽ làm cho việc giao tiếp giữa các hệ thống trở nên dễ dàng hơn. Hoặc em có thể xây dựng cả một hệ thống cấp tỉnh, cấp quốc gia mà có thể nói giao tiếp được với từng hệ thống riêng rẽ của trường để tập hợp điểm thi. Khả năng là vô số.

Mỗi hệ thống sẽ lấy thông tin từ các hệ thống khác sử dụng HTTP GET đơn giản. Nếu một hệ thống nào muốn thêm gì đấy vào hệ thống khác, nó sẽ dùng HTTP POST. Nếu một hệ thống nào muốn cập nhật gì đấy trong hệ thống khác, nó sẽ dùng HTTP PUT. Vấn đề còn lại duy nhất là việc dữ liệu nên được thiết kế thế nào?

Vợ: Thế đây là cái mà anh và những người khác đang làm bây giờ à? Quyết định việc dữ liệu phải như thế nào?

Ryan: Đáng buồn là không phải như thế. Thay vào đấy, đa số họ thì bận rộn để viết các lớp cho các đặc điểm phức tạp (layers of complex specifications) để làm các thứ với những cách không thật sự hữu dụng. Danh từ không tổng quát (universal) và động từ thì không đa hình thái (polymorphic). Chúng ta đã lãng phí nhiều thập kỷ của việc ứng dụng thực tế, kiểm chứng kỹ thuật để bắt đầu lại với các thứ rất giống với những hệ thống đã thất bại trong quá khứ. Chúng ta sử dụng HTTP chỉ là vì nó giúp chúng ta giao tiếp với mạng và với chuyên viên bảo mật ít hơn. Chúng ta đang bán đi sự đơn giản để đổi lấy các công cụ hào nhoáng và tự động.

Vợ: Tại sao thế?

Ryan: Anh không biết nữa.

Vợ: Sao anh không nói gì cả vậy?

Ryan: Anh sẽ nói …

Tìm hiểu thêm về REST

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
285 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
62 8
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết hơn 2 năm trước
62 8
White
40 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 2 năm trước
40 1
White
34 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 2 năm trước
34 1
Bài viết liên quan
White
12 5
Setup hệ thống Api với Nodejs trong 1 nốt nhạc Mục đích bài viết là sẽ giúp setup hệ thống api cơ bản, và cung cấp giao diện admin để thao tác với...
Xaolonist viết 1 năm trước
12 5
White
3 1
Chú ý: Bài viết này trình bày chủ yếu cho CentOS 64 bit, tuy nhiên ý tưởng có thể áp dụng cho các hệ điều hành khác. Cuối bài có ghi chú cho Ubunt...
Ngoc Dao viết hơn 2 năm trước
3 1
White
12 0
Idempotency là gì? Theo Wikipedia Idempotence (/ˌaɪdɨmˈpoʊtəns/) is the property of certain operations in mathematics and computer science, tha...
Cẩm Huỳnh viết hơn 2 năm trước
12 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
285 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!