javascript
Springboot 之 RESTFul风格
3.4 Spring Boot 實現 RESTful 風格
3.4.1 關于RESTFul
REST(英文:Representational State Transfer,簡稱 REST)
RESTFul是一種互聯網軟件架構設計的風格,但它并不是標準,它只是提出了一組客戶端和服務器交互時的架構理念和設計原則,基于這種理念和原則設計的接口可以更簡潔,更有層次,REST這個詞,是 Roy Thomas Fielding 在他 2000 年的博士論文中提出的。
任何的技術都可以實現這種理念,如果一個架構符合 REST 原則,就稱它為 RESTFul 架構。
比如:
我們要訪問一個 http 接口:http://localhost:8080/boot/order?id=1021&status=1
采用 RESTFul 風格則 http 地址為:http://localhost:8080/boot/order/1021/1
簡單點來說RESTful就是把參數放到請求路徑中,而省略了參數名
3.4.2 Spring Boot 開發 RESTFul
Spring boot 開發 RESTFul 主要是幾個注解實現
RESTFul風格要求后端響應請求的方式通常是有明確性的,即使用表示意義明確的注解標注方法響應類型
(1) @PathVariable
該注解是實現 RESTFul 最主要的一個注解 ,我們一般通過該注解獲取 url 中的數據
使用
@RestController public class studentController {@GetMapping(value = "/student/details/{id}")public Object studentDetails(@PathVariable("id") Integer id){return "ID -> " + id;}}上面代碼中,后端接收的參數寫在value中,用{}括起來,在方法參數內的@PathVariable(“id”) Integer id表示將接收到的參數賦值給Integer類型的引用id,其中@PathVariable內的參數與value中的參數應一致。
瀏覽器測試:
多個參數
@GetMapping(value = "/student/details/{id}/{name}") public Object studentDetails2(@PathVariable("id") Integer id, @PathVariable("id") String name){return "ID -> " + id + " NAME -> " + name; }可以看到是沒有問題的:
注意
下面的寫法實際并不會產生報錯:
@RestController public class studentController {@GetMapping(value = "/student/details")public Object studentDetail(Integer id){return "id -> " + id;}@GetMapping(value = "/student/details/{id}")public Object studentDetails(@PathVariable("id") Integer id){return "ID -> " + id;}}測試:
可以看到,兩個方法都是能響應的。
這是因為傳統的http請求風格將方法接收的參數視為請求中傳來的參數,而RESTFul風格的寫法將傳來的參數視為url的一部分,這是不一樣的。
但是下面這種寫法是會報錯的:
@RestController public class studentController {@GetMapping(value = "/student/details/{id}/{name}")public Object studentDetails2(@PathVariable("id") Integer id, @PathVariable("name") String name){return "ID -> " + id + " NAME -> " + name;}@GetMapping(value = "/student/details/{id}/{grade}")public Object studentDetails3(@PathVariable("id") Integer id, @PathVariable("grade") String grade){return "ID -> " + id + " GRADE -> " + grade;} }運行后會報如下錯誤:
java.lang.IllegalStateException: Ambiguous handler methods mapped for '/student/details/1/%E7%8E%8B%E4%BA%94': {public java.lang.Object com.example.springbootworkspace.web.studentController.studentDetails3(java.lang.Integer,java.lang.String), public java.lang.Object com.example.springbootworkspace.web.studentController.studentDetails2(java.lang.Integer,java.lang.String)}這是因為兩個方法接收的參數類型順序是一致的,無法分辨響應請求的到底是哪一個方法。
想要解決請求沖突,只能通過改寫請求方式 或者 對url進行更加詳細的描寫
其他注解
@PostMapping
接收和處理 Post 方式的請求
@DeleteMapping
接收 delete 方式的請求,可以使用 GetMapping 代替
@PutMapping
接收 put 方式的請求,可以用 PostMapping 代替
@GetMapping
接收 get 方式的請求
3.4.3 使用 RESTful 風格模擬對學生信息的增刪改查操作
集成 MyBatis、springboot,模擬實現對學生的增刪改查操作
(1) pom.xml 文件
應具備如下內容
<dependencies> <!--SpringBoot框架web項目起步依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--MyBatis集成SpringBoot框架起步依賴--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version> </dependency> <!--MySQL驅動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> <build> <!--指定配置資源的位置--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <!--mybatis代碼自動生成插件--> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.6</version> <configuration> <!--配置文件的位置--> <configurationFile>GeneratorMapper.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>(2) application.yml 核心配置文件
server:port: 8090servlet:context-path: /#配置數據源 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8 username: rootpassword: qks218126(3) 逆向工程生成 DAO
根目錄下的GeneratorMapper.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 指定連接數據庫的 JDBC 驅動包所在位置,指定到你本機的完整路徑 --><classPathEntry location="C:\Users\15998\.m2\repository\mysql\mysql-connector-java\8.0.25\mysql-connector-java-8.0.25.jar"/><!-- 配置 table 表信息內容體,targetRuntime 指定采用 MyBatis3 的版本 --><context id="tables" targetRuntime="MyBatis3"><!-- 抑制生成注釋器,因為生成的注釋都是英文的,可以不讓它生成 --><commentGenerator><property name="suppressAllComments" value="true" /></commentGenerator><!-- 配置數據庫連接信息 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/springboot"userId="root"password="qks218126"></jdbcConnection><!-- 生成 model 類,targetPackage 指定 model 類的包名, targetProject 指定生成的 model 放在 eclipse 的哪個工程下面--><javaModelGenerator targetPackage="com.example.springbootworkspace.model"targetProject="src/main/java"><property name="enableSubPackages" value="false" /><property name="trimStrings" value="false" /></javaModelGenerator><!-- 生成 MyBatis 的 Mapper.xml 文件,targetPackage 指定 mapper.xml 文件的包名, targetProject 指定生成的 mapper.xml 放在 eclipse 的哪個工程下面 --><sqlMapGenerator targetPackage="com.example.springbootworkspace.mapper"targetProject="src/main/java"><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- 生成 MyBatis 的 Mapper 接口類文件,targetPackage 指定 Mapper 接口類的包名, targetProject 指定生成的 Mapper 接口放在 eclipse 的哪個工程下面 --><javaClientGenerator type="XMLMAPPER"targetPackage="com.example.springbootworkspace.mapper"targetProject="src/main/java"><property name="enableSubPackages" value="false" /></javaClientGenerator><!-- 數據庫表名及對應的 Java 模型類名 --><table tableName="t_student" domainObjectName="Student"enableCountByExample="false"enableUpdateByExample="false"enableDeleteByExample="false"enableSelectByExample="false"selectByExampleQueryId="false"/></context> </generatorConfiguration>逆向工程生成DAO
(4)編寫代碼
控制層
@RestController public class RESTfulController {@Autowiredprivate StudentService studentService;/*** 增加學生信息* @param id* @param name* @return*/@PostMapping(value = "/student/{id}/{name}/{age}")public Object addStudent(@PathVariable("id") Integer id, @PathVariable("name") String name, @PathVariable("age") Integer age) {Student student = new Student();student.setId(id);student.setStuName(name);student.setStuAge(age);return studentService.insert(student);}/*** 刪除學生信息* @param id* @return*/@DeleteMapping(value = "/student/{id}")public Object removeStudent(@PathVariable("id") Integer id) {return studentService.deleteByPrimaryKey(id);}/*** 修改學生信息* @param id* @return*/@PutMapping(value = "/student/{id}/{name}")public Object modifyStudent(@PathVariable("id") Integer id, @PathVariable("name") String name) {Student student = new Student();student.setId(id);student.setStuName(name);return studentService.modifyStudentById(student);}/*** 通過id查詢學生信息* @param id* @return*/@GetMapping(value = "/student/{id}")public Object queryStudent(@PathVariable("id") Integer id) {Student student = studentService.queryStudentById(id);return student;} }業務層
public interface StudentService {/** 根據學生id獲取學生詳情* */Student queryStudentById(Integer id);/*** 根據student對象更新學生信息* @param student* @return*/int modifyStudentById(Student student);/*** 根據id刪除學生信息* @param id* @return*/int deleteByPrimaryKey(Integer id);/*** 增加學生信息* @param student* @return*/int insert(Student student); }業務層實現類
@Service public class StudentServiceImpl implements StudentService {@Autowiredprivate StudentMapper studentMapper;@Overridepublic Student queryStudentById(Integer id) {return studentMapper.selectByPrimaryKey(id);}@Overridepublic int modifyStudentById(Student student){return studentMapper.updateByPrimaryKeySelective(student);}@Overridepublic int deleteByPrimaryKey(Integer id) {return studentMapper.deleteByPrimaryKey(id);}@Overridepublic int insert(Student student) {return studentMapper.insert(student);} }(5) 使用 Postman 測試
插入
刪除
查詢
修改
(6)RESTful好與壞
好處就是:傳遞參數變簡單了,服務提供者對外只提供了一個接口服務,而不是傳統的 CRUD 四個接口
壞處就是除了需要指定特定的請求方式之外,還需要對url進行更加細致的劃分
3.4.5 RESTful 原則
-
增 post 請求、刪 delete 請求、改 put 請求、查 get 請求
-
請求路徑不要出現動詞例如:查詢訂單接口
? /boot/order/1021/1(推薦)
? /boot/queryOrder/1021/1(不推薦)
- 分頁、排序等操作,不使用斜杠傳參數例如:訂單列表接口
? /boot/orders?page=1&sort=desc
- 一般傳的參數不是數據庫表的字段,可以不采用斜杠
總結
以上是生活随笔為你收集整理的Springboot 之 RESTFul风格的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tcp、select函数实现在线词典(C
- 下一篇: html 白色用rgba,javascr