Jakarta EE RESTful Web Services định nghĩa đặc tả cần phải có của một RESTful Web Services trong Java là như thế nào? Giúp chúng ta có thể hiện thực các ứng dụng RESTful Web Services với Java. Trong bài viết này, mình sẽ giới thiệu những vấn đề cơ bản của Jakarta EE RESTful Web Services mà các bạn cần phải biết, các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Jakarta EE Maven project để làm ví dụ:
Có 2 implementation cho Jakarta EE RESTful Web Services là Eclipse Jersey và JBoss RESTEasy. Mình sẽ sử dụng Jersey là implementation chính cho những bài viết của Hướng Dẫn Java về Jakarta EE RESTful Web Services các bạn nhé!
Mình sẽ khai báo Jersey dependencies như sau:
1 2 3 4 5 6 7 8 9 10 |
<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> <version>3.0.3</version> </dependency> |
Các bạn có thể remove dependency jakarta.jakartaee-api trong Maven project mà các bạn đã tạo theo hướng dẫn của mình, bởi vì cho mỗi module của Jakarta EE, sẽ có một dependency tương ứng. Ví dụ như cho Jakarta EE RESTful Web Services, tên dependency là jakarta.jaxrs-api. Và dependency này khi chúng ta khai báo Jersey đã được tự động include cùng rồi:
Bây giờ, mình sẽ tạo một ứng dụng RESTful Web Services có chứa một GET request và khi user request tới GET request này, nó sẽ trả về một dòng text đơn giản “Hello World!” các bạn nhé!
Để làm được nhiều điều này, đầu tiên, mình sẽ tạo mới một class expose request “/hello” và return dòng chữ “Hello World” khi người dùng request tới. Nội dung của class này như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.jaxrs; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @Path("/") public class HelloResource { @GET @Path("hello") public String hello() { return "Hello World!"; } } |
Nếu các bạn đã làm về Spring framework để expose các RESTful API, thì có thể hình dung là annotation @Path trong ví dụ trên của mình tương ứng với annotation @RequestMapping của Spring.
Annotation @Path đươc dùng để khai báo một request URL. Annotation này chỉ có một attribute duy nhất là value() để chúng ta định nghĩa request URL. Nếu các bạn khai báo nó ở class level như ví dụ của mình thì giá trị của attribute value() trong annotation này sẽ là prefix cho tất cả các request mà chúng ta định nghĩa ở method level. Do đó, request URL trong ví dụ của mình sẽ là “/hello” như chúng ta mong muốn.
Annotation @GET để định nghĩa HTTP GET method cho request “/hello”. Jakarta EE RESTful Web Services hỗ trợ chúng ta tất cả các HTTP method, tuỳ mục đích mà các bạn có thể sử dụng nhé.
Bước tiếp theo, chúng ta cần phải khai báo Jersey Servlet Container với Server Runtime để Jersey Servlet được Server Runtime sử dụng để handle tất cả request từ người dùng.
Mình sẽ sử dụng tập tin web.xml để làm điều này như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="UTF-8"?> <web-app version="5.0" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.huongdanjava.jaxrs</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> |
Khi khai báo HttpServlet ServletContainer của Jersey, chúng ta cần chỉ định rõ packages mà chúng ta đang expose các RESTful API trong ứng dụng của mình.
Cơ bản là xong rồi đó các bạn!
Bây giờ, nếu các bạn chạy ứng dụng với Maven Jetty Plugin đã định nghĩa sẵn trong project rồi request tới URL http://localhost:8080/hello, các bạn sẽ thấy kết quả như sau: