PDF:

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