一個包含Jersey庫的簡單Web Service以及一個發送Json資料的Java用戶端
一個包含Jersey庫的簡單Web Service以及一個發送Json資料的Java用戶端 Preface 環境工具 建立Dynamic Web Project 建立你的RestService類 建立java project做為json client Other Resource
Preface 想寫這篇tutorial的理由很簡單,之前學web service的時候發現很多資料上的執行個體基本上都是湊起來的,也就是說看上去功能結構很完整,複製粘貼的也很爽,但是一些細節上的配置之類的可能會有錯誤,當時因此耽誤了很長時間 本sample基本是crunchify的翻譯版,不過裡面對於web.xml的配置有些不同,crunchify的那個貌似是錯的(至少我當時沒能用他的跑通) 本文原創,允許轉載但務必貼出本文連結 環境&工具 Jersey JAX-RS 2.0 RI bundle 解壓後將所有.jar檔案放在WebContent>WEB-INF>lib下面 json.jar java version “1.8.0_40” tomcat 8.0 eclipse Luna 建立Dynamic Web Project name = “simpleRestWebService” 建立web.xml,內容如下:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>simpleRestWebService</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>simpleRestWebService</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping></web-app>
本sample web.xml的作用主要是將WEBROOT/api/下的所有請求,映射到simpleRestWebService.RestService類中 建立你的RestService類
內容如下:
package simpleRestWebService;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import javax.ws.rs.GET;import javax.ws.rs.Produces;import javax.ws.rs.Consumes;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;@Path("/restService")public class RestService { @POST @Consumes(MediaType.APPLICATION_JSON) public Response json_restResponse(InputStream incomingData) { StringBuilder jsonRest = new StringBuilder(); try { BufferedReader in = new BufferedReader(new InputStreamReader(incomingData)); String line = null; while ((line = in.readLine()) != null) { jsonRest.append(line); } } catch (Exception e) { System.out.println("Error Parsing: - "); } System.out.println("Data Received: " + jsonRest.toString()); // return HTTP response 200 in case of success return Response.status(200).entity(jsonRest.toString()).build(); } @GET @Produces(MediaType.TEXT_PLAIN) public String sayPlainTextHello() { return "Hello simpleRestWebService"; } // This method is called if XML is request @GET @Produces(MediaType.TEXT_XML) public String sayXMLHello() { return "<?xml version=\"1.0\"?>" + "<hello> Hello simpleRestWebService" + "</hello>"; } // This method is called if HTML is request @GET @Produces(MediaType.TEXT_HTML) public String sayHtmlHello() { return "<html> " + "<title>" + "Hello simpleRestWebService" + "</title>" + "<body><h1>" + "Hello simpleRestWebService" + "</body></h1>" + "</html> "; }}
這裡麵包含了兩種HTTP請求,GET和POST,其中我用GET做直觀的測試,做完之後可以戳http://localhost:8080/simpleRestWebService/api/restService查看結果。另外一個是POST,我們之後用這個來接受含有json檔案的請求。 建立java project做為json client 首先寫一個小的json檔案作為輸入,如:
{ "tristan":{ "name": "tristan", "age": 21, "university": "UESTC", "hobby": ["jog", "ride"] }}
可以去站長工具那裡檢測一下是不是符合json格式 client class name = “RestClient” client內容如下:
package restSerivceClient;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.URL;import java.net.URLConnection;import org.json.JSONObject;public class RestClient { public static void main(String[] args) { String string = ""; try { // Step1: Let's 1st read file from fileSystem InputStream clientInputStream = new FileInputStream( "/home/tristan/workspace/Source/IOFiles/sampleJson.js"); InputStreamReader clientReader = new InputStreamReader(clientInputStream); BufferedReader br = new BufferedReader(clientReader); String line; while ((line = br.readLine()) != null) { string += line + "\n"; } JSONObject jsonObject = new JSONObject(string); System.out.println(jsonObject); // Step2: Now pass JSON File Data to REST Service try { URL url = new URL("http://localhost:8080/simpleRestWebService/api/restService"); URLConnection connection = url.openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/json"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); out.write(jsonObject.toString()); out.close(); System.out.println("ok~before"); InputStreamReader inReader = new InputStreamReader(connection.getInputStream()); System.out.println("ok~reader"); BufferedReader in = new BufferedReader(inReader); System.out.println("ok~buffer"); while (in.readLine() != null) { } System.out.println("\nREST Service Invoked Successfully.."); in.close(); } catch (Exception e) { System.out.println("\nError while calling REST Service"); System.out.println(e); } br.close(); } catch (Exception e) { e.printStackTrace(); } }}
如果不能串連到server的話,console中只會有“ok~before”以及一個Exception提示 Other Resource 可以做web.xml的配置字典 web.xml檔案的作用及基本配置