Giới thiệu về RESTful Web Services – công nghệ tạo web services đơn giản so với các dạng web services trước kia
Mục đích: Chủ đề của bài này giới thiệu về RESTful Web Services – một phương pháp mới để tạo web services sử dụng cách thức đơn giản để trao đổi dữ liệu độc lập platform với hiệu suất khá cao. Qua nội dung tổng quát của lý thuyết, chúng tôi sẽ thực hiện web services với chức năng đơn giản sử dụng RESTful web services
Yêu cầu về kiến thức cơ bản cho các khái niệm về RESTFul Web Services
- Nắm vững các khái niệm về MVC, khái niệm liên quan đến Service Oriented Architecture (SOA), kiến trúc của Web Services
- Nắm vững các khái niệm về Web Services với các công nghệ và framework như
- AXIS 2 (Loạt bài về xây dựng web services với axis2)
- JAX-WS (Xây dựng Web Service sử dụng Web Server Tomcat và sử dụng service áp dụng MVC Pattern trên Web)
- JAX-RPC
- Nắm vững khái niệm về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
- Nắm vững khái niệm về lập trình web sử dụng J2EE hay JavaEE với các kiến thức về Servlet, JSP
- Nắm vững khái niệm về cơ chế Filter và RequestDispatcher trong Servlet
- Nắm vững toàn bộ cách thức vận dụng và xây dựng ứng dụng hoàn chỉnh ứng dụng áp dụng web services với các công nghệ nêu trên
Tổng quan về Web Service truyền thống
- Cơ chế thực hiện và hoạt động của Web Services truyền thống khá phức tạp
- JAX-RPC: người lập trình phải định nghĩa các interface sử dụng ngôn ngữ lập trình hay WSDL. Sau đó thực hiện cài đặt các phương thức đã được định nghĩa trong interface. Thực hiện cấu hình theo đúng chuẩn của SOA và deploy đến server có hỗ trợ web services
- JAX-WS: người lập trình cài đặt trực tiếp các phương thức sau đó sử dụng các annotation để định ra các phương thức sẽ làm web services và dưới sử hỗ trợ của compiler và các server có hỗ trợ web services để thực hiện deploy ứng dụng
- Cơ chế thực hiện của web services đòi hỏi
- Người dùng sử dụng ngôn ngữ lập trình để gọi services thông qua interface, cụ thể là WSDL, sau đó compiler thực hiện chuyển đổi và parsing lời gọi thông qua WSDL để chuyển đổi thành SOAP dưới sự hộ trợ của các API chuyển đổi tương ứng
- SOAP được bao bọc bởi HTTP protocol để chuyển đi kết hợp với TCP/IP
- Server nhận được HTTP thông qua port 80 sẽ trích xuất và nhận dạng SOAP thông qua HTTP
- Thực hiện validation nội dung của SOAP, dựa trên WSDL, lần nữa thực hiện convert SOAP trở thành object cụ thể ở Server và định vị phương thức thựcthi
- Kết quả sau khi xử lý phải thực hiện chuyển đổi thành SOAP response hay fault dựa trên WSDL vì tất cả đang sử dụng theo API của ngôn ngữ lập trình tại Server
- Và bao bọc bởi HTTP truyền đi về client và client phải thực hiện một quá trình như server để lấy thông tin và chuyển về kết xuất của platform ở ngôn ngữ đích
- Cơ chế trên khá phức tạp đối với kết quả xử lý là dạng dữ liệu bình thường như chỉ là chuỗi đúng sai, một số nguyên gửi về sau tính toán
- Bên cạnh đó, HTTP Request và Response là object có khả năng đính kèm dữ liệu, do vậy quá trình convert SOAP là không cần thiết
- Hơn thề nữa, với định dạng đơn giản người sử dụng có thể xử lý uyển chuyển hơn so với định dạng SOAP cố định
Khái niệm về RESTful Web Services
- Chính khái niệm phức tạp về Web Services truyền thống, REST được đưa ra để áp dụng cách xây dựng và cơ thế thực hiện web service đơn giản hơn
- REST viết tắt của chữ Representational State Transfer – theo nghĩa cho phép người dùng truy cập tài nguyên – resource (có thể là dữ liệu trước và sau xử lý hay chức năng của ứng dụng) – của ứng dụng trên web services thông qua uri
- Thực hiện cơ chế nói chuyện giữa server và client là điểm điểm – point to point
- Dữ liệu được truyền trực tiếp trên HTTP và được truy cập thông qua HTTP theo đúng định dạng MIME mà không cần thông qua dạng SOAP – giảm bớt sự phức tạp – vì đơn giản chúng ta sẽ coi dữ liệu và chức năng như là tham số truyền hay dữ liệu đính kèm trong HTTP
- Cho phép thao tác dữ liệu dưới 4/7 phương thức được định nghĩa trong HTTP đó là GET, POST, PUT, DELETE để qui định rõ cách thao tác dữ liệu trên server, cái nào được truy cập, các nào được sửa đổi, cái nào được hiển thị và dấu ẩn …
- Các yêu cầu khi sử dụng REST đó là
- Client-Server: Client và Server phải nói chuyện sử dụng cùng interface và protocol
- Sử dụng dạng kiến trúc layers và không lưu trữ trạng thái sau khi xử lý được response
- Cache: response được lưu trữ tại client
- Code on Demand: client lấy được dữ liệu trong response sau khi xử lý của server hoàn tất
- Uniform Interface: mỗi resource được client truy cập thông qua địa chỉ duy nhất và sử dụng 4 HTTP methods được qui định
- RESTful Web Services sử dụng HTTP để truyền hay nhận dữ liệu trực tiếp thông qua URI
- Cơ chế hoạt động
- Client gửi request yêu cầu resources thông qua HTTP
- Web services dựa trên request để đáp ứng yêu cầu và response kết quả trả về
- Response được trả về theo đúng định dạng yêu cầu của client
- Client xử lý kết quả từ response để đáp ứng yêu cầu của mình
- Một số thành phần của RESTful Web Services
- Resources: có thể là chuỗi, hình ảnh, xml, tập tin …
- JAX-RS
- Cung cấp chức năng và API cho việc xây dựng ứng dụng với RESTful Web Services
- JAX-RS API
- Một API của JavaEE
- Sử dụng tạo web service với các hàm API với annotations
- Định nghĩa Java class như là một Resource class
- Định nghĩa 02 loại resources: root resource và sub resource thông qua @Path. Trong đó sub resource được truy cập thông qua root
- Root resource thông thường là được khai báo ở đầu class
- Sub resource được khai báo trên các method, nghĩa là các method được truy cập thông qua root theo đường dẫn trên server
- Cú pháp của @Path
@Path(“resourcePath/{param1}/…/{paramN}”)
-
-
- Package chứa các thành phần là javax.ws.rs
- Các method của HTTP được hỗ trợ thông qua các khai báo annotations
-
Annotation
|
Mô tả
|
@GET
|
Dùng cho HTTP GET method
|
@POST
|
Dùng cho HTTP POST method
|
@PUT
|
Dùng cho HTTP PUT method
|
@Delete
|
Dùng cho HTTP DELETE method
|
-
-
- Để trích xuất dữ liệu từ HTTP request và đưa vào services – resources xử lý
- @PathParam annotation
- Lấy giá trị từ URI trên đường dẫn sau /
- @QueryParam annotation
- Lấy query parameter từ request tương tự như getParameter của request
- Lấy giá trị từ URI sau dấu ? và các dấu &
- @FormParam annotation
- Lấy query parameter từ request nhưng được truyền từ form parameters
- @PathParam annotation
- Để xác định loại dữ liệu được xử lý trên server hay lấy về từ server
- @Produces annotation
- Xác định định dạng dữ liệu khi phương thức xử lý và trả về
- Định dạng qui định là dạng có trong MIME như text/plain, text/xml, application/xml, hay text/json
- Áp dụng cho các phương thức @GET, @POST, và @PUT
- @Consumes annotation
- Xác định loại dữ liệu được gửi từ client đến server cho xử lý trên server
- Các định dạng hỗ trợ text/plain, text/xml, hay application/x-www-form-urlencoded (hỗ trợ dạng phương thức POST)
- Áp dụng cho đầy đủ 4 phương thức của RESTful
- @Produces annotation
- Để trích xuất dữ liệu từ HTTP request và đưa vào services – resources xử lý
-
- Các bước để phát triển web services sử dụng RESTful
- Bước 1: Tạo Web Application
- Chọn Web Server là Tomcat
- Chọn Java EE version là JavaEE5
- Bước 2: Đưa Restful Web Services vào trong Web Application
- Bổ sung các thư viện hỗ trợ như JAX-RS 1.1 và Jersey
- Bước 3: Định nghĩa và cài đặt các phương thức cho Web Services
- Bước 4: Sử dụng annotation để định dạng cho các services được định nghĩa trong bước 3
- @Path host web service – root resource và sub resource
- Loại HTTP methods dùng để truy vập
- Lấy dữ liệu về hay cập nhật dữ liệu trên server @Produces hay @Consumes
- Bước 5: Build Web Services, deploy
- Bước 6: Testing Web Services, phát sinh WSDL để sử dụng ở client
- Bước 1: Tạo Web Application
- Các bước để phát triển ứng dụng consumes web service sử dụng RESTful
- Bước 1: Tạo Web Application hay Desktop Application
- Bước 2: Đưa các thư viện hỗ trợ consume Web services sử dụng RESTful
- Bổ sung các thư viện hỗ trợ như JAX-RS 1.1 và Jersey
- Bước 3: Tạo giao diện và viết code trực tiếp truy cập Web Services
- Xác định url host web services
- Tạo Client object để lấy vị trị resource
- Tạo request để truyền yêu cầu đến server
- Lấy resource trở về để trình bày ra kết quả
- Bước 4: Build, deploy (nếu là ứng dụng web) và testing ứng dụng
Vận dụng các kiến thức nâng cao về Web services và các khái niệm của RESTful để xây dựng ứng dụng đơn giản nhất, đó là tính toán với 02 phép toán cộng trừ. Sau đó, dùng ứng dụng web để consume 02 services này
- Yêu cầu
- Nắm vững các khái niệm về MVC, khái niệm liên quan đến Service Oriented Architecture (SOA), kiến trúc của Web Services, RESTful
- Nắm vững về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
- Cách thức sử dụng JSP, Servlet
- Tools sử dụng ở đây là Netbeans 6.9.1
- JDK 6 update 22
- Server: Tomcat 6.0.26
- Thư viện hỗ trợ: JAX-RS, Jersey
- Các bước thực hiện
- Tạo Web Application tương tự như kết hợp JavaFX với JSP và JDBC
- Tên project: RestFulCalculatorServices
- Server: Apache Tomcat 6.0.26
- JavaEE version: JavaEE 5
- Tạo Web Service với Restful cho Project
- Click Menu File, New File, chọn Web Services trong Categories, và chọn RESTful Web Services from Patterns trong File types
- Click Next
- Tạo Web Application tương tự như kết hợp JavaFX với JSP và JDBC
-
-
- Chọn Simple Root Resource để dùng API thiết kế Web Services
- Click Next
-
-
-
- Nhập vào package để phát sinh
- Chỉnh sửa lại Path của root resource nếu cần
- Xác định loại dữ liệu trả về trong MIME type, ở đây chúng ta thực hiện phép toán và trả ra kết quả, kiểu chuẩn trong MIME là String, do vậy chúng ta chọn text/plain và Representation là kiểu String
- Click nút Finish
-
-
-
- Màn hình REST Resources Configuration xuất hiện để cho phép chúng ta chọn lựa cách đưa RESTful vào ứng dụng
- Chúng ta chọn cấu hình trực tiếp vào trong web.xml tương tự như cách add các framework như struts hay jsf vào ứng dụng
- Và chỉnh sửa resources gốc nếu muốn trong phần REST resources path – đây có thể nói là root resources của class resources
- Click OK
- Màn hình REST Resources Configuration xuất hiện để cho phép chúng ta chọn lựa cách đưa RESTful vào ứng dụng
-
-
-
- Code được phát sinh như sau
-
-
-
- Lưu ý
- Chúng ta thấy đường dẫn truy cập đến CalculatorResource là generic thông qua khai báo @Path. Và đây là sub resource so với resource trong bước cấu hình trên
- Có 02 phương thức mặc định cho phép get dữ liệu và đưa dữ liệu lên trên server
- Bên cạnh đó, web.xml được bổ sung cấu hình với servlet mapping reference đến RESTFul
- Lưu ý
-
-
-
- Chúng ta thực hiện thay đổi phương thức để phù hợp yêu cầu tính toán
- Sửa 02 phương thức mặc định là add và subtract với 02 tham số truyền
- Ở phương thức add chúng ta thiết lập giá trị mặc định thông qua @DefaultValue – khi không có áp dụng trị default
- Cũng ở phương thức add chúng ta lấy dữ liệu truyền thông qua parameter trong HTTP Request
- Hàm add sẽ lấy kết quả trả về cho người dùng nên chúng ta chọn Produces với dạng text/Plain
- Tương tự cho subtract, ngoại trừ không có Default values thì giá trị tự động ép theo kiểu khai báo biến đó là kiểu double – nghĩa là khi không truyền, giá trị sẽ là 0.0
- Chúng ta cũng để @Path cho từng phương thức services add và subtract để định nghĩa sub resource dưới root resources là generic trên từng phương thức để phân biệt các services khác nhau tại thời điểm truy cập
- Chúng ta thực hiện thay đổi phương thức để phù hợp yêu cầu tính toán
-
-
-
- Lưu ý: không được sử dụng kiểu dữ liệu không được hỗ trợ trong MIME, điều này dẫn đến phát sinh lỗi ở client khi sử dụng – không phải ở server tại thời điểm deploy
- Chúng ta có cấu trúc của project trong netbeans như sau
-
-
-
- Các thư viện hỗ trợ của project
-
-
- Chúng ta thực hiện clean and Build project
- Start Server Tomcat (nếu chưa start)
- Deploy ứng dụng trên server
-
- Chúng ta thực hiện test web services như sau
- Nhấn phải chuột trên phương thức cần test trong CalculatorResource/HTTPMethods/add hay subtract
- Chọn Test Resource URI
- Chúng ta thực hiện test web services như sau
-
-
- Màn hình browser hiện thị mặc định không truyền tham số như sau
-
-
-
- Lưu ý: chúng ta thấy đang truy cập theo thứ tự contextPath/rootResouce/ClassResouces/MethodResouces
- Giá trị tham số không truyền và lấy mặc định
- Chúng ta thêm tham số trực tiếp trên url với ? và & với tên tham số định nghĩa trong @QueryParam
-
-
-
-
- Tương tự cho phép toán trừ
-
-
-
-
- Lưu ý: có một số trường hợp việc test xuất hiện lỗi như sau
-
-
-
- Vấn đề này xảy ra là do hệ thống thiếu đường dẫn đến method services, chúng ta chỉ cần đơn giản bổ sung bằng cách gõ tiếp được dẫn như các cách testing ở trên
- Ngoài ra, nếu lỗi là 404 hay test không được nghĩa là phương thức chúng ta phát sinh lỗi và không thể deploy thành web services. Chúng ta đơn giản kiểm tra lại phương thức, chỉnh sửa lỗi và deploy lại
- Chúng ta đã thực hiện thành công một web services đơn giản nhưng chưa sử dụng được nó. Chúng ta thấy kết quả trả về của REST rất đơn giản chỉ là text và không có thông tin như SOAP làm nặng nề hệ thống xử lý như WS truyền thống
-
- Chúng ta thực hiện việc tạo ứng dụng và sử dụng web services đã làm ở trên để sử dụng
- Tạo ứng dụng web tương tự như các bước ở trên
- Tên project: RestfulCalculatorWeb
- Server: Apache Tomcat 6.0.26
- J2EE version: JavaEE5
- Click phải chuột trên Library, chọn Add Library, chọn JAX-RS 1.1 và Jersey add vào Project. Chúng ta có cấu trúc project như sau
- Tạo ứng dụng web tương tự như các bước ở trên
-
- Chúng ta chỉnh sửa trang index.jsp cho việc nhập liệu như sau
-
- Chúng ta tạo Servlet với tên Controller và thực hiện kết nối như sau
- Xác định url đến thành phần class resources
- Tạo Client object
- Thiết lập truyền yêu cầu trực tiếp đến để truy cập resources thông qua phương thức setFollowRedirecteds
- Xác định resources truy cập thông qua url để lấy về object WebResource
- Xác định tập tham số truyền truy cập resource, vì chúng ta truyền 02 tham số do vậy chúng ta tạo ra map để chứa cập tham số truyền với MultivalueMap
- Trong trường hợp chỉ có 1 tham số chúng ta không cần thực hiện như thế vì phương thức queryParam bên dưới cho phép 02 định dạng
- Đón nhận MultiValueMap
- Đón nhận 02 trị String, String
- Trong trường hợp chỉ có 1 tham số chúng ta không cần thực hiện như thế vì phương thức queryParam bên dưới cho phép 02 định dạng
- Chúng ta thông qua object resources, xác định path sub resource với phương thức path
- Kết hợp tham số truyền khi truy cập sub resources đó dùng queryParams
- Và dùng phương thức get để lấy dữ liệu trả về và ép về kiểu chuẩn client định nghĩa và hỗ trợ bởi MIME, cụ thể ở đây là String
- In kết quả ra màn hình
- Chúng ta tạo Servlet với tên Controller và thực hiện kết nối như sau
-
-
- Tương tự cho phương thức subtract
- Clean and Build, Deploy ứng dụng
-
-
- Test
-
-
- Nhấn nút Add
-
-
-
- Nhấn nút subtract
-
-
- Chúng ta thực hiện consumes được web services với RestFul
- Qua cách consumes này chúng ta nhận thấy client không cần dùng WSDL, phát sinh các thành phần bên client phức tạp và tốn thời gian
- Client chỉ cần xác định services được host tại đâu có bao nhiêu tham số truyền và yêu cầu truy cập resources mà không cần biết định dạng interfaces cụ thể
- Các đường dẫn host thay đổi chỉ cần thay đổi uri dẫn đến ứng dụng uyển chuyển
- Bên cạnh đó, kiểu dữ liệu đơn giản giúp xử lý nhanh chóng và dễ dàng hơn
Chúc mừng các bạn đã hoàn tất và nắm các khái niệm về sử dụng RESTful Web Services để tạo Web Services và tạo ứng dụng sử dụng Web Services đó. Qua đó chúng ta so sánh được giữa cách tạo Web Services truyền thống và RESTful
Chúng tôi hy vọng nội dung của bài này giúp ích các bạn trong việc cài đặt web services với nhiều cách khác nhau và chọn lực sự uyển chuyển trong sử dụng.
Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở các chủ đề RESTful tiếp theo khi xử lý kiểu dữ liệu là object và trả về cho client dạng XML để xử lý như các web services khác – để thấy việc đơn giản khi dùng SOAP xử lý object như thế nào.