Unit 10: RESTful Service 使用 JAX-RS 2.0 – Basic Concepts
HTTP 請求結構回顧
HTTP 請求的結構 [10]:
1
2
3
4
<method> <request-URL> <version>
<headers>
<entity-body>
Example:
1
2
3
4
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
什麼是 RESTful Service
REST Style Architecture
Fielding, R. T. 於 2000 提出 REST Style Architecture. Representational State Transfer (REST) is an architectural style for building distributed systems. The Web is an example for such a system.
他認為超本文(hypertext)是同時對資訊的呈現(presentation)及控制(control), 使得資訊藉由使用者得到選擇及選擇行動變得變得有可用性(affordance).
REST Style Architecture 觀點下的 WWW 世界:
- Resource: 每一台電腦或可以提供資訊的應用程式被視為是 Resource
- Resource URL: 每個 Resource 在 WWW 中有唯一的 URL 表示其位置
- Representational State: 資源具有可表徵的狀態, 狀態可用文字表示.
RESTful-Triangle (REST 金三角) 概念[4]:
- Nouns 名詞:用來表示資源的名稱。每一個網路上的資源應該僅有一個唯一的識別位置,通常使用 URL 表示
- Verbs 動詞:描述了對 Nouns 名詞 (資源 URL) 的操作動作。比如使用 http 的方法對網路上的資源進行查詢、新增、修改、刪除等動作。HTTP 的方法包括: GET, POST, PUT, 及 DELETE.
- Content Types 資源呈現方式:比如取得某一個 URL 文章的 HTML 格式、或者 XML 格式,同樣的 URL 資源可以有不同型態的表現方式。
Fig Source: [5]
RESTful Service 是依照 REST Style Architecture 設計的服務。 RESTful Web Service 指 Web Service 其設計架構符合 REST Style Architecture。
REST Style 的服務存取
在 HTTP 協定下實現的 REST Style 服務的存取
假設有一公司開放網址 http://rest.example.com/
, 其下有兩個資源:
http://rest.example.com/books
: 所有的書本的資訊http://rest.example.com/books/{id}
: 特定書本的資訊
配合不同的 HTTP 方法所代表的意思
資源名稱 | HTTP 方法 | 意義 |
---|---|---|
http://rest.example.com/books |
GET | 取得所有的書本資訊。回傳的資料放在 Response 中 |
http://rest.example.com/books |
POST | 新增一群書本資訊。Server 回傳新增資料的 URI。 |
http://rest.example.com/books |
PUT | 新增一群書本資訊,若不存在。若己存在,替換原來的資料 |
http://rest.example.com/books |
DELETE | 刪除一群書本資訊。 |
資源名稱 | HTTP 方法 | 意義 |
---|---|---|
http://rest.example.com/books/B101 |
GET | 取得書本 B101 資訊。回傳的資料放在 Response 中 |
http://rest.example.com/books/add |
POST | 新增一群書本資訊。Server 回傳新增資料的 URI, 例如: http://rest.example.com/books/B101 。 |
http://rest.example.com/books/B101 |
PUT | 更新 書本 B101 資訊。若不存在,建立書本 B101 資料。 |
http://rest.example.com/books/B101 |
DELETE | 刪除書本 B101 資訊。 |
JAX-RS API
Java API for RESTful Web Services (JAX-RS) 是 Java EE 對 RESful Web Service 的解決方案所制定的標準。
JAX-RS 的實作有[6]:
- Jersey [7] (Glassfish Server 中使用的版本)
- Apache CXF
- 其它參考 [6]
從 Request-Response 的角度來看 REST 下 Client 及 Server 間的溝通。
Client 2 對資源 /order/12345
進行 POST 操作,其資料的 content-type 為 form-urlencoded。這個請求被對應到 Warehouse endpoint。Warehouse 會新增一筆資料,並以非同步的方式回覆 Client 端。
Warehouse endpoint 屬於 JAX-RS 的 Provider; Client 2 屬於 JAX-RS Client。
Fig Source: P350 in [8]
若從 JAX-RS 的角度來看:
Fig Source: [9]
撰寫 JAX-RS 應用程式
Basic Steps
- 定義的資源名稱 (Resource Name), 包含: URI 樣式(pattern)、輸入及其 content type、輸出及其 content type
- 建立 Resource Class, 用來代表 JAX-RS 的 endpoint
- 註記(annotate) root resource path:
@Path
- 註記(annotate) root resource path:
- 建立 Resource class method, 用來對映 http methods
- 註記 Class method 所對映的 http methods:
@GET
,@POST
,@PUT
,@DELETE
。 - 註記 Class method 的可以接受的來自 Cliend 的內容型態:
@Consumes
; 註記回應給 Client 時的內容型態@Produce
- 註記 Class method 所對映的 http methods:
Code Example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
// The Java class will be hosted at the URI path "/helloworld"
// The URL will be http://hostname/web_context/helloworld
@Path("/helloworld")
public class HelloWorldResource {
// The Java method will process HTTP GET requests
@GET
// The Java method will produce content identified by the MIME Media
// type "text/plain"
@Produces("text/plain")
public String getClichedMessage() {
// Return some cliched textual content
return "Hello World";
}
}
實作練習
使用 Netbeans 產生 RESTful Applicatioin 及其測試工具
Step 使用 Netbeans 產生新的專案。
選擇 REST: HELLO WORLD (Java EE 6)
的專案樣板。
Step 建立後,會自動產生 helloworld
package,package 內有三個 class:
ApplicationConfig
class: 用來對 RESTful application 進行設定用的類別。HelloWorldResource
class: 是 resource class.NameStorageBean
class: 是 Singleton session bean,用來儲存資料,扮演 repository 的角色。
Step 測試此專案。滑鼠右鍵點選專案名稱,選擇項目 Test RESTful Web Service。
Step 在 Configure REST Test Client 視窗中,選擇選項 Web Test Client in Project,選擇先前建立的專案目錄。
Step 完成後,NetBeans 會在選擇的專案的 Web Pages 目錄產生 test-restbeans.html
及所需要的 CSS、JS、和其他的圖片資源。之後,會自動部署應用程式,並瀏覽到 test-restbeans.html
。
Step 除了使用 test-restbeans.html
進行測試外,也可以使用 curl
指令進行測試。
使用 curl
linux 指令進行測試:
1
2
3
4
# Get
curl "http://localhost:8080/jsf_under_unit10/resources/greeting"
# Put
curl -X PUT --header "Content-Type: text/plain" --data "Mary" "http://localhost:8080/jsf_under_unit10/resources/greeting"
References
- 什麼是REST跟RESTful?
- [不是工程師] 休息(REST)式架構? 寧靜式(RESTful)的Web API是現在的潮流?
- Java Tutorial 第六堂(1)REST 與 JAX-RS
- RESTful API 設計準則與實務經驗 - Soul & Shell Blog
- Representational State Transfer (REST) ; Erik Wilde ; UC Berkeley School of Information
- Java API for RESTful Web Services - Wikipedia
- Jersey
- Pilgrim, P.A. (2013). Java EE 7 Developer Handbook. Packt Publishing.
- Creating RESTful Web Services with JAX-RS - Developer.com
- 四种常见的 POST 提交数据方式, JerryQu 的小站
- Chapter 15. JAX-RS Resource Locators and Sub Resources
- Subresources and Runtime Resource Resolution - The Java EE 6 Tutorial
- Chapter 13 Building RESTful Web Services with JAX-RS (The Java EE 6 Tutorial)
- 使用curl指令測試REST服務
- Sending API requests using cURL