Design REST-ful Web Service
kevingo
- Use Spring MVC as Example
REpresentational State Transfer
Roy T. Fieldinghttp://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
Apache co-founderApache HTTP Server project developerHTTP 1.0 / 1.1 spec author
A style of software architecture for distributed hypermedia systems.
REST 是一種軟體架構風格適合用來開發 Web
Service
WHO USE REST
WHO USE REST
向主流靠攏 !
萬物皆資源Any information that can be named can be a resource
<People> <name>Fu</name> <Age>10</Age></People>
{ 'obj1': { 'child1':'value1', 'child2':'value2' }, 'array1': [1, 2, 3, 4, 5]}
任何資源都用 URL 表達http://itri.com/proj/i236
http://itri.com/people/kevingo
相同資源,格式可能不同http://xxx.com/article
回想 REST 的全名…
REpresentational
State
Transfer
對於資源在特定時刻的狀態的描述
資源在 Client Side 和 Server Side 之間的轉移
資源的狀態
REST 說穿了 …
Service Provide
r
我要 XXX
這是 OOO
透過 HTTP
RESTful ?
RESTful …• forget -> forgetful : 忘記 -> 健忘的• color -> colorful : 顏色 -> 多顏色的• peace -> peaceful : 和平 -> 和平的• ….
同理可證
REST -> RESTful
符合 REST 規範的
REST 到底規範了什麼?
使用 URL 來表達資源
http://itri.org/project/i236
http://itri.org/project/paas/people
工研院的 i236 計畫
參與工研院 paas 計畫的人員
利用 HTTP 定義的動詞方法來進行資源的操作
GETPUT
POSTDELETE
Communicate Stateless
其他還有…• Cacheable
• Client–server
• Layered system
• Code on demand
RESTful URL design
http://itri.org/addProject?name=i236http://itri.org/showProject?name=i236http://itri.org/deleteProject?name=i236http://itri.org/editProject?name=i236
http://itri.org/project/i236GETDELETEPOSTPUT
REST 的優點• Scalability - stateless
• 搜尋引擎喜歡 Clean URL
• 統一的存取介面 – HTTP Method
• 使用 HTTP Catch 和 proxy server 提高負載程度
REST in JavaSpring MVC
Spring 3.0
annotation-based programming model
使用 annotation 減少繼承宣告
配合 context:component-scan減少 XML 設定文件
@Controller
聲明這是一個 Controller 類別
@Controllerpublic class ProjectController {…}
public class ProjectController extends xxxController {…}
取代
@RequestMapping
將請求轉交至對應的類別或方法
@Controller@RequestMapping(value=“/projects”)public class ProjectController {…}
@RequestMapping(value=“/projects”)public ModelAndView show() {…}
可以用在類別上
也可以用在方法上
還可以指定請求的方法@RequestMapping(value=“/projects”, method=RequestMethod.POST)public ModelAndView show() {…}
連請求的 header 都可以指定@RequestMapping(headers=“content-type=text/*”)public ModelAndView show() {…}
@PathVariable
將 URL 的參數和方法的參數進行綁定
URL 參數會傳入方法中@RequestMapping(“/project/{name}”)public ModelAndView show(@PathVariable String name) {…}
萬事俱備只欠東風
瀏覽器只支援GET 和POST
貼心的 Spring 幫我們解決…
1
2
在 web.xml 加入 HiddenHttpMethodFilter
使用 spring form tag 來指定 http method
(PUT or DELETE)
其實是用 POST 發出請求,只是偷偷塞了一個hidden field 來放真正的 HTTP Method
3 HiddenHttpMethodFilter 會根據真正的 HTTP Method 幫我們轉發到正確的 Controller
<form:form action="project" method="delete"> <input type="submit" value="Delete Project" name=“i236" /></form:form>
<form id="command" action="project/i236" method="post"><input type="hidden" name="_method" value="delete"/> <input type="submit" value="Delete i236" name="i236" />
</form>
偷偷看一下原始碼…
還有什麼?
每次要使用 REST都要產生一個
form ?
使用 RestTemplate 類別
輕鬆呼叫 REST Resources 謝謝 Spring 3.0
• GET – getForObject• POST – postForObject• PUT – put• DELETE – delete
…..
http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/client/RestTemplate.html
還有一點點問題…
怎麼做?
三種作法• 在 Request Header 裡面宣告
GET /project/i236 HTTP/1.1Accept: text/html
GET /project/i236 HTTP/1.1Accept: application/json
• 使用副檔名
• 使用額外參數
/project/i236.json/project/i236.html
/project/i236?format=json/project/i236?format=html
ContentNegotiatingViewResolver
支援瀏覽器Request Header
支援副檔名
瀏覽器 Request Header
• 不同的瀏覽器支援的格式不同
• text/html• application/xhtml+xml• application/xml
• application/xml• application/xhtml+xml• text/html• text/plain• Image/png
• iamge/jpeg• application/xaml+xml• application/x-ms-application• image/gif• Image/pjpeg• application/x-ms-xbap• ……
使用不同副檔名1
2
引入 bean - ContentNegotiatingViewResolver
增加 mediaTypes property
在 mediaTypes 中,用 map 填入想要的附檔名
3 在 defaultViews 中,實作要呈現的 View
看一下 DEMO 吧…
給你魚竿 - REST• Roy Thomas Fielding 博士論文
– http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
• REST-ful URI design– http://redrata.com/restful-uri-design/
• REST 簡介– http://www.shlug.org/Slide/2011/2/REST.pdf
• RESTful Rails Development– http://www.b-simple.de/download/restful_rails_en.pdf
• REST (Representational State Transfer) and RESTful
web services: Methods, Concepts and Examples– http://mauriziostorani.wordpress.com/2008/07/27/rest-representational-state-transfer-
and-restful-web-services-concepts-and-examples/
給你魚竿 - Spring MVC REST
• Spring API– http://static.springsource.org/spring/docs/3.0.x/javadoc-api/
• Spring MVC Rest– http://www.slideshare.net/habuma/spring-mvc-rest
• REST in Spring 3: @MVC– http://blog.springsource.com/2009/03/08/rest-in-spring-3-
mvc/
http://itri.org/ReadingClub/kevingo/3curl -X DELETE
Thank you