1.什么是RESTful
1.1.REST的由來
Roy Fielding博士提出了基于REST(Representational State Transfer)風格的軟件架構(gòu)模式捌议,成為一種設(shè)計Web API的模式夷陋。(同時取代了SOAP的地位)
REST基于基于HTTP進行通信彪腔,并使用XML格式定義或JSON格式定義作為載體傳輸消息和數(shù)據(jù),使得所有功能都已一種標準化Web服務(wù)的形式向外提供服務(wù)吼句。這樣做等太,能力四線功能代碼與界面設(shè)計的完全分離市咆,可以極大地把前端和后端的代碼隔離慢宗,使得后端代碼易于測試,前端代碼編寫更簡單余素。
當一個Web應(yīng)用以API的形式對外提供功能時豹休,整個應(yīng)用的結(jié)構(gòu)就擴展為:
服務(wù)(資源+資源) + 前端交互(包括:PC、App桨吊、嵌入式設(shè)備威根、云服務(wù))
1.2.Rest架構(gòu)的主要原則
- ** 網(wǎng)絡(luò)上的所有事物都被抽象為資源**
- ** 每個資源都有一個唯一的資源標識符**
- ** 同一個資源具有多種表現(xiàn)形式(xml,json等)**
- ** 對資源的各種操作不會改變資源標識符**
- ** 所有的操作都是無狀態(tài)的**
- ** 符合REST原則的架構(gòu)方式即可稱為RESTful**
1.3.基于HTTP通信規(guī)范
每個資源都使用 URI (Universal Resource Identifier) 得到一個唯一的地址。所有資源都共享統(tǒng)一的接口视乐,以便在客戶端和服務(wù)器之間傳輸狀態(tài)洛搀。
使用的是標準的 HTTP 方法,比如 POST 佑淀、DELETE留美、PUT和GET,對應(yīng)的就是數(shù)據(jù)的4種基本操作:增刪改查的操作伸刃。如下圖所示:
2.RESTful
RESTFUL是一種網(wǎng)絡(luò)應(yīng)用程序的設(shè)計風格和開發(fā)方式谎砾。也就是遵守了REST風格的web服務(wù);REST式的web服務(wù)是一種ROA面向資源的架構(gòu)(The Resource-Oriented Architecture)捧颅。
其中景图,URI = /資源名稱/資源標識 + HTTP的請求方式表示對應(yīng)的CRUD操作。
例如:
<!--查詢:-->
http://localhost/user/1 HTTP-GET <!--表示:查詢id=1的user-->
http://localhost/users HTTP-GET <!--表示:查詢所有user-->
<!--添加:-->
http://localhost/user HTTP-GET <!--表示:訪問添加用戶頁面-->
http://localhost/user HTTP-POST <!--表示:新增一個user-->
<!--修改:-->
http://localhost/user HTTP-PUT <!--表示:修改user-->
<!--刪除:-->
http://localhost/user/1 HTTP-DELETE <!--表示:刪除id=1的user(采用$.ajax異步刪除)-->
實現(xiàn)步驟:
- 定義一個UserController碉哑,映射以上所有的RESTful資源URI挚币;
- IUserService接口中定義功能方法亮蒋,以便UserController調(diào)用后可以實現(xiàn)功能;
- 定義User實體妆毕,以及UserDao中實現(xiàn)基本的數(shù)據(jù)庫表的增刪改查慎玖;
- UserService調(diào)用UserDao,實現(xiàn)IUserService接口所定義的功能方法笛粘。
- 把靜態(tài)頁面引入Thymeleaf模板引擎的templates中凄吏,并把相應(yīng)的th:href修改為UserControllser中所定義的URI資源路徑。
例如:所有員工的信息展示:
<h2>
<buttom class="btn btn-sm btn-success">添加用戶</buttom>
</h2>
<table>
<thead>
<tr>
<th>用戶編號</th>
<th>用戶姓名</th>
<th>用戶密碼</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="user:${users}">
<td th:text="${user.id}"></td>
<td th:text="${user.name}"></td>
<td th:text="${user.pwd}"></td>
<td>
<buttom class="btn btn-sm btn-primary">編輯</buttom>
<buttom class="btn btn-sm btn-danger">編輯</buttom>
</td>
</tr>
</tbody>
</table>