Resource
所謂"資源",就是網絡上的一個實體,或者說是網絡上的具體信息,它可以是一段文本,一張圖片,一首歌曲,一種服務,
總之就是一個具體的實在,你可以 用一個URI(統一資源定位符)指向它,每種資源對應一個特定的URI,要獲取這個資源,
訪問它的URI就餓可以了,因此URI就成了每一個資源的地址或獨一無二的識別符。
總結:
一:在網絡上,一切皆資源。
二:每一種資源都有一個特定的URI指向它。
Resentation
"資源"是一種信息實體,它可以有多種外在表現形式,我們把"資源"具體呈現出來的形式,叫做它的變現層(Representation)
比如:文本可以用txt格式表現,也可以用HTML格式,ML格式, Json格式 , 表現。
URI只代表資源的實體,不代表它的形式,它的具體表現形式,應該在HTTP請求的頭信息中用Accept和Content-Type字段指定,
這兩個字段纔是對"表現層"的描述。
總結:
一:資源以什麼樣的表現形式呈現出來,這個就叫它的表現出。
二:資源的表現層,一般都是在請求頭信息中體現出來。
State Transfer
訪問一個網站,就代表了客戶端和服務器的一個互動過程,在這個過程中,勢必涉及到數據和狀態的轉換。
互聯網通信協議HTTP協議,是一個無狀態的協議,這意味着,所有的狀態都保存在服務器端,因此,如果客戶端想要操作服務器,
必須通過某種手段,讓服務器端發生狀態轉化,而這種轉化是建立在表現出之上的,所以就是表現層狀態的轉化。
總結:
一:在客戶端和服務器的交互過程中,涉及到狀態轉化,我們是通過某種手段(ajax form)讓它進行轉化。
Uniform Interface
統一接口
REST要求,必須通過統一的接口來對資源執行各種操作,對於每個資源只能執行一組有限的操作。
HTTP1.1協議爲例:
7個HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
http頭信息(可自定義)
HTTP響應狀態代碼(可自定義)
這些就是HTTP1.1協議提供的統一接口
REST還要求,對於資源執行的操作,其操作語義必須由HTTP消息體之前的部分完全表達,不能將操作封裝在HTTP消息體內部。
總結:
1:我們會使用7個HTTP方法來體現我們現在對資源的操作不再在地址上體現。
系統的接口
系統的接口:很多情況下,需要把系統的功能作爲服務暴露給外部的其他應用使用或者給移動端使用,
就需要把系統中的服務作爲接口暴露出來,一般分爲工共接口(發短信,天氣服務,)和私用接口(公司內部使用的)。
路徑又稱終點"endpoint",標識具體API的具體網址
接口設計原則
在REST架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞,而且所有的名詞往往與數據庫的表格名對應,
一般來說數據庫中的表都是同種記錄的集合"collection",所以URI中的名詞也應該使用複數。
如:
http://aliwo.cn/vi/zoos 動物園資源
http://aliwo.cn/vi/animals 動物資源
總結:
一:設計資源的接口,接口URI選用的是名詞,一般和數據庫表名相同,並且使用複數。
抽象出來的接口:/images 圖片資源的接口 post上傳,delete 刪除
動作設計原則
1:GET(SELECT) :從服務器取出資源(一項或多項)
2:POST(CREATE):在服務器新建一個資源
3:PUT(UPDATE):在服務更新資源(客戶端提供改變後的完整資源)PUT更新整個對象。
4:PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性),PATCH更新個別屬性
5:DELETE(DELETE):從服務器刪除資源。
6:HEAD:獲取一個資源的元數據,比如一個資源的hash值或者最後修改的日期。
7:OPTIONS:獲得客戶端對一個資源能夠實施的操作,(獲取該資源的api(能夠對資源做什麼操作的描述))
接口設計
常見狀態碼
處理put或patch,delete請求方法時的處理方案
代碼解析使用Restful架構風格的Controll層設計
package com.live5.project.project_user.controller;
import com.live5.project.project_user.entity.User;
import com.live5.project.project_user.service.UserService;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.apache.ibatis.session.SqlSessionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import javax.swing.*;
import java.sql.SQLException;
/**
* package_name:com.live5.project.project_user.controller
*
* @author:徐亞遠 Date:2020/3/20 21:57
* 項目名:live5_project_user
* Description:TODO
* Version: 1.0
**/
@Controller
@RequestMapping(value = "/users")
@ResponseBody
public class UserController {
@Autowired
private UserService userService;
/**
* updateById 方法的作用簡述
*
* @param user
* @param modelMap
* @return
* @deprecated 通過id修改用戶信息 支持restFul Api put請求
*/
@RequestMapping(value = "/", method = RequestMethod.PUT)
public User updateById(User user, ModelMap modelMap) throws Exception {
try {
return userService.updateUserById(user);
} catch (RuntimeException e) {
e.printStackTrace();
return null;
}
}
/**
* registUser 方法的作用簡述
*
* @param user
* @return
* @throws Exception
* @deprecated 註冊用戶信息 支持restFul風格,post請求 pid可以爲空,但是pid的值唯一
*/
@RequestMapping(value = "/regist", method = RequestMethod.POST)
public User registUser(@RequestBody User user) throws Exception {
try {
return userService.regist(user);
} catch (RuntimeException e) {
e.printStackTrace();
return null;
}
}
/**
* deleteById 方法的作用簡述
* @deprecated 通過id刪除用戶信息,restApi delete請求
* @param id
* @return
* @throws Exception
*/
@RequestMapping(value = {"/del/{id}"}, method = RequestMethod.DELETE)
public String deleteById(@PathVariable Integer id) throws Exception {
try {
Boolean flag = userService.deleteByUserId(id);
if (flag) {
return "刪除成功通過id";
}
} catch (RuntimeException e) {
e.printStackTrace();
}
return "刪除失敗通過id";
}
/**
* deleteByUsername 方法的作用簡述
* @deprecated 通過username 刪除用戶信息,username唯一 rest Api delete請求
* @param username
* @return
*/
@RequestMapping(value = "/{username}", method = RequestMethod.DELETE)
public String deleteByUsername(@PathVariable String username) {
try {
Boolean flag = userService.deleteByUsername(username);
if (flag){
return "通過用戶名刪除成功";
}
} catch (Exception e) {
e.printStackTrace();
}
return "通過用戶名刪除失敗";
}
/**
* login 方法的作用簡述
* @deprecated 登錄功能
* @param username
* @param password
* @return
* @throws Exception
*/
@RequestMapping(value = "/",method = RequestMethod.POST)
public User login(String username,String password) throws Exception {
User user = userService.login(username,password );
if (user!=null){
return user;
}
return null;
}
}