Thứ Ba, 4 tháng 12, 2012

Java : Tạo dịch vụ Web dạng REST (JAX-RS)

Trong bài này ta sẽ tạo dịch vụ Web dạng REST (Representational State Transfer). Trước tiên ta sẽ tải về thư viện jersey tại http://jersey.java.net/.

Ta tạo thư mục dự án (project) như sau :

Trong thư mục dự án, ta tạo thư mục webapp. Trong đó, tạo thư mục WEB-INF chứa một thư mục con lib và tập tin web.xml. Thư mục WEB-INF được quy ước khi ta tạo ứng dụng Web với Java, trong đó thư mục lib quy ước chứa các thư viện dùng trong ứng dụng Web và tập tin web.xml dùng để cấu hình ứng dụng này.

Ta giải nén thư viện Jersey vừa tải về và chép toàn bộ các tập tin jar trong đó vào thư mục lib trong WEB-INF.



Để Eclipse xem đây như một dự án Web, ta nhấn chuột phải trên thư mục dự án, chọn Properties>Project Facets. Rồi nhấn chọn mục Dynamic Web Module, nhấn Apply rồi nhấn OK.

 Ta dùng JAXB để phát sinh lớp MobilePhones từ tập tin "mobile phone.xsd". Xem chi tiết tại đây.
Lớp MobilePhoneService định nghĩa ứng dụng Web getListMobile như sau :
package com.openspace;

import java.io.File;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import com.openspace.entity.MobilePhones;

@Path("/services")
public class MobilePhoneService {

 @GET
 @Path("/getListMobile")
 @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
 public MobilePhones getListMobile() {
  MobilePhones result = new MobilePhones();
  JAXBContext jc;
  try {
   jc = JAXBContext.newInstance(MobilePhones.class);
   Unmarshaller um = jc.createUnmarshaller();
   String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
   path = path.substring(0, path.indexOf("/WEB-INF"));
   File f = new File(path + "/WEB-INF/classes/mobile phone.xml");
   
   result = (MobilePhones) um.unmarshal(f);
  } catch (JAXBException e) {
   e.printStackTrace();
  }
  return result;
 }
}

Giải thích:
- Dẫn giải (annotation) @Path định nghĩa đường dẫn dùng khi muốn gọi đến ứng dụng Web.
- Dẫn giải @GET định nghĩa phương thức GET của HTTP được dùng để gọi đến ứng dụng Web này.
- Dẫn giải @Produces định nghĩa dạng thức (format) của dữ liệu trả về. Ở đây ứng dụng Web sẽ trả về nội dung dưới dạng JSON hoặc XML tùy theo thuộc tính Content-Type dùng trong header khi gọi phương thức GET.
- Phương thức getListMobile() sẽ trả về danh sách mobile phone lấy từ nội dung tập tin "mobile phone.xml"
- Chú ý thêm thư mục resources vào đường dẫn Build Path của thư mục dự án. Nhờ đó, khi nó được triển khai (deploy) trên Tomcat để kiểm thử trong Eclipse, các tập tin trong thư mục resources sẽ được chép vào thư mục WEB-INF/classes trong thư mục triển khai của Tomcat.

Tập tin cấu hình ứng dụng Web web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

 <servlet>
  <servlet-name>JAX-RS Application</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
   <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>com.openspace</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>JAX-RS Application</servlet-name>
  <url-pattern>/*</url-pattern>
 </servlet-mapping>

</web-app>

Để chạy ứng dụng này, ta nhấn chuột phải trên thư mục dự án chọn Run As >Run on Server. Trong trường hợp tôi, tôi chọn Tomcat v7.0 Server. Nếu trên máy chưa có Tomcat, ta có thể tải về với Eclipse trong bước tiếp theo, sau đó thêm thư mục này vào Tomcat.

Sau khi Tomcat khởi động tốt đẹp, ta kiểm tra hoạt động của dịch vụ Web bằng cách gõ đường dẫn sau trong một trình duyệt mạng, firefox chẳng hạn, http://localhost:8080/WebServiceRS/services/getListMobile
Ta có kết quả sau :
Để kiểm thử kết quả trả về dưới dạng JSON, trong trình duyệt firefox, ta cài thêm Add-on Poster tại địa chỉ sau https://addons.mozilla.org/en-us/firefox/addon/poster/

Sau đó trong mục Headers, ta thêm header "Accept" với giá trị "application/json" như hình bên dưới.

Trong khung nhập URL ta gõ địa chỉ sau : http://localhost:8080/WebServiceRS/services/getListMobile
Sau khi nhấn nút GET ta có kết quả :

Không có nhận xét nào:

Đăng nhận xét