Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Tạo, lắp ghép và triển khai các ứng dụng hiện đại với nền tảng mạnh mẽ mà đơn giản Roland Barcia ([email protected]) Nhân viên kỹ thuật cao cấp Systems Documentation, Inc. (SDI) 20 05 2009 Steve Ims ([email protected]) Kỹ thuật viên cao cấp Systems Documentation, Inc. (SDI) Trong loạt bài này, học tất cả về IBM® WebSphere® sMash của IBM, một môi trường đơn giản cho việc tạo lập, lắp ghép và thực thi các ứng dụng dựa trên các công nghệ Web hiện nay. Trong bài đầu tiên này, trải nghiệm thực tập những phương pháp mới mà cho phép bạn tạo lập, lắp ghép và triển khai các ứng dụng Web mạnh mẽ. Học WebSphere sMash mang tính hướng cộng đồng như thế nào và về các quy ước của chúng để tạo ra các dịch vụ RESTful Web. Sử dụng một ví dụ từng bước một, bạn cài đặt môi trường, tạo một dự án, xây dựng một dịch vụ RESful để thể hiển dữ liệu, kiểm tra ứng dụng của bạn, và đưa vào một ứng dụng mẫu để sử dụng các dịch vụ RESful. Ghi chú của người biên soạn: Khi bài báo này lần đầu tiên được phát hành, nó dựa trên mã của một dự án được ấp ủ có tên là Project Zero. Tại thời điểm đó, cái tên Project Zero được hiểu là bộ mã và cộng đồng. Bộ mã đó hiện vẫn đang tồn tại như một sản phẩm có tên gọi là IBM WebSphere sMash. Project Zero ngày nay được phát triển dạng cộng đồng cho WebSphere sMash và sẽ tiếp tục được cung cấp cho các nhà phát triển như một nền tảng miễn phí để phát triển các ứng dụng với những kiến trúc mới nhất, tính năng mới nhất nhằm hỗ trợ cho cộng đồng. Giới thiệu IBM WebSphere sMash được tập trung vào phát triển nhanh các ứng dụng Web 2.0 đi theo kiến trúc hướng dịch vụ (Service-Oriented Architecture - SOA). Web 2.0 được áp dụng cho SOA cho phép các sản phẩm Web mở rộng phạm vi của SOA. Nghĩ về nó như là RESful SOA. (Representational State Transfer (REST) là một dạng kiến trúc.) © Copyright IBM Corporation 2009 Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Nhẫn hiệu đăng ký Trang 1 của 58 developerWorks® ibm.com/developerWorks/vn/ RESful SOA là tập con của SOA tập trung vào Hypertext Transfer Protocol (HTTP) và các nguyên tắc RESful cơ bản. RESful SOA ủng hộ sử dụng các mẫu thiết kế đã làm nên thành công của Web; nó làm nên ý nghĩa và đó là lợi ích chung của chúng ta khi đi theo các mẫu với các thiết kế ứng dụng này. Những lợi ích đó bao gồm: • Khả năng mở rộng, thông qua thực thi cất giữ tạm (caching) và các tương tác phi trạng thái. • Đơn giản, với các điều kiện tiên quyết thông thường là HTTP và XML hoặc phân tích (parsing) cú pháp và dịch (rendering) JavaScript Object Notation (JSON). • Một "mạng hiệu quả" tiếp cận rộng đến từ các tiêu chuẩn thông thường. Ví dụ, các trang web có thể sử dụng hoặc tổng hợp Atom hoặc các điểm nguồn (feed) RSS mà không cần biết các chi tiết thông tin về nội dung. WebSphere sMash giới thiệu một môi trường đơn giản cho việc tạo lập, lắp ghép và thực hiện các ứng dụng dựa trên các công nghệ Web phổ biến. Môi trường của WebSphere sMash bao gồm một môi trường thực thi kịch bản cho Groovy và PHP với các giao diện lập trình ứng dụng được tối ưu hóa cho việc tạo ra các dịch vụ kiểu REST, tích hợp các mashup và các giao diện Web. Mục tiêu chính của WebSphere sMash bao gồm cả lĩnh vực kỹ thuật và xã hội. Mục tiêu kỹ thuật là cung cấp một nền tảng có khả năng mở rộng để đơn giản hóa việc phát triển ứng dụng theo ba hướng quan trọng: Tạo lập Làm đơn giản hóa việc phát triển cùng với hỗ trợ các ngôn ngữ kịch bản (hiện tại là Groovy và PHP), các quy ước để phát triển các mẫu RESful và các danh mục tài sản có thể tái sử dụng lại. Lắp ghép Cho phép nhanh chóng truy xuất và nhóm gộp các dịch vụ khác nhau thành các ứng dụng thống nhất, bao gồm các luồng dữ liệu, biên soạn phối hợp và các điều chỉnh tùy chọn. Triển khai Cung cấp môi trường thực thi ứng dụng trung tâm dựa trên máy ảo Java™ (JVM) vừa được biết rộng rãi và vừa ổn định, nó được tối ưu cho quá trình phát triển nhanh (bản thiết kế nhỏ, khởi động lại nhanh). Các mục đích xã hội của liên quan đến quá trình phát triển của nó. WebSphere sMash đang được phát triển trong môi trường mở như là phát triển mang tính thương mại hướng cộng đồng (community-driven commercial development - CD/CD). Project Zero là một cộng đồng phát triển cho WebSphere sMash. Cộng đồng người sử dụng cũng có thể quan sát và có những ảnh hưởng đến quyết định kỹ thuật cho WebSphere sMash. Những người dùng cũng truy cập trực tiếp tới đội phát triển và mã nguồn của nó. Mức trong suốt này cho phát triển phần mềm thương mại là một điều mới mẻ đối với IBM; nó dẫn đến việc cung cấp có hiệu quả cao. Đi cùng với CD/CD, tất cả các thông tin về WebSphere sMash phù hợp với CD/CD có ở projectzero.org. Loạt bài này sẽ không tiết lộ thông tin mới về WebSphere sMash, nhưng sẽ đưa ra chỉ dẫn mang tính cấu trúc cho các khái niệm cơ bản. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 2 của 58 ibm.com/developerWorks/vn/ developerWorks® Các dịch vụ RESTful REST mô tả một mẫu thiết kế để thực thi các hệ thống nối mạng. REST không phải là một công nghệ cũng chẳng phải là một chuẩn; nó là một dạng kiến trúc để thể hiện ra các tài nguyên thông qua Web. Kiến trúc RESful gắn với một loạt các nguyên tắc sau: • Các lời yêu cầu (request) là khách-chủ (client-server) và một cách tự nhiên sử dụng kiểu tương tác dựa trên kéo (pull). Các thành phần tiêu thụ kéo những đại diện của trạng thái xuống từ máy chủ. • Các lời yêu cầu là phi trạng thái. Mỗi lời yêu cầu từ máy khách tới máy chủ phải chứa mọi thông tin cần thiết để hiểu lời yêu cầu đó và không thể tận dụng được bất kỳ ngữ cảnh được lưu trên máy chủ. • REST không nhất thiết phải có trạng thái ở tầng trung gian; trạng thái thi hành lời yêu cầu cho một tài nguyên không phụ thuộc vào trạng thái đó. • Các máy trạm và máy chủ đều tuân thủ theo một giao diện thống nhất. Tất cả các tài nguyên được truy xuất với một giao diện chung trong thế giới của SOA Web mở rộng - HTTP cùng với các phương thức của HTTP: GET, POST, PUT, DELETE. • Các máy trạm tương tác với các tài nguyên đã được đặt tên. Hệ thống cấu thành từ các tài nguyên được đặt tên bằng cách sử dụng một địa chỉ URL, chẳng hạn như một HTTP URL. Chuyển trạng thái đặc trưng (Representational State Transfer - REST) là một kiểu kiến trúc phần mềm cho các hệ thống siêu phương tiện (hypermedia) phân tán, chẳng hạn như mạng toàn cầu (WWW). REST là công nghệ then chốt để biểu diễn các dịch vụ trên Web. Điều quan trọng là cần phải hiểu rằng REST làm việc tốt nhất khi nó bộc lộ các dịch vụ dựa trên dữ liệu. Các dịch vụ dữ liệu này sau đó có thể được trộn lẫn và lựa chọn để xây dựng các ứng dụng mới (thường được gọi là mashup). Ví dụ dưới đây sẽ cho ta thấy một máy khách nhìn một dịch vụ RESful như thế nào. với http://<host>/customer: • GET: Trả về danh sách các khách hàng • POST: Tạo một bản ghi khách hàng Với http://<host>/customer/roland: • GET: Trả về bản ghi khách hàng Roland • PUT: Cập nhật bản ghi Roland • DELETE: Xóa bản ghi Roland Trong ví dụ này, tài nguyên được bộc lộ là Khách hàng (Customer). Khách hàng được biểu diễn bởi URL/customer. Các khách hàng cụ thể được biểu diễn bằng cách chèn một định danh vào Customer, chẳng hạn như /customer/ims. Các phương thức tiêu đề HTTP xác định mục đích truy cập tài nguyên. Thiết kế trung tâm-ứng dụng so với trung tâm-máy chủ Trong các doanh nghiệp, các nền tảng (chẳng hạn như các máy chủ dựa trên Java EE) tuân theo bộ tư duy trung tâm-máy chủ. Các ứng dụng Web được xây dựng và triển khai trên nền tảng ứng dụng Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 3 của 58 developerWorks® ibm.com/developerWorks/vn/ máy chủ. Những nền tảng của máy chủ, chẳng hạn như WebSphere, có thể cung cấp tất cả các đặc tính của dịch vụ mà đặc tả Java EE yêu cầu. Các ví dụ của các dịch vụ này bao gồm các thông điệp kiểu hàng đợi, giao tác phân tán hoặc quản lý giao thức. Thông thường, máy chủ phục vụ ứng dụng chạy một loạt các ứng dụng trên cùng một JVM (máy ảo Java). Các kiến trúc sư thiết kế các ứng dụng xung quanh khái niệm chia sẻ phần mềm và tài nguyên dữ liệu với các ứng dụng, với các dịch vụ được cung cấp bởi các máy chủ ứng dụng (thậm chí nếu chúng không được dùng trong một số trường hợp) Thậm chí nếu các ứng dụng được triển khai tại các máy chủ ứng dụng cô lập, thì chính các máy chủ đó vẫn tự nó thường xuyên tiến hành tất cả các dịch vụ có sẵn. Các ứng dụng máy chủ cho phép tích hợp cấp doanh nghiệp. Đặc điểm của tích hợp doanh nghiệp là các giao tác phân tán trên các hệ thống khác nhau, các thông điệp dựa trên hàng đợi cho việc phân phối dữ liệu quan trọng, hay các kiểu khác của các dịch vụ. Nền tảng trong doanh nghiệp được thiết kế xung quanh quản lý các giao thức quản lý và các phần mềm trung gian (middleware). Đôi khi họ nói về cơ sở dữ liệu doanh nghiệp phục vụ cho nhiều ứng dụng. Thế giới của Web 2.0 bao gồm một lớp tích hợp không quá cốt yếu ở mức HTTP. Các ứng dụng thường được thiết kế quanh một bộ dữ liệu, điều này có nghĩa là nó có thể được bộc lộ và pha trộn với các bộ dữ liệu khác, để tạo ra các ứng dụng mới mà có lẽ các nhà cung cấp dữ liệu không dự đoán trước được. Bạn xây dựng các ứng dụng và chạy nó. Bạn không đóng gói một ứng dụng và triển khai nó vào một máy chủ đa ứng dụng, giống như một tệp WAR nằm trong một bộ chứa JEE khác. Mỗi ứng dụng chạy trên tiến trình riêng của nó—JVM. Phần 2 của loạt bài sẽ thảo luận về việc thiết kế chi tiết hơn. Môi trường thực thi WebSphere sMash được thiết kế có vòng đời ngắn và hỗ trợ các mẫu như là tái sử dụng sau mỗi yêu cầu hoặc khi thời gian nhàn rỗi vượt quá hạn. Tất cả mọi thứ cần thiết để chạy các ứng dụng được xây dựng vào trong tiến trình, bao gồm cả ngăn xếp HTTP. Không một proxy (trình ủy nhiệm) ngoài hoặc máy chủ Web nào được yêu cầu, mặc dù một proxy ngoài được sử dụng để phân cụm và định tuyến đa ứng dụng. Các khái niệm lập trình cốt lõi của WebSphere sMash WebSphere sMash là một nền tảng mới, nền tảng đặc biệt mà nó sắp hàng Web 2.0 và SOA để hỗ trợ các thế hệ kế tiếp của các các ứng dụng nghiệp vụ dựa trên nó. Phần này bao gồm một số khái niệm cốt lõi. Cuốn Developer's Guide cung cấp chi tiết hơn về các khái niệm. Kịch bản (Scripting) và Java như là ngôn ngữ hệ thống Các ngôn ngữ kịch bản là một xu hướng chủ đạo trong sự phát triển được đơn giản hóa. WebSphere sMash hướng tới việc giảm chi phí dịch vụ phát triển bằng cách cung cấp các API đơn giản xung quanh các kịch bản (scripting). Ngôn ngữ kịch bản mặc định là Groovy, đó là ngôn ngữ dựa trên Java và cho phép các lập trình viên Java dễ dàng chuyển đổi sang Groovy. Qua một môđun mở rộng, WebSphere sMash cũng hỗ trợ PHP như là một ngôn ngữ kịch bản. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 4 của 58 ibm.com/developerWorks/vn/ developerWorks® Các sự kiện WebSphere sMash là một hệ thống dựa trên sự kiện. Tất cả các hành động chính của hệ thống được bộc lộ cho các ứng dụng như là một tập các sự kiện, với các trạng thái sự kiện thích hợp. Giống như một nhà phát triển ứng dụng, công việc chính của bạn là cung cấp một tập các bộ xử lý mà gắn được vào các sự kiện hệ thống quen thuộc để có được hành vi ứng dụng mong muốn. Những sự kiện chuẩn là các hành động có nghĩa, chúng là sự quan tâm đối với các ứng dụng. Ví dụ, một lời yêu cầu HTTP qua hệ thống gây ra tập các sự kiện. Bạn có thể viết các bộ xử lý (handler) cho các sự kiện này. Hình 1 chỉ ra khái niệm này, với các cơ hội để gắn vào sự kiện để xử lý các khía cạnh an ninh, hoặc một sự kiện phương thức HTTP (ví dụ như GET hoặc POST) đặc biệt. Xem thêm phần xử lý sự kiện Chỉ dẫn của nhà phát triển. Hình 1. Các sự kiện Bạn có thể viết trình xử lý sự kiện bằng nhiều cách, giống như là ví dụ được trình bày ở hình 2. Nếu bạn sử dụng một ngôn ngữ kịch bản chẳng hạn như Groovy hoặc PHP, bạn sẽ không nhất thiết phải cung cấp việc đăng ký trình xử lý bởi vì WebSphere sMash cung cấp rất nhiều các quy ước để giảm thiểu hoặc loại bỏ việc khai báo. Bạn có thể để các kịch bản trong những thư mục nhất định, và WebSphere Smash sẽ tự động đăng ký chúng như các trình xử lý. Ví dụ, các kịch bản hình 2 được đặt trong thư mục tên là public, nơi có thể đáp ứng như là một đáp ứng gốc của trang Web. Nếu tệp kịch bản được gọi là hello.groovy thì người sử dụng có thể gọi một phương thức HTTP GET trên http://<host>/hello.groovy. Sự kiện GET sẽ được sinh ra và trình xử lý onGET được gọi. Lưu ý rằng kịch bản đầu tiên trong hình không được đặt trong một phương thức điều khiển sự kiện nào. Bởi vì nó được đặt trong thư mục Public, WebSphere sMash sẽ gọi kịch bản để trả lời bất kỳ một phương thức HTTP nào. Các quy ước sẽ được mô tả phần sau trong bài viết này. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 5 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 2. Các ví dụ về trình xử lý sự kiện Ngữ cảnh tổng thể Các trình xử lý sự kiện trong WebSphere sMash không có các tham số đầu vào và đầu ra tường minh, chẳng hạn như là các thông tin yêu cầu và phản hồi. Bởi vì các trình xử lý sự kiện trong WebSphere sMash mang tính phi trạng thái và không duy trì trạng thái của biến thông qua các lời gọi, WebSphere sMash cung cấp ngữ cảnh tổng thể như là một phương tiện để truy cập và duy trì tất cả các trạng thái. Ngữ cảnh tổng thể cung cấp mọi dữ liệu quan tâm về sự kiện hiện thời cho ứng dụng và cơ chế để lưu và chia sẻ thông tin giữa các thành phần của ứng dụng. Ngữ cảnh tổng thể được phạm vi hóa và chia thành tập các vùng. Mỗi khu vực duy trì dữ liệu với những tính minh bạch khác nhau và với những vòng đời khác nhau, giống như được thể hiện trong hình 3. Ví dụ, vùng người sử dụng chứa các trạng thái phiên (session) cho một máy khách được định trước, nó chỉ hiện rõ đối với máy khách đó, và duy trì dữ liệu cho đến khi người sử dụng trở thành không hoạt động. Vùng yêu cầu chứa trạng thái của lời yêu cầu đang được kích hoạt (active request), nó chỉ nhìn thấy được đối với các thành phần thi hành yêu cầu đó, và trạng thái đó được duy trì cho đến khi kết thúc yêu cầu đó. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 6 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 3. Ngữ cảnh tổng thể Trong WebSphere sMash có bảy vùng. Một số vùng không lưu trữ (nonpersistent) như được miêu tả trong bảng 1. Nó chỉ ở trong bộ nhớ và không tồn tại khi khởi động lại. Bảng 1. Các vùng không lưu trữ Vùng Mô tả Config Dữ liệu trong /config được tải vào các tệp cấu hình. Dữ liệu có thể được nhìn thấy ở phạm vi tổng thể và hiệu lực đối với suốt vòng đời của ứng dụng. Vùng config có được sửa nhưng các thay đổi sẽ bị mất đi lúc khởi động lại JVM khi mà các nội dung được thiết lập lại từ các tệp khai báo. Request Dữ liệu trong vùng /request có thể nhìn thấy được đối với các luồng xử lý yêu cầu HTTP. Vùng yêu cầu có hiệu lực từ thời điểm lời yêu cầu (request) vào trong hệ thống cho đến khi lời phản hồi được gửi ra Bạn có thể thấy nó giống như lập trình servlet, nhờ đó mà vùng yêu cầu cung cấp sự kết hợp các chức năng được cung cấp bởi HttpServletRequest và HttpServletResponse. Nó bao gồm việc truy nhập dữ liệu đến: các tham số yêu cầu, tiêu đề, các cookie, POST body và dòng dữ liệu nhận và gửi đi: các tiêu đề gửi đi, cookies gửi đi... Event Dữ liệu trong /event nhìn thấy được đối với các luồng xử lý sự kiện trong suốt thời gian của sự kiện đó. WebSphere sMash cung cấp framework (khung làm việc) xử lý sự kiện cho phép các thành phần kết nối với nhau một cách lỏng lẻo để xuất và dùng các sự kiện đó. Nếu một sự kiện được gửi đến nhiều trình xử lý sự kiện thì tất cả các trình xử lý có thể truy cập đến dữ liệu sự kiện gốc từ vùng sự kiện Tmp Dữ liệu trong vùng /tmp có thể nhìn thấy được ở mức tổng thể đối với tất cả các luồng của một ứng dụng. Nó cung cấp một vùng đệm hỗn tạp mà các ứng dụng có thể sử dụng để lưu trữ bất kỳ các đối tượng nào. Với các vùng lưu trữ, như được mô tả trong bảng 2, dữ liệu vẫn tiếp tục tồn tại khi JVM khởi động lại Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 7 của 58 developerWorks® ibm.com/developerWorks/vn/ Bảng 2. Các vùng lưu trữ Mô tả Vùng User Dữ liệu trong vùng /user nhìn thấy được đối với tất cả các luồng dữ liệu của một phiên (session) HTTP. Phiên HTTP được định danh bằng giá trị cookie zsessionid tìm thấy ở trong lời gọi. Khu vực người dùng được giữ qua các quá trình phục hồi lại máy chủ. Nội dung của các vùng này được tuần tự hóa (serialized) bằng cách sử dụng Java serialization; chỉ có các đối tượng đã được tuần tự hóa mới được đặt trong nó. Một phiên HTTP quá giờ (time out) sau một khoảng thời gian không hoạt động. Thời gian timeout nhàn rỗi được cấu hình báo qua setting/ config/userZoneIdleTimeout trong tệp zero.config. Phiên làm việc cũng time out và không còn hiệu lực sau khi cookie kết thúc (hết hiệu lực) App Dữ liệu trong vùng /app có thể nhìn thấy ở mức tổng thể đối với mọi luồng của một ứng dụng. Nó cung cấp một vùng nhớ đệm cho các ứng dụng dùng lưu trữ các đối tượng có thể tuần tự hóa (serializable). Storage Dữ liệu trong vùng này có thể nhìn thấy ở mức tổng thể đối với mọi luồng của một ứng dụng. Vẫn tiếp tục tồn tại trong suốt quá trình tái chế của máy chủ. Nó cung cấp một vùng nhớ đệm cho các ứng dụng dùng lưu trữ đối tượng dữ liệu được tuần tự hóa như là các kiểu JSON, thứ mà bao gồm List, Map, String, Double, Long, Boolean và null. Vùng này lưu thông qua quá trình khôi phục và khởi động lại các máy chủ. Ngữ cảnh tổng thể có sẵn từ tất cả các phần của một ứng dụng. Phương thức truy nhập phụ thuộc vào ngôn ngữ sẽ được sử dụng. Java API đối với GlobalContext xác định các tính chất truy cập. Các liên kết cung cấp cho API thông qua Groovy và PHP. Ví dụ, biến request là gắn liền với vùng yêu cầu, điều đó có nghĩa là bạn có thể sử dụng một ký hiệu chấm như là request.myData để truy cập vùng yêu cầu myData. Ngữ cảnh tổng thể giống như một bản đồ truy cập thông qua cặp khóagiá trị. Bạn có thể lấy, đặt, liệt kê và xóa các khóa khác nhau từ ngữ cảnh tổng quát. Hình 4 sẽ đưa ra một vài ví dụ làm thế nào các trình xử lý sự kiện có thể truy cập GlobalContext. Hình 4. Truy cập ngữ cảnh tổng thể Ngữ cảnh tổng thể hỗ trợ đường dẫn giá trị, thứ mà truy cập trực tiếp vào các kiểu đối tượng cụ thể. Ví dụ bạn có thể truy cập một danh sách thành phần với zget("/request/myList#3"), hoặc giá trị của key nằm trong một bản đồ dùng zget("/request/myMap#key"). Các quy ước và cấu trúc thư mục ứng dụng Môi trường WebSphere sMash cung cấp một vài những quy ước mà có thể làm đơn giản sự phát triển của các ứng dụng WebSphere sMash và làm tối thiểu hóa các thông tin cấu hình cần được chỉ Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 8 của 58 ibm.com/developerWorks/vn/ developerWorks® ra. Một trong những mục tiêu của WebSphere sMash là càng ít thông tin cấu hình thì càng tốt. Một số quy ước thì phổ biến và được mong đợi. Ví dụ, bạn có thể đặt một kịch bản của của ứng dụng của bạn trong thư mục public, và chạy kịch bản khi hồi đáp một tài nguyên HTTP mà không cần dữ liệu khai báo. Hình 5 đưa ra một số ví dụ của một kịch bản tên là hello.groovy với một phương thức điều khiển sự kiện cho sự kiện GET. Kịch bản này sẽ được thực hiện khi GET được gọi vào địa chỉ http:// <application_host>/hello.groovy Hình 5. Thư mục public Những quy ước khác phù hợp hơn với một mẫu đặc biệt. Hình 6 trình bày một ví dụ về việc lưu trữ của kịch bản Groovy có tên là incentive.groovy dưới một thư mục đặc biệt. Cách tiếp cận này sẽ tự động đăng ký các phương thức trong thư mục này để đáp ứng các sự kiện HTTP REST. Trong bài viết này, bạn sẽ tìm hiểu cách mẫu RESTful được sử dụng để phát triển một cách nhanh chóng các dịch vụ RESTful để bộc lộ dữ liệu của bạn. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 9 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 6. Thư mục ảo hóa cho các tài nguyên RESTful Qua việc xây dựng ví dụ, các thư mục ảo hóa và ứng dụng được minh họa. Để biết thêm thông tin, bạn có thể tham khảo thêm trong phần "Virtualized directories" của cuốn Developer's Guide. Ngữ cảnh ví dụ Bạn gần như đã sẵn sàng để có thể xây dựng dịch vụ RESTful đầu tiên sử dụng WebSphere sMash. Đầu tiên, mặc dù phần này cung cấp cho một cái nhìn tổng quát về ngữ cảnh sẽ được sử dụng trong loạt bài viết này. Các yêu cầu Thông qua loạt bài viết này, bạn sẽ học các khái niệm khác nhau thông qua xây dựng một ví dụ phổ biến. Chủ đề của câu chuyện liên quan đến năng lượng. Người tiêu dùng muốn tiết kiệm chi phí năng lượng. Nhà cung cấp năng lượng đưa ra các khuyến khích (incentive) dựa vào các mẫu năng lượng nào đó. Người dùng năng lượng có thể là chủ nhà, các công ty và các thực thể khác. Ví dụ, một công ty toàn cầu có thể cần xây dựng một ứng dụng phản xạ tình huống nhanh cho phép họ tìm ra các khuyến khích sử dụng năng lượng phù hợp với họ. Họ muốn xây dựng một ứng dụng Web cho phép Internet tìm kiếm các chiến lược khuyến khích năng lượng có thể áp dụng cho các trung tâm dữ liệu của họ trên khắp thế giới. Đối với người tiêu dùng để tìm kiếm các khuyến khích, các nhà cung cấp năng lượng phải có khả năng cung cấp dữ liệu về khuyến khích thông qua Internet. Đây là điểm để RESTful SOA trở thành Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 10 của 58 ibm.com/developerWorks/vn/ developerWorks® then chốt. Khả năng có thể giải phóng nội dung của bạn trong một cơ chế RESTful cho phép người khác tạo các ứng dụng mới sử dụng dữ liệu này. Hình 7 hiển thị biểu đồ ca sử dụng (use case) cho hệ thống. Hình 7. Các ca sử dụng cho ví dụ Trong bài viết này, bạn đóng vai trò một nhà cung cấp năng lượng tên là NJEnergy. Bạn sẽ dùng WebSphere sMash để bộc lộ và quản lý dữ liệu khuyến khích. Mô hình dữ liệu NJEnergy có một bảng cơ sở dữ liệu đơn với dữ liệu khuyến khích của họ, như là được chỉ ra trong hình 8 Hình 8. Bảng khuyến khích Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 11 của 58 developerWorks® ibm.com/developerWorks/vn/ Mục đích xây dựng một ứng dụng WebSphere sMash là bộc lộ dữ liệu. Thiết kế các dịch vụ RESTful Bây giờ, dữ liệu đã được phác thảo, hãy bắt đầu bằng việc ánh xạ dữ liệu của bạn vào không gian tên RESTful. Thường là rất hữu ích khi tạo một bảng cho một thực thể liên quan tới ánh xạ tài nguyên. Bảng 3 trình bày một ví dụ về ánh xạ RESTful tới tài nguyên ví dụ. Bạn sẽ xây dựng dịch vụ RESTful này. Bảng 3. Các điểm cuối REST khuyến khích Tài nguyên Phương thức URI Biểu diễn Mô tả Incentive list /incentive GET Cả một mảng JSON các đối tượng và một điểm tin Atom Lấy một danh sách các khuyến khích (incentive) Incentive /incentive POST Đối tượng JSON Tạo mới một khuyến khích Incentive /incentive/<incentiveId> GET Đối tượng JSON Lấy một khuyến khích cá nhân Incentive /incentive/<incentiveId> PUT Đối tượng JSON Cập nhật một khuyến khích đơn Incentive /incentive/<incentiveId> DELETE Xóa một khuyến khích đơn JSON là một định dạng được lựa chọn để trình bày dữ liệu bởi vì chúng ta sẽ sử dụng một ứng dụng Internet giàu (RIA) như là một điểm cuối cho hệ thống. Đối với danh sách các khuyến khích, bạn cũng sẽ được cung cấp một nguồn tin Atom. Hầu hết các công cụ dựa trên Ajax đều hiểu JSON rất tốt vì Java là ngôn ngữ lập trình chính cho Ajax trên trình duyệt. (Để tìm hiểu chi tiết hơn về JSON có thể đọc thêm Tài nguyên.) An ninh cho các dịch vụ RESTful Sau khi bạn đã xác định được các dịch vụ, bạn có thể bắt đầu gán chất lượng các dịch vụ cho chúng. Các yêu cầu phi chức năng có hình dạng và kích cỡ khác nhau. ("Tại sao các yêu cầu phi chức năng lại có ý nghĩa?" cung cấp cách xử lý tốt và mang tính thực tiễn đối với các yêu cầu không phi chức năng.) Với REST chúng ta cung cấp các dịch vụ dựa trên HTTP, do đó việc áp dụng các yêu cầu phi chức năng được đơn giản hóa. Ví dụ sẽ giải quyết về vấn đề an ninh, tức là bạn sẽ áp dụng các luật an ninh cho các tài nguyên REST bằng cách bảo mật các URL. Bảng 4 trình bày một ví dụ về một bảng REST với một tiêu điểm an ninh. Bảng 4. An ninh Tài nguyên Phương thức URI Vai trò Mức an ninh của thể hiện Incentive /incentive POST quản trị (admin) Yes: Một nhà cung cấp chỉ có thể quản lý các chế độ khuyến khích của họ. Incentive /incentive GET tất cả No (không) Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 12 của 58 ibm.com/developerWorks/vn/ developerWorks® Incentive /incentive/<incentiveId> GET tất cả No (không) Incentive /incentive/<incentiveId> PUT quản trị (admin) Yes: Một nhà cung cấp chỉ có thể quản lý các chế độ khuyến khích của họ. Incentive /incentive/<incentiveId> DELETE quản trị (admin) Yes: Một nhà cung cấp chỉ có thể quản lý các chế độ khuyến khích của họ. Incentive /incentive?location=<input> GET tất cả No (không) Bất kỳ tài nguyên nào khác /<Anything Else> không ai cả ALL Điều kiện tiên quyết Để chạy ví dụ trong bài này, bạn cần: • Tải xuống chương trình dòng lệnh WebSphere sMash Developer Edition từ: http://www.projectzero.org/download/ • Giải nén zero.zip vào một thư mục. Ví dụ, gốc của thư mục Application. • sMashArticlePart1.zip • Giải nén nó vào bất kỳ thư mục nào. • Firefox 2.x ( http://www.mozilla.com/en-US/products/download.html ? product=firefox-2.0.0.14&os=osx&lang=en-US) • Firebug ( https://addons.mozilla.org/en-US/firefox/addon/1843) • Poster plug-in ( https://addons.mozilla.org/en-US/firefox/addon/2691) Xây dựng dịch vụ RESTful đầu tiên của bạn dùng WebSphere sMash Trong phần này, bạn bắt đầu xây dựng ứng dụng, khảo sát các kết quả đạt được, thêm vào đó một số phụ thuộc và tạo một đầu vào (entry) cấu hình cho cơ sở dữ liệu của bạn. Khởi chạy trình xây dựng ứng dụng và tạo một ứng dụng Phiên bản trước của bài này đã sử dụng plug-in Eclipse Project Zero. Trong phiên bản này, bạn sẽ sử dụng trình xây dựng ứng dụng dựa trên Web (AppBuilder) cho WebSphere sMash 1. Để khởi chạy AppBuilder, hãy đến dấu nhắc và thực hiện một lệnh. a. Bạn có thể khởi chạy AppBuilder bằng cách di chuyển đến cửa sổ terminal (chẳng hạn như iTerm với MAC hoặc dấu nhắc CMD với Windows). Di chuyển đến thư mục nơi mà bạn đã giải nén zero và chạy lệnh appbuilder open (hoặc ./appbuilder open). Hình 9 hiển thị một ví dụ dùng iTerm cho MAC. Nếu đây là lần đầu chạy AppBuilder, môi trường chạy WebSphere sMash sẽ bắt đầu tải xuống các thành phần cần thiết để chạy AppBuilder từ projectzero.org. Điều này chỉ xảy ra khi bạn chạy AppBuilder lần đầu. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 13 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 9. Cửa sổ Terminal b. Sau khi lệnh kết thúc Firefox sẽ mở cửa sổ tại http://localhost:8070. Đây chính là vị trí của AppBuilder. AppBuilder tự nó đã là một áp dụng WebSphere sMash. Hình 10 sẽ trình bày một AppBuilder được khởi chạy trong Firefox. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 14 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 10. AppBuilder 2. Bây giờ bạn đã khởi chạy AppBuilder, bạn có thể tạo một ứng dụng mới. a. Chọn New Application như được chỉ ra trong hình 11. Đặt tên cho ứng dụng NJEnergy. Giữ thư mục gốc và đảm bảo rằng nhóm mô đun không bị xáo trộn. Bạn có thể nhập vào mô tả hay không cũng được. Lựa chọn Create. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 15 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 11. Tạo một ứng dụng mới gọi là NJEnergy b. Bạn nên xem NJEnergy được chỉ ra sau đây. Nhấn vào NJEnergy dưới đây. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 16 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 12. Ứng dụng NJEnergy Các sản phẩm ứng dụng Trước khi xây dựng ứng dụng, hãy xem lại một số các sản phẩm ứng dụng. Bạn sẽ sử dụng trình xem AppBuilder explorer, nó cho phép bạn khảo sát các thư mục và các tệp của ứng dụng. Hình 13 trình bày cách bố trí (layout) của ứng dụng và giải thích các thư mục. Ở đó có một vài thư mục. Thư mục App chứa một số các thư mục con, nơi lập trình viên lưu các kịch bản. Tùy thuộc vào thư mục con, WebSphere sMash sẽ áp dụng một loạt các quy ước. Ví dụ, thư mục /app/resources được sử dụng để tạo một dịch vụ RESTful ngoài một kịch bản. Bạn sẽ làm việc đó ở bài này. Thư mục cấu hình chứa một loạt các tệp cấu hình. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 17 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 13. Cách bố trí ứng dụng Các phụ thuộc (Dependencies) Đầu tiên, thêm một số phụ thuộc cho ứng dụng của bạn. WebSphere sMash sử dụng một công nghệ từ Apache Ivy. Tệp ivy.xml được lưu giữ trong thư mục cấu hình là nơi các phụ thuộc này được duy trì. Bạn có thể tự mình soạn tệp này bằng tay, nhưng ví dụ này sử dụng các phụ thuộc của trang của AppBuilder. WebSphere sMash, thông qua Ivy sử dụng ký pháp của các repository (kho chứa), một nằm ở cục bộ (local), một nằm ở máy ở xa. Các ứng dụng WebSphere sMash sẽ khai báo một tập các phụ thuộc. Khi thi hành, qua công nghệ Ivy, sẽ nhìn vào trong kho cục bộ để xem phụ thuộc được hiển thị hay không. Nếu không, nó sẽ tải thông tin từ repository (kho chứa) từ xa. Mặc định, repository (kho chứa) từ xa được đặt trong projectzero.org. Tuy nhiên, bạn có thể cấu hình các kho khác nhau. Ví dụ, khi bạn chạy một AppBuilder lần đầu tiên, môi trường thực thi sMash tải những phụ thuộc cần thiết. Ivy cũng hỗ trợ việc tải thông tin dựa trên phiên bản. Ví dụ, bằng cách các xác định 1.0.0.0, 2.0.0.0 bạn đã chỉ cho WebSphere sMash lấy phiên bản mới nhất giữa 1.0.0.0 và 2.0.0.0 (không loại trừ lẫn nhau). Appbuilder cung cấp các công cụ để thêm các phụ thuộc từ ứng dụng của bạn hoặc từ repository (kho chứa) từ xa. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 18 của 58 ibm.com/developerWorks/vn/ developerWorks® 1. Chọn Dependencies, và bạn nhìn thấy một hộp hiển thị các phụ thuộc nó đọc trực tiếp từ tệp ivy.xml của bạn. Chọn Add. Hình 14. Các phụ thuộc 2. Bắt đầu gõ zero.data. Hãy đảm bảo lựa chọn Latest major version cho Filter By, và lựa chọn gói zero.data. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 19 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 15. Thêm các phụ thuộc 3. Thêm hai phụ thuộc nữa theo cùng cách: a. zero.atom (các thư viện sMash để tạo các điểm tin Atom) b. derby (Drivers để kết nối các phiên bản nhúng của cơ sở dữ liệu Apache Derby) Các phụ thuộc của bạn nên trông tương tự như hình 16. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 20 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 16. Thêm các phụ thuộc 4. Chuyển về tab explorer. Trong thư mục config (cấu hình), mở tệp ivy.xml. Bạn sẽ thấy tất cả các phụ thuộc được liệt kê dưới <các phụ thuộc> phần tệp XML. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 21 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 17. ivy.xml Cấu hình Mục đích của WebSphere sMash là giảm số lượng cần cấu hình để tạo một ứng dụng bằng cách dựa vào các quy ước. Tuy nhiên, thỉnh thoảng cũng cần những thứ như là cấu hình cơ sở dữ liệu và các luật an ninh. Trong phần này, bạn tạo một đầu vào cấu hình cho cơ sở dữ liệu của bạn. Cấu hình trong WebSphere sMash được làm ở tệp zero.config. Như là bạn đã học trước đây, tất cả dữ liệu được lưu trong ngữ cảnh tổng thể thứ được tạo nên từ hàng loạt các khu vực. Bạn tạo dữ liệu cấu hình bên trong khu vực cấu hình của ngữ cảnh tổng thể. Trong phần này, bạn tạo một đoạn cấu hình cho cơ sở dữ liệu. Tệp zero.config chứa cấu hình cho một ứng dụng WebSphere sMash. 1. Chọn tab File Editor. Trong phần All Files, tìm và chọn tệp zero.config. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 22 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 18. zero.config 2. Thêm văn bản (text) cấu hình vào tệp zero.config như được chỉ ra dưới đây. (Bạn có thể dán nó vào <download_root>/sMashArticleSeries/Part1/dbconfig.txt trong tệp Tải về.) Hình 19. Cấu hình cơ sở dữ liệu Bây giờ bạn cần tạo các bảng cơ sở dữ liệu và một chút dữ liệu mẫu. Một mục tiêu của WebSphere sMash là cho phép bạn tạo nhanh chóng các ứng dụng. Một trong những cách là dùng giao diện dòng lệnh zero (command line interface - CLI). Bạn có thể phát triển sMash đầy đủ bằng cách Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 23 của 58 developerWorks® ibm.com/developerWorks/vn/ dùng công cụ dòng lệnh. Bạn chạy ứng dụng của bạn, quản lý chúng, quản lý các kho Ivy và v.v.. WebSphere sMash AppBuilder có khung nhìn console cho phép bạn nhập các lệnh. Các lệnh dạng zero <task> <options>. WebSphere sMash cung cấp các tác vụ để chạy các kịch bản cơ sở dữ liệu. Bạn sẽ dùng dòng lệnh để chạy một kịch bản cơ sở dữ liệu. 1. Trong File Editor, ở phần Recent Files chọn New File -> Other. Hình 20. Tệp mới 2. Đặt tên tệp /sql/dbscript.sql, như được chỉ ra dưới đây. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 24 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 21. dbscript.sql 3. Thêm đoạn SQL, như được chỉ ra trong hình 22. (Bạn có thể dán nó từ <download_root>/ sMashArticle/Part1/dbscript.txt từ Tải về.) Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 25 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 22. Kịch bản SQL Bước tiếp theo là vào khung nhìn console của AppBuilder và chạy tác vụ zero để chạy một kịch bản cơ sở dữ liệu. 1. Chọn tab Console, sau đó chọn Command Prompt. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 26 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 23. Dòng lệnh 2. Nhập lệnh zero runsql NJDB sql/dbscript.sql. Lệnh runsql lấy tên cơ sở dữ liệu mà chúng ta đã cấu hình ở zero.config, và tên kịch bản. Hình 24. Lệnh runsql 3. Bạn nên xem các kết quả tương tự như dưới đây. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 27 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 25. Các kết quả lệnh Tạo tài nguyên RESTful Tại thời điểm này bạn đã thực sự biết cách tạo ra tài nguyên RESTful bằng cách viết một kịch bản Groovy và đặt nó vào thư mục /app/resources. Trước đó bạn cũng đã học để biết rằng WebShere sMash dựa trên sự kiện, và công việc của các lập trình viên là viết một bộ xử lý sự kiện. Có một ví dụ sử dụng thư mục public để đặt các kịch bản GrooVy nó có thể có các điều khiển sự kiện giống như onGET hoặc onPOST. Cũng cần nhớ lại khái niệm các thư mục ảo chuyên dụng điều này cho phép bạn tạo ra một vài thư mục thực thi mặc định khác. Trong phần này bạn sử dụng thư mục /app/resources , nó là thư mục chuyên dụng cho việc tạo các tài nguyên cho dịch vụ REST. Bảng 5 tổng kết các mẫu URI và giao thức HTTP, cũng như sự kiện xảy ra khi truyền tin. Mẫu URI là một tập hợp các tác nhân phát sự kiện. Những đối tượng hay được sử dụng được đánh dấu bằng in Đậm. Bảng 5. Các sự kiện sMash REST Mẫu URI Giao thức HTTP Sự kiện sMash Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Mô tả Trang 28 của 58 ibm.com/developerWorks/vn/ /resources/collection /resources/collection/{id} developerWorks® GET list Danh sách tất cả các thành viên POST create Tạo một thành viên PUT putCollection Cập nhật một tập hợp DELETE deleteCollection Xóa một tập hợp GET retrieve Lấy về thông tin một thành viên PUT update Thay thế một thành viên DELETE delete Xóa một thành viên POST postMember Đăng một Thành viên Nếu tên tập hợp nằm trong tập URI mang tính khuyến khích (http:<host>/resources/incentive), thì nó sẽ tìm kiếm các bộ điều khiển trong kịch bản gọi nó. <script-ext> (ví dụ incentive.groovy or incentive.php). Vì vậy, nếu một yêu cầu GET đến từ /resources/incentive, sau đó một danh sách các sự kiện được đưa ra và sMash sẽ tìm đến điều khiển onList() có trong incentive.groovy hay incentive.php. Nếu một yêu cầu GET đến từ cấp độ thành viên, ví dụ như /resources/incentive/3, thì nó sẽ tìm đến điều khiển onRetrieve() có trong incentive.groovy hay incentive.php. Tại cấp thành viên, sMash sẽ tự động đặt Id vào GlobalContext, cũng như bất kỳ bổ sung nào sau Id. sMash cũng hỗ trợ các tài nguyên lồng nhau, giống như là /provider/<providerId>/incentive/ <incentiveId>. Bạn có thể tạo một tệp đặc biệt incentive.bnd để xác định các mối quan hệ lồng nhau. Trong Bảng 6 đưa ra một vài ví dụ về các yêu cầu tài nguyên, điều khiển thông tin điều khiển và sự kiện mà dữ liệu được truyền vào. Bảng 6. Quản lý sự kiện và dữ liệu sự kiện Giao thức HTTP URI … dẫn ra giao thức trong app/ resources/incentive.groovy … với dữ liệu sự kiện GET /resources/incentive onList POST /resources/incentive onCreate zget(“/request/input”) // POST data GET /resources/incentive/3 onRetrieve zget("/request/params/ incentiveId")==3 DELETE /resources/incentive/3 onDelete zget("/request/params/ incentiveId")==3 PUT /resources/incentive/3 onUpdate zget("/request/params/ incentiveId")==3 Để xây dựng một dịch vụ khuyến khích đáp ứng năm sự kiện tài nguyên, đầu tiên bạn cần tạo một tài nguyên RESTful. 1. Trở lại trình soạn thảo, chọn New File -> New Resource in (/app/resources), như dưới đây. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 29 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 26. Tài nguyên mới 2. Thêm incentive.groovy vào /app/resources. Hình 27. incentive.groovy Tiếp theo, Bạn cần viết một bộ xử lý sự kiện để đáp ứng một danh sách các sự kiện. Nó sẽ được thực hiện khi mà một khách hàng yêu cầu một HTTP GET tại /incentive. Thêm vào đoạn mã trong hình 28 (dán nó từ <download_root>/sMashArticleSeries/Part1/onList.txt trong tệp Tải về ). Ở đây, bạn sử dụng zero.data APIs để truy cập một quản lý (được cài đặt trong tệp zero.config), và thực hiện các câu lệnh SQL. Kết quả của các truy vấn được trả về giống như JSON. Đây là một định nghĩa trước kết quả trả về trong sMash. Nếu bạn muốn một tùy chọn kết quả, bạn có thể lưu một mẫu (template) trong /app/views và truyền tên của kịch bản cài đặt mẫu (template). Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 30 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 28. onList Bạn có thể chạy nhanh chương trình và kiểm tra kết quả. 1. Nhấn Start, ở góc trên bên phải trong hình 29. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 31 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 29. Chạy một ứng dụng 2. Chờ ứng dụng bắt đầu. AppBuilder sẽ phát các lệnh thích hợp để chạy chương trình. Bạn sẽ nhìn thấy một biểu tượng bắt đầu ứng dụng. Hình 30. Bắt đầu một ứng dụng 3. Click chọn liên kết application để tới nút stop. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 32 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 31. Mở một ứng dụng 4. Một tab trình duyệt mới hoặc một trang mới sẽ hiển thị khi chạy ứng dụng. Trang index mặc định được hiển thị giống như hình 32. Bạn sẽ sử dụng trình bổ sung Firefox Poster để kiểm tra các dịch vụ RESTful của bạn. Chọn biểu tượng P để khởi chạy Poster. Hình 32. Trang chỉ mục mặc định Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 33 của 58 developerWorks® ibm.com/developerWorks/vn/ Firefox Poster là một thành phần mở rộng của Firefox cho phép bạn kiểm tra các dịch vụ RESTful của bạn, bao gồm thực hiện POST, PUT, và DELETE. Bạn sử dụng công cụ này để kiểm tra các tương tác RESTful. 1. Trong thanh URL, nhập vào http://localhost:8080/resources/incentive như bên dưới, và chọn GET. Hình 33. GET với Poster 2. Bạn có thể lấy về một danh sách JSON trả về của incentive (khuyến khích). Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 34 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 34. Kết quả /resources/incentive Bạn đã vừa tạo một tài nguyên RESTful cho việc lấy về một danh sách của sự tương tác. Tiếp theo, bạn sẽ tạo một điều khiển cho sự kiện lấy. Đây là một trả về một khuyến khích (incentive) đơn dựa trên mẫu URI. 1. Hình 35 hiển thị điều khiển onRetrieve . (Bạn có thể dán thông tin từ tệp <download_root>/ sMashArticleSeries/Part1/onRetrieve.txt lấy từ tệp Tải về.) Trong chuỗi truy vấn bạn có một biến GString truy cập toàn cục. ID được lưu trữ trong vùng yêu cầu (Request zone), giống như trình bày trước. (Bao gồm, zero.data API sử dụng một câu lệnh chuẩn bị (prepared statement).) Hình 35. onRetrieve 2. Quay lại công cụ Firefox Poster, bây giờ bạn có thể kiểm tra URI. Nhập vào http:// localhost:8080/resources/incentive/1 và chọn GET. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 35 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 36. Kiểm tra onRetrieve 3. Bạn sẽ nhận được kết quả xem trong Hình 37. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 36 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 37. Kết quả onRetrieve Cho đến giờ, bạn vừa nhận được kết quả trả về là một dữ liệu JSON. Trong các ứng dụng Web 2.0 bạn có thể muốn trả vệ một điểm tin Atom. Bạn cập nhật phương thức onList để trả về một nguồn Atom. Bạn có thế muốn cung cấp một nhóm các danh sách. 1. Thay thế cài đặt onList bằng đoạn mã trong Hình 38. (Bạn có thể lấy từ tệp <download_root>/ sMashArticleSeries/Part1/onListAtom.txt lấy từ tệp Tải về.) Một số điều cần lưu ý: • Đầu tiên, hãy nhìn các tham số truy vấn (query) sử dụng GlobalContext. Chú ý rằng bạn có thể truy cập danh sách các phần tử một cách trực tiếp. • Sau khi truy vấn, mã kiểm tra một tham số yêu cầu cho một định dạng phần tử. Nếu nó tồn tại, nó sẽ hiển thị nếu là atom. Nếu vậy, bạn sử dụng kịch bản Groovy để tạo ra một cấu trúc với các trường Atom bắt buộc và thực hiện hoàn trả nó. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 37 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 38. onList trả về Atom hoặc JSON 2. Chuyển sang trình duyệt Firefox, trong một Tab khác, nhập vào http://localhost:8080/ resources/incentive?format=atom như được hiển thị trong Hình 39. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 38 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 39. Kết quả trả về Atom Cho đến giờ, bạn vừa lập mã phương thức GET cho việc đọc dữ liệu. Bây giờ bạn có thể mã hóa các phương thức POST, PUT, và DELETE. 1. Thêm vào đoạn mã hiển thị trong hình 40. Bạn có thể lấy từ tệp <root>/free (<download_root>/ sMashArticleSeries/Part1/updates.txt từ tệp Tải về ). Bạn sẽ thấy một vài thông báo. • Bạn có một phương thức điều khiển việc tạo, cập nhật và xóa tương ứng với giao thức HTTP POST, PUT, và DELETE, như trong phần trình bày tiếp theo. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 39 của 58 developerWorks® ibm.com/developerWorks/vn/ • WebSphere sMash có giao thức giải mã (decode) và mã hóa (encode) JSON. Bạn có thể dễ dàng truyền biến request.input[] từ GlobalContext đến phương thức giải mã để có một biểu diễn kịch bản (Groovy Map cho một đối tượng JSON, hoặc một mảng danh sách Groovy) của đối tượng input. • Dữ liệu được truyền vào truy vấn giống như Groovy GString. • Bạn có thể thiết lập đáp ứng HTTP thích hợp. Hình 40. Các phương thức cập nhật dữ liệu (Update) 2. Quay trở lại công cụ Firefox Poster, nhập URL http://localhost:8080/resources/incentive. Trong vùng dữ liệu, nhập vào đối tượng JSON giống như trong Hình 41. (Bạn có thể lấy nội dung trong tệp (<download_root>/sMashArticleSeries/Part1/postInput.txt từ tệp Tải về ). Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 40 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 41. Kiểm tra POST 3. Bạn sẽ nhận về một đáp ứng 204 mà nó cập nhật thành công. Chú ý rằng trong phần đầu có URL với phần tử mới nhất được tải lên. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 41 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 42. Đáp ứng POST 4. Thay đổi một trong những phần tử dữ liệu ví dụ như tên. Copy URL POST(hoặc thêm ID vào chỗ kết thúc URL) quay trở lại Poster nhập và thực hiện một PUT. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 42 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 43. Yêu cầu PUT 5. Thỉnh thoảng, phụ thuộc vào các tường lửa, bạn không thể thực hiện PUT. Bằng cách thêm vào phần đầu X-Method-Override và đẩy giá trị PUT, giống như hình 44, bạn cũng có thể thực hiện một PUT thông qua POST. Đây chỉ là giải pháp nếu như PUT không thực hiện được. Bạn sẽ nhận được một trạng thái 204. Bạn có thể thực hiện GET trên cùng một URI để chắc chắn rằng việc cập nhật xảy ra. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 43 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 44. Ghi đè POST 6. Thực hiện Delete trên cùng một URI. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 44 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 45. Xóa 7. Bạn sẽ nhận một trạng thái 204, giống như trong hình 46. Nếu bạn thực hiện một GET, bạn sẽ nhận được một trạng thái 404 cho việc không tìm thấy. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 45 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 46. Kết quả xóa Bảo mật tài nguyên RESTful Khi xây dựng một ứng dụng RESTful, bạn phải thực hiện bảo mật tài khoản (account). Trong phần này bạn bảo mật giao thức POST, PUT và DELETE cho các khuyến khích để cho phép mọi người được truy cập ứng dụng cung cấp của mình. GET sẽ không được bảo mật để cho phép khách hàng có thể tìm kiếm các khuyến khích trên internet. Luật bảo mật được đưa vào trong tệp cấu hình zero. Chúng ta sẽ sử dụng tệp mặc định security.config. Tuy nhiên, bạn có thể lưu thông tin bảo mật trong một tệp cấu hình và gộp (include) chúng vào zero.config. 1. Chuyển đến bộ soạn thảo File. Ở phần Recent Files, chọn tệp zero.config. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 46 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 47. zero.config 2. Nhập vào các luật bảo mật như trong hình 48. Bạn có thể lấy thông tin từ tệp securityRules.txt (<download_root>/sMashArticleSeries/Part1/securityRules.txt từ tệp Tải về ). Một vài chú ý: • Có một nguyên tắc cấu hình mặc định rằng bạn là cần thiết, để lấy các mẫu. Chú ý rằng bạn chỉ định một điều kiện. Trong trường hợp này, Chúng ta sẽ xem xét một yêu cầu HTTP cho phép khớp /resources/incentive (và mọi thứ sau biểu thức (/*|?) và giao thức HTTP, DELETE, POST, hoặc PUT). Thông tin này nằm trong GlobalContext, và nó được gọi trong suốt pha bảo mật của vòng đời yêu cầu (request) đã được chỉ ra ở trước. • Bạn chỉ rõ một loại xác thực, nó cơ bản thôi. (WebSphere sMash hỗ trợ các loại khác giống như là Form, đăng nhập đơn (Sign-on), hay Open ID. Xem phần bảo mật của WebSphere sMash Chỉ dẫn của nhà phát triển). Tiếp theo bạn có thể chỉ định các Nhóm, các Người dùng hoặc các vai trò (Role) cho phép truy cập URI này. Một nhóm đặc biệt được xác định truy cập cho bất kỳ người sử dụng nào được xác thực. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 47 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 48. Các luật bảo mật 3. WebSphere sMash cung cấp một đăng ký (registry) dựa trên tệp mặc địch mà nó là lý tưởng để phát triển. Sau đó khi mà thực hiện phát triển ứng dụng bạn cần chuyển sang một đăng ký dựa trên LDAP dựa trên tùy chọn. Bạn có thể tạo nhiều người sử dụng trong các tệp mặc định bằng cách sử dụng zero CLI. Chuyển sang màn hình console và từ dấu nhắc lệnh. Nhập vào lệnh: zero user create admin password giống như Hình 49. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 48 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 49. Tạo Người sử dụng 4. Kết quả sẽ hiển thị như trong hình 50. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 49 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 50. Kết quả thực hiện lệnh Zero Kể từ khi bạn thay đổi cấu hình, bạn phải tiến hành khởi động lại ứng dụng để kiểm tra. 1. Nhấn vào Stop trong góc trên bên phải như trong hình 51. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 50 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 51. Dừng một ứng dụng 2. Nhấn Run để thực hiện chạy lại ứng dụng. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 51 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 52. Chạy một ứng dụng 3. Quay trở lại công cụ POSTER và thực hiện GET tới http://localhost:8080/resources/ incentive, như trong hình 53. Một yêu cầu GET là không được bảo mật, và bạn sẽ nhận một danh sách giống như bạn đã làm trước đó. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 52 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 53. Không bảo mật GET 4. Thực hiện yêu cầu POST với cùng Input trước đó. Bạn có thể lấy lại thông tin từ tệp postInput.txt (<download_root>/sMashArticleSeries/Part1/securityRules.txt từ tệp Tải về ). Hình 54. Yêu cầu POST 5. Bạn sẽ nhận được một nhắc nhở cần nhập tên người dùng và mật khẩu. Nhập admin/password. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 53 của 58 developerWorks® ibm.com/developerWorks/vn/ Hình 55. Nhắc nhở bảo mật 6. Bạn sẽ nhận được trạng thái 204 với một tài nguyên mới được tạo. Tương tự bạn có thể kiểm tra với PUT và DELETE. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 54 của 58 ibm.com/developerWorks/vn/ developerWorks® Hình 56. Kết quả POST Kết luận Bài này cập nhật một bài báo trước về Project Zero, bạn sử dụng mã sản phẩm từ WebSphere sMash. Bạn đã được giới thiệu tới sản phẩm và học về WebSphere sMash có cấu trúc hướng sự kiện. Global context là một phương tiện để bảo dưỡng tất cả các trạng thái cho một ứng dụng. WebSphere sMash là ứng dụng trung tâm, với rất nhiều các thư mục ảo giúp bạn sử dụng với việc giảm thiểu các cấu hình trong một ứng dụng. Bạn đã sử dụng WebSphere sMash để xây dựng một ứng dụng dựa trên REST. Bạn đã sử dụng ứng dụng mới AppBuilder, một môi trường tích hợp phát triển trên nền Web để xây dựng các ứng dụng sMash. Cuối cùng, bạn đã học được cách làm thế nào để bảo mật tài nguyên RESTful sử dụng các luật bảo mật sMash. Trong bài báo tiếp theo bạn sẽ tiếp tục tìm hiểu sâu hơn về REST bằng cách xây dựng một ứng dụng tiêu dùng. Bạn sẽ sử dụng các mẫu (pattern) khác cho việc xây dựng một dịch vụ REST được gọi là mô hình tài nguyên không (zero resource model - ZRM). Bạn cũng sẽ thực hiện xây các trình khách Internet giàu có cho các tài nguyên RESTful sử dụng Dojo Toolkit. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 55 của 58 developerWorks® ibm.com/developerWorks/vn/ Các tải về Mô tả Ví dụ của bài này Tên Kích thước sMashArticlePart1.zip 10KB Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 56 của 58 ibm.com/developerWorks/vn/ developerWorks® Tài nguyên Học tập • Học thêm về môi trường WebSphere sMash để việc tạo, lắp ghép và thực hiện một ứng dụng dựa trên các công nghệ Web phổ biến. • WebSphere sMash Sổ tay cho người lập trình giải thích các khái niệm cốt lõi là xác định cấu trúc của một ứng dụng WebSphere sMash. • Sử dụng WebSphere sMash Diễn đàn (Forum) để nhờ trợ giúp, liên hệ, thông báo, thảo luận về các vấn đề phát triển... • "Why do non-functional requirements matter? (Tại sao các yêu cầu phi chức năng lại quan trọng?)" (developerWorks, tháng 1, 2006) thảo luận về lý do tại sao giải pháp của bạn có thể rất tốt và thiết thực trừ phi bạn không xem xét các yêu cầu phi chức năng. • Học thêm về Groovy, một ngôn ngữ động cho nền tảng Java. • Đọc làm cách nào cài đặt và cấu hình PHP cho phát triển các ứng dụng WebSphere sMash và các mở rộng PHP cho Project Zero. • Xem thêm developerWorks các bài báo và hướng dẫn về WebSphere sMash. • Học về Dojo, công cụ JavaScript toolkit, và Dojo widgets. • Đọc về Representational State Transfer (REST) viết bởi Roy Thomas Fielding's, "Architectural Styles and the Design of Network-based Software Architectures." • Lấy các thông tin về JSON và hỗ trợ JSON trong WebSphere sMash. • Lấy thêm các thông tin về trình duyệt Web Firefox bởi Mozilla và Poster plug-in. • Đọc về Apache Derby, và liên hệ database mã nguồn mở trong triển khai và cài đặt bằng Java. • Tìm kiếm thông tin lưu giữ tạm (caching) với một bài học caching cho tác giả Web và các quản trị web. • Học về Phát triển mang tính thương mại hướng cộng đồng (CD/CD). • Đọc "Resource-oriented vs. activity-oriented Web services (Định hướng tài nguyên so với định hướng hoạt động trong các dịch vụ web)" (developerWorks, tháng 10, 2004) để tìm hiểu thêm về các mối quan hệ của REST-SOAP-Style và dịch vụ web. • Xem thêm developerWorks bài viết và bài học về REST. • Xem Nguồn cung cấp dữ liệu RSS. (Tìm hiểu thêm về RSS.) • Xem developerWorks Architecture và lấy các tài nguyên bạn cần cho việc cải tiến kỹ năng trong cấu trúc IT. • Xem kho sách công nghệ cho các sách này và các chủ đề kỹ thuật khác. Lấy sản phẩm và công nghệ • Tải về WebSphere sMash. • Tải về Các phiên bản thử nghiệm sản phẩm IBM và lấy về các công cụ phát triển phần mềm và các sản phẩm phần mềm trung gian cho DB2®, Lotus®, Rational®, Tivoli®, và WebSphere®. Thảo luận • Tham gia vào các diễn đàn thảo luận về dự án Zero. • Các blog developerWorks và tham gia cộng đồng developerWorks. Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 57 của 58 developerWorks® ibm.com/developerWorks/vn/ Đôi nét về các tác giả Roland Barcia Roland Barcia là một nhân viên kỹ thuật cao cấp và là người đi đầu trong dịch vụ Web 2.0 cho các dịch vụ phần mềm của IBM đối với WebSphere. Ông cũng là đồng tác giả của cuốn sách IBM WebSphere: Deployment and Advanced Configuration và Persistence in the Enterprise Steve Ims Steve Ims là một nhân viên kỹ thuật cao cấp và là người dẫn đầu về Công cụ phát triển ứng dụng (App Builder) cho WebSphere sMash. Bạn sẽ tìm thấy Steve trong các diễn đàn về Project Zero © Copyright IBM Corporation 2009 (www.ibm.com/legal/copytrade.shtml) Nhẫn hiệu đăng ký (www.ibm.com/developerworks/vn/ibm/trademarks/) Giới thiệu IBM WebSphere sMash, Phần 1: Xây dựng các dịch vụ RESTful cho ứng dụng Web của bạn Trang 58 của 58