柚子快報邀請碼778899分享:后端 Restful風(fēng)格及實踐
柚子快報邀請碼778899分享:后端 Restful風(fēng)格及實踐
目錄
1、RESTFUL 原則
1.1、資源與URI
URL,URI
資源
1.2、統(tǒng)一資源接口
1.3、資源的表述
1.4、狀態(tài)
有狀態(tài)和無狀態(tài)
狀態(tài)轉(zhuǎn)移(應(yīng)用狀態(tài)化改變資源狀態(tài)化)
2、restful風(fēng)格接口書寫方式
3、restful風(fēng)格的實踐
3.1、項目結(jié)構(gòu)
3.2、創(chuàng)建項目
3.3、配置
3.3.1、添加mybatis plugs依賴
3.3.2、 添加熱部署
?3.3.3、配置application.yml?
3.4、編碼
持久層
數(shù)據(jù)操作層
服務(wù)接口層
服務(wù)層
控制層?
使用postman進行測試
前言:
? ? ? ?restful是一種風(fēng)格,并不是一種 標準,使用它可以更好的創(chuàng)建分布式架構(gòu);restful風(fēng)格中使用名詞定位資源,并使用HTTP協(xié)議里的動詞(GET、POST、PUT、DELETE)來實現(xiàn)資源的增刪改查操作。?
1、RESTFUL 原則
1.1、資源與URI
URL,URI
URI:全稱為Uniform Resource Identifier,即統(tǒng)一資源標志符
URI是一個用來標識抽象或物理資源的緊湊字符串,通過這個標識可以訪問一個唯一的資源。
URL:全稱為Universal Resource Locator,即統(tǒng)一資源定位符
URL是一種具體的URI,它是URI的一個子集,它不僅唯一標識資源,而且還提供了定位該資源的信息。
資源
互聯(lián)網(wǎng)中資源多種多樣,我門所知的視頻,圖片,文字,音頻,html等都是資源的表述,資源通過URI進行唯一標識,每一個URI代表一種資源,所以我們能通過檢索查詢到特定資源。
1.2、統(tǒng)一資源接口
? ? ? ? RESTful架構(gòu)應(yīng)該遵循統(tǒng)一接口原則,統(tǒng)一接口包含了一組受限的預(yù)定義的操作,不論什么樣的資源,都是通過使用相同的接口進行資源的訪問。接口應(yīng)該使用標準的HTTP方法如GET,PUT和POST,并遵循這些方法的語義。
? ? ? ? 如果按照HTTP方法的語義來暴露資源,那么接口將會擁有安全性和冪等性的特性,例如GET和HEAD請求都是安全的, 無論請求多少次,都不會改變服務(wù)器狀態(tài)。而GET、HEAD、PUT和DELETE請求都是冪等的,無論對資源操作多少次, 結(jié)果總是一樣的,后面的請求并不會產(chǎn)生比第一次更多的影響。
get-安全且冪等post-不安全不冪等put-不安全且冪等delete-不安全且冪等
1.3、資源的表述
? ? ? ? ?客戶端獲取的只是資源的表述而已。 資源在外界的具體呈現(xiàn),可以有多種表述(或成為表現(xiàn)、表示)形式,在客戶端和服務(wù)端之間傳送的也是資源的表述,而不是資源本身。 例如文本資源可以采用html、xml、json等格式,圖片可以使用PNG或JPG展現(xiàn)出來。
1.4、狀態(tài)
狀態(tài)可分為應(yīng)用狀態(tài)和資源狀態(tài),應(yīng)用狀態(tài)由客戶端維護,資源狀態(tài)由服務(wù)器端維護。
有狀態(tài)和無狀態(tài)
有狀態(tài)
是指狀態(tài)信息是由服務(wù)器端負責(zé),例如用戶通過提交的cookie信息查找對應(yīng)服務(wù)器端的session信息,由服務(wù)器確定用戶狀態(tài)(如cookie和session來維持登錄)。
無狀態(tài)
當請求端提出請求時,狀態(tài)信息有客戶客戶端負責(zé),請求本身包含了響應(yīng)端為相應(yīng)這一請求所需的全部信息關(guān)聯(lián)的用戶交互操作保留的某種公共信息,例如JWT風(fēng)格,使用token來維持狀態(tài)信息。
狀態(tài)轉(zhuǎn)移(應(yīng)用狀態(tài)化改變資源狀態(tài)化)
例如打開一個淘寶主頁面并點擊某個商品,按照常理它會跳轉(zhuǎn)到商品詳情頁面,可實際上它跳轉(zhuǎn)到了登錄頁面。
這是因為服務(wù)器不能識別客戶端狀態(tài),當?shù)卿浐?,服?wù)器端的session就可以判斷出是哪個用戶,并響應(yīng)資源。
狀態(tài)轉(zhuǎn)移可以理解為:根據(jù)用戶端的狀態(tài)改變資源狀態(tài)
2、restful風(fēng)格接口書寫方式
使用名詞表示資源使用單復(fù)數(shù)表示單個和多個資源使用正斜杠(/)表示層次關(guān)系使用連字符( - )來提高URI的可讀性在URI中使用小寫字母在URI中使用小寫字母
書寫格式:標準的HTTP方法+URI
GET - /users返回用戶列表GET- /users/id返回特定用戶DELETE- /users/id刪除指定用戶POST- /users添加用戶PUT -/users/id更新指定用戶
3、restful風(fēng)格的實踐
本實踐基于springboot+mybatisplugs+maven
3.1、項目結(jié)構(gòu)
3.2、創(chuàng)建項目
使用官方推薦方式:Spring Initializr
我的Group為:com.duhong.learning
?回車下載壓縮包,再導(dǎo)入到idea中
3.3、配置
3.3.1、添加mybatis plugs依賴
在maven 庫(https://mvnrepository.com/)中查詢mybatis plugs依賴
pom.xml中添加依賴
3.3.2、 添加熱部署
1、pom.xml配置
2、配置設(shè)置
?3.3.3、配置application.yml?
說明:要先刪除application.properties減少干擾,yml文件的優(yōu)先級大于properties文件,但都生效,后面properties文件會覆蓋yml文件。
#配置服務(wù)端口
server:
port: 80
#配置數(shù)據(jù)源
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db3
username: root
password: 3237never
#配置mybatis plugs插件,設(shè)置數(shù)據(jù)庫id自增,默認為ASSIGN_ID,使用id自增,簡便配置
mybatis-plus:
global-config:
db-config:
id-type: auto
3.4、編碼
持久層
package com.duhong.learning.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;
//lombok,一個java類庫,提供了一組注解,簡化了pojo實體類開發(fā)
//@AllArgsConstructor
@Data//相當于getter,setter,tostring
@TableName(value = "account")
public class User {
private Integer id;
private String name;
private Double balance;
}
數(shù)據(jù)操作層
package com.duhong.learning.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.duhong.learning.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
//@Mapper
//public interface UserDao {
// @Select("select * from account where id=#{id}")
// User getById(Integer id);
//}
@Mapper
public interface UserDao extends BaseMapper
}
服務(wù)接口層
package com.duhong.learning.service;
import com.duhong.learning.domain.User;
import java.util.List;
public interface UserService {
public User selectById(Integer id);
public List
public Integer deleteById(Integer id);
public Integer insert(User user);
public Integer updateById(User user,Integer id);
}
服務(wù)層
package com.duhong.learning.service.impl;
import com.duhong.learning.dao.UserDao;
import com.duhong.learning.domain.User;
import com.duhong.learning.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
private User user;
@Autowired
UserDao userDao;
@Override
public User selectById(Integer id) {
try{
user=null;
user=userDao.selectById(id);
}catch (Exception e){
System.out.println(e.getMessage());
}
return user;
}
@Override
public List
List
// for(User item :users){
// System.out.println(item.toString());
// }
return users;
}
//刪除,添加,更新指定用戶,返回執(zhí)行條數(shù),可以用返回值查看是否操作成功
@Override
public Integer deleteById(Integer id) {
Integer sign=0;
try {
sign=userDao.deleteById(id);
}catch (Exception e){
System.out.println(e.getMessage());
}
return sign;
}
@Override
public Integer insert(User user) {
Integer sign=0;
try {
user.setName(user.getName());
user.setBalance(user.getBalance());
sign=userDao.insert(user);
}catch (Exception e){
System.out.println(e.getMessage());
}
return sign;
}
@Override
public Integer updateById(User user, Integer id) {
Integer sign=0;
try {
user.setId(id);
user.setName(user.getName());
user.setBalance(user.getBalance());
sign=userDao.updateById(user);
}catch (Exception e){
System.out.println(e.getMessage());
}
return sign;
}
}
控制層?
package com.duhong.learning.controller;
import com.duhong.learning.domain.User;
import com.duhong.learning.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
//Restful風(fēng)格
@RestController
public class UserController {
@Autowired
UserServiceImpl userService;
@RequestMapping(value = "/users",method = RequestMethod.GET)
List
return userService.selectList();
}
@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
User showById(@PathVariable Integer id){
return userService.selectById(id);
}
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
Integer deleteById(@PathVariable Integer id){
return userService.deleteById(id);
}
@PutMapping("/users/{id}")//換種方式,等效于@RequestMapping(value = "/users/{id}",method = RequestMethod.PUT)
Integer updataById(@RequestBody User user,@PathVariable Integer id){
return userService.updateById(user,id);
}
@PostMapping("/users")//接受User對象參數(shù)
Integer add(@RequestBody User user){
return userService.insert(user);
}
}
使用postman進行測試
推薦vscode中使用Postcode插件,相當方便
查詢所有
?添加數(shù)據(jù)
根據(jù)id查詢指定用戶
?
更新指定用戶
?
?刪除指定用戶
?感謝你閱讀到最后~?
?期待你的關(guān)注、收藏、評論、點贊~
??愿我們一起變強?
柚子快報邀請碼778899分享:后端 Restful風(fēng)格及實踐
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。