河南鄭州網(wǎng)站推廣優(yōu)化淘寶優(yōu)化關(guān)鍵詞的步驟
前言(SpringBoot程序請(qǐng)求響應(yīng)流程)
以上一章的程序?yàn)槔?#xff0c;一個(gè)基于SpringBoot的方式開(kāi)發(fā)一個(gè)web應(yīng)用,瀏覽器發(fā)起請(qǐng)求 /hello 后 ,給瀏覽器返回字符串 “Hello World ~”。
而我們?cè)陂_(kāi)發(fā)web程序時(shí)呢,定義了一個(gè)控制器類Controller,請(qǐng)求會(huì)被部署在Tomcat中的Controller接收,然后Controller再給瀏覽器一個(gè)響應(yīng),響應(yīng)一個(gè)字符在瀏覽器發(fā)起請(qǐng)求,請(qǐng)求了我們的后端web服務(wù)器(也就是內(nèi)置串 “Hello World”。 而在請(qǐng)求響應(yīng)的過(guò)程中是遵循HTTP協(xié)議的。
但是在Tomcat這類Web服務(wù)器中,是不識(shí)別我們自己定義的Controller的。而Tomcat是一個(gè)Servlet容器,支持Serlvet規(guī)范,因此在tomcat中是可以識(shí)別 Servlet程序的。
- Servlet(服務(wù)器小程序)是一種運(yùn)行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的 Java 程序,用于處理客戶端(如瀏覽器)發(fā)送的 HTTP 請(qǐng)求并生成響應(yīng)。它是 Java Web 開(kāi)發(fā)的核心組件之一,遵循 Java Servlet API 規(guī)范。
- 簡(jiǎn)單來(lái)說(shuō),當(dāng)用戶通過(guò)瀏覽器訪問(wèn)一個(gè)網(wǎng)站時(shí),瀏覽器會(huì)發(fā)送 HTTP 請(qǐng)求到 Web 服務(wù)器,服務(wù)器中的 Servlet 程序就會(huì)接收并處理這些請(qǐng)求,比如獲取用戶請(qǐng)求的頁(yè)面內(nèi)容、處理用戶提交的表單數(shù)據(jù)等,然后生成一個(gè)響應(yīng)返回給瀏覽器,這個(gè)響應(yīng)可以是 HTML 頁(yè)面、XML 數(shù)據(jù)、JSON 數(shù)據(jù)或者其他類型的內(nèi)容。
那么在SpringBoot進(jìn)行web程序開(kāi)發(fā)時(shí),它其實(shí)內(nèi)置了一個(gè)核心的Servlet程序 DispatcherServlet,稱之為 核心控制器,也可以叫做 前端控制器。 DispatcherServlet 負(fù)責(zé)接收頁(yè)面發(fā)送的請(qǐng)求,然后根據(jù)執(zhí)行的規(guī)則,將請(qǐng)求再轉(zhuǎn)發(fā)給后面的請(qǐng)求處理器Controller,請(qǐng)求處理器處理完請(qǐng)求之后,最終再由DispatcherServlet給瀏覽器響應(yīng)數(shù)據(jù)。
那將來(lái)瀏覽器發(fā)送請(qǐng)求,會(huì)攜帶請(qǐng)求數(shù)據(jù),包括:請(qǐng)求行、請(qǐng)求頭;請(qǐng)求到達(dá)tomcat之后,tomcat會(huì)負(fù)責(zé)解析這些請(qǐng)求數(shù)據(jù),然后呢將解析后的請(qǐng)求數(shù)據(jù)會(huì)傳遞給Servlet程序中的HttpServletRequest對(duì)象,那也就意味著 HttpServletRequest 對(duì)象就可以獲取到請(qǐng)求數(shù)據(jù)。 而Tomcat,還給Servlet程序傳遞了一個(gè)參數(shù) HttpServletResponse,通過(guò)這個(gè)對(duì)象,我們就可以給瀏覽器設(shè)置響應(yīng)數(shù)據(jù) 。
一 請(qǐng)求
?
1、Postman(接口測(cè)試工具)
postman的安裝使用教程 我已經(jīng)在另一篇文章詳細(xì)介紹?Postman安裝使用教程-CSDN博客
2、簡(jiǎn)單參數(shù)
①、原始方式
Tomcat接收到http請(qǐng)求時(shí):把請(qǐng)求的相關(guān)信息封裝到HttpServletRequest對(duì)象中
在Controller中,我們要想獲取Request對(duì)象,可以直接在方法的形參中聲明 HttpServletRequest 對(duì)象。然后就可以通過(guò)該對(duì)象來(lái)獲取請(qǐng)求信息:
②、SpringBoot方法
在Springboot方法中可以自動(dòng)進(jìn)行類型轉(zhuǎn)換。在Springboot的環(huán)境中,對(duì)原始的API進(jìn)行了封裝,接收參數(shù)的形式更加簡(jiǎn)單。 對(duì)于簡(jiǎn)單參數(shù)來(lái)講,只要保證請(qǐng)求參數(shù)名和Controller方法中的形參名保持一致,就可以獲取到請(qǐng)求參數(shù)中的數(shù)據(jù)值。
發(fā)送Post請(qǐng)求:?
如果形參與請(qǐng)求參數(shù)對(duì)應(yīng)不上,也可以通過(guò)注解@RequestParam來(lái)進(jìn)行映射:
?
但是如果沒(méi)有設(shè)置@RequestParam注解,且方法形參名與請(qǐng)求參數(shù)名不一致,那么雖然會(huì)無(wú)法接收到請(qǐng)求數(shù)據(jù),但是它不會(huì)報(bào)錯(cuò)?
注解@RequestParam中的required屬性默認(rèn)為true,代表該請(qǐng)求參數(shù)必須傳遞,如果不傳遞就會(huì)報(bào)錯(cuò):
?
?
③、小結(jié)
?
3、實(shí)體參數(shù)
在使用簡(jiǎn)單參數(shù)做為數(shù)據(jù)傳遞方式時(shí),前端傳遞了多少個(gè)請(qǐng)求參數(shù),后端controller方法中的形參就要書(shū)寫(xiě)多少個(gè)。如果請(qǐng)求參數(shù)比較多,通過(guò)上述的方式一個(gè)參數(shù)一個(gè)參數(shù)的接收,會(huì)比較繁瑣。
①、簡(jiǎn)單實(shí)體對(duì)象
此時(shí),我們可以考慮將請(qǐng)求參數(shù)封裝到一個(gè)實(shí)體類對(duì)象中。 要想完成數(shù)據(jù)封裝,需要遵守如下規(guī)則:請(qǐng)求參數(shù)名與實(shí)體類的屬性名相同
User類 定義在實(shí)體類Pojo中?
②、復(fù)雜實(shí)體對(duì)象?
?
?
?
③、小結(jié)?
如果是復(fù)雜實(shí)體對(duì)象,也只需按照對(duì)象層次結(jié)構(gòu)關(guān)系即可接收嵌套實(shí)體類屬性參數(shù)
?
4、數(shù)組集合參數(shù)
數(shù)組集合參數(shù)的使用場(chǎng)景:在HTML的表單中,有一個(gè)表單項(xiàng)是支持多選的(復(fù)選框),可以提交選擇的多個(gè)值
多個(gè)值是怎么提交的呢?其實(shí)多個(gè)值也是一個(gè)一個(gè)逐個(gè)提交的
①、數(shù)組
?
?②、集合
?
requestparam適用場(chǎng)景:
**`@RequestParam`注解的使用場(chǎng)景**
1- **綁定單個(gè)請(qǐng)求參數(shù)** - 當(dāng)你需要從HTTP請(qǐng)求(通常是GET或POST請(qǐng)求)中獲取單個(gè)參數(shù)時(shí),可以使用`@RequestParam`。
例如,在一個(gè)處理用戶登錄的方法中,如果前端通過(guò)表單提交了用戶的用戶名和密碼,后端方法可以使用`@RequestParam`來(lái)獲取這些參數(shù)。
```java @RequestMapping("/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password) {
????????// 在這里進(jìn)行登錄驗(yàn)證邏輯
????????return "loginSuccess";
} ```
- 這里`@RequestParam("username")`和`@RequestParam("password")`分別用于獲取名為“username”和“password”的請(qǐng)求參數(shù),并將其綁定到對(duì)應(yīng)的方法參數(shù)上。
2- **參數(shù)非必需情況** - `@RequestParam`還可以處理參數(shù)不是必需的情況。你可以通過(guò)設(shè)置`required`屬性來(lái)指定參數(shù)是否必需。例如:
```java @RequestMapping("/search")
public String search(@RequestParam(name = "keyword", required = false) String keyword) {
????????if (keyword!= null) { // 進(jìn)行搜索邏輯 }
???????? return "searchResult";
} ```
- 在這個(gè)例子中,“keyword”參數(shù)不是必需的。如果前端沒(méi)有傳遞“keyword”參數(shù),`keyword`方法參數(shù)將為`null`。
3- **設(shè)置默認(rèn)值** - 當(dāng)參數(shù)不是必需且你希望在參數(shù)未傳遞時(shí)給方法參數(shù)賦予一個(gè)默認(rèn)值時(shí),可以使用`@RequestParam`的`defaultValue`屬性。
例如: ```java
@RequestMapping("/page")
public String showPage(@RequestParam(name = "pageNum", defaultValue = "1") int pageNum) {
???????? // 根據(jù)pageNum進(jìn)行分頁(yè)邏輯
????????return "pageContent"; }
```
- 這里如果前端沒(méi)有傳遞“pageNum”參數(shù),`pageNum`方法參數(shù)將默認(rèn)為`1`。
4- **綁定復(fù)雜類型列表或數(shù)組** - 除了單個(gè)參數(shù),`@RequestParam`還可以用于綁定列表或數(shù)組類型的參數(shù)。例如,當(dāng)你希望從前端獲取多個(gè)同名參數(shù)的值時(shí)(比如多選框的值): ```java
@RequestMapping("/select") public String selectOptions(@RequestParam("selectedOptions") List<String> selectedOptions) {
???????? // 處理選中的選項(xiàng)
????????return "selectionResult";
} ```
- 前端可能通過(guò)`?selectedOptions=option1&selectedOptions=option2`這種形式傳遞參數(shù),后端使用`@RequestParam`將這些同名參數(shù)值綁定到`List<String>`中。
?一個(gè)細(xì)節(jié)點(diǎn):
Array需要toString轉(zhuǎn)換為字符串 而 List不需要 是因?yàn)?#xff1a;
?1. **`String[]`數(shù)組的情況**
- 在Java中,`System.out.println()`方法沒(méi)有對(duì)數(shù)組類型進(jìn)行特殊的重載處理。當(dāng)直接傳遞一個(gè)數(shù)組給`System.out.println()`時(shí),它實(shí)際上是調(diào)用`Object`類的`toString()`方法。對(duì)于數(shù)組來(lái)說(shuō),`Object`類的`toString()`方法返回的是一個(gè)類似`[類型@哈希碼]`的字符串,這并不是我們想要的數(shù)組內(nèi)容的表示形式。
- 而`Arrays.toString()`方法是`java.util.Arrays`類提供的一個(gè)工具方法,它專門(mén)用于將數(shù)組轉(zhuǎn)換為一個(gè)包含數(shù)組元素的字符串,格式為`[元素1, 元素2,...]`。所以當(dāng)我們有一個(gè)`String[]`類型的參數(shù)時(shí),需要使用`Arrays.toString()`來(lái)將數(shù)組內(nèi)容以可讀的形式輸出。
2. **`List<String>`列表的情況** - 對(duì)于`List`類型,`java.util.List`繼承自`java.util.Collection`,而`Collection`類已經(jīng)重寫(xiě)了`toString()`方法。當(dāng)調(diào)用`System.out.println()`輸出一個(gè)`List`對(duì)象時(shí),實(shí)際上調(diào)用的是`List`類重寫(xiě)后的`toString()`方法。
- 重寫(xiě)后的`toString()`方法會(huì)按照`[元素1, 元素2,...]`的格式返回列表中的元素。所以,當(dāng)我們有一個(gè)`List<String>`類型的參數(shù)時(shí),可以直接將其傳遞給`System.out.println()`,就能得到列表內(nèi)容的可讀形式輸出。
?
5、日期參數(shù)
因?yàn)槿掌诘母袷蕉喾N多樣(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么對(duì)于日期類型的參數(shù)在進(jìn)行封裝的時(shí)候,需要通過(guò)@DateTimeFormat注解,以及其pattern屬性來(lái)設(shè)置日期的格式
?
?
?
?
?兩個(gè)細(xì)節(jié)點(diǎn):
1. **關(guān)于日期時(shí)間格式化模式中的大小寫(xiě)**
- 在`SimpleDateFormat`(用于格式化`java.util.Date`類型)以及相關(guān)的日期時(shí)間格式化模式中,`MM`和`HH`大寫(xiě)是有特定含義的,并且在`@DateTimeFormat`注解用于格式化`java.time.LocalDateTime`等類型時(shí)也遵循類似規(guī)則。
- `MM`用于表示月份,是月份的數(shù)字表示,范圍是`01 - 12`。如果寫(xiě)成`mm`,則表示分鐘,范圍是`00 - 59`。
- `HH`用于表示24小時(shí)制的小時(shí)數(shù),范圍是`00 - 23`。如果寫(xiě)成`hh`,則表示12小時(shí)制的小時(shí)數(shù),范圍是`01 - 12`。
所以,為了準(zhǔn)確表示你想要的日期時(shí)間格式部分,這些字母的大小寫(xiě)是很重要的。
2. **關(guān)于`LocalDateTime`輸出中的`T`**
- `LocalDateTime`是Java 8引入的日期時(shí)間類型,它遵循ISO 8601日期時(shí)間格式標(biāo)準(zhǔn)。在ISO 8601格式中,日期和時(shí)間部分是通過(guò)`T`來(lái)分隔的。
- 例如,`2024 - 12 - 08T15:25:05`表示2024年12月8日15時(shí)25分05秒。`T`只是一個(gè)標(biāo)準(zhǔn)的分隔符,用于清晰地區(qū)分日期部分(`yyyy - MM - dd`)和時(shí)間部分(`HH:mm:ss`)。當(dāng)你將`LocalDateTime`對(duì)象打印輸出或者序列化為字符串時(shí),就會(huì)按照這種標(biāo)準(zhǔn)格式來(lái)顯示,方便在不同系統(tǒng)和應(yīng)用之間進(jìn)行日期時(shí)間信息的統(tǒng)一表示和交換。
6、JSON參數(shù)
在前后端進(jìn)行交互時(shí),如果是比較復(fù)雜的參數(shù),前后端通過(guò)會(huì)使用JSON格式的數(shù)據(jù)進(jìn)行傳輸。 (JSON是開(kāi)發(fā)中最常用的前后端數(shù)據(jù)交互方式)
①、Postman在發(fā)送請(qǐng)求時(shí),如何傳遞json格式的請(qǐng)求參數(shù)
?
?②、在服務(wù)端的controller方法中,如何接收json格式的請(qǐng)求參數(shù)
服務(wù)端Controller方法接收J(rèn)SON格式數(shù)據(jù):
- 傳遞json格式的參數(shù),在Controller中會(huì)使用實(shí)體類進(jìn)行封裝。
- 封裝規(guī)則:JSON數(shù)據(jù)鍵名與形參對(duì)象屬性名相同,定義POJO類型形參即可接收參數(shù)。需要使用 @RequestBody標(biāo)識(shí)。
- @RequestBody注解:將JSON數(shù)據(jù)映射到形參的實(shí)體類對(duì)象中(JSON中的key和實(shí)體類中的屬性名保持一致)
?
requestbody注解
1. **處理HTTP請(qǐng)求體中的數(shù)據(jù)時(shí)使用`@RequestBody`**
- **接收J(rèn)SON數(shù)據(jù)**
- 在現(xiàn)代Web開(kāi)發(fā)中,當(dāng)客戶端(如前端應(yīng)用或者其他外部系統(tǒng))通過(guò)POST、PUT等請(qǐng)求方法發(fā)送JSON數(shù)據(jù)給后端服務(wù)時(shí),后端通常使用`@RequestBody`來(lái)接收和解析這些數(shù)據(jù)。例如,在一個(gè)基于Spring Boot的Web應(yīng)用中,有一個(gè)用戶注冊(cè)的功能。前端會(huì)收集用戶的姓名、年齡、郵箱等信息,并將這些信息組裝成一個(gè)JSON對(duì)象,像這樣:
```json { "name": "John Doe",
????????????????"age": 30,
????????????????"email": "johndoe@example.com" } ```
后端的Spring Boot控制器方法可以這樣接收數(shù)據(jù):
```java
@RequestMapping(value = "/register", method = RequestMethod.POST)
????????public String registerUser(@RequestBody User user) {
???????? // 將用戶信息保存到數(shù)據(jù)庫(kù)等操作
????????return "success"; }
``` 這里假設(shè)`User`是一個(gè)Java類,包含`name`、`age`、`email`等屬性。`@RequestBody`注解會(huì)自動(dòng)將JSON數(shù)據(jù)解析并綁定到`User`對(duì)象的相應(yīng)屬性上。
- **接收XML數(shù)據(jù)(雖然現(xiàn)在JSON更常用)**
- 如果客戶端發(fā)送XML格式的數(shù)據(jù),也可以使用`@RequestBody`來(lái)處理。例如,假設(shè)客戶端發(fā)送如下XML數(shù)據(jù)來(lái)表示一個(gè)訂單:
```xml
????????<order>
????????????????<productId>
????????????????????????123
????????????????</productId>
????????????????<quantity>
????????????????????????5
????????????????</quantity>
????????????????<customerName>
????????????????????????Alice
????????????????</customerName>
????????</order> ```
后端可以定義一個(gè)`Order`類來(lái)匹配XML數(shù)據(jù)的結(jié)構(gòu),并且在控制器方法中使用`@RequestBody`來(lái)接收: ```java
@RequestMapping(value = "/placeOrder", method = RequestMethod.POST)
public String placeOrder(@RequestBody Order order) {
????????// 處理訂單邏輯,如保存訂單到數(shù)據(jù)庫(kù)等
????????return "orderPlaced";
} ```
- **復(fù)雜數(shù)據(jù)類型傳輸**
- 當(dāng)需要傳輸復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如包含嵌套對(duì)象或者集合的對(duì)象時(shí),`@RequestBody`非常有用。例如,一個(gè)包含多個(gè)商品信息的購(gòu)物車對(duì)象,其中每個(gè)商品對(duì)象又包含商品名稱、價(jià)格、數(shù)量等信息。前端將購(gòu)物車數(shù)據(jù)以JSON格式發(fā)送: ```json
{
????????"cartId": "C001",
????????"items": [
???????????????? {
????????????????????????"productName": "Book",
????????????????????????"price": 20.0,
????????????????????????"quantity": 2
?????????????????},
????????????????{
????????????????????????"productName": "Pen",
???????????????????????? "price": 3.0,
? ? ? ? ? ? ? ? ? ? ? ? ?"quantity": 5
????????????????}
?????????????????????]
} ```
后端可以通過(guò)`@RequestBody`接收并解析這個(gè)復(fù)雜的購(gòu)物車對(duì)象: ```java @RequestMapping(value = "/checkout", method = RequestMethod.POST)
public String checkout(@RequestBody ShoppingCart cart) {
????????// 計(jì)算總價(jià)、處理庫(kù)存等結(jié)賬邏輯
????????return "checkoutSuccess";
} ```?
requestmapping注解:
@RequestMapping
注解的基本概念和用途
@RequestMapping
是 Spring MVC 中用于處理請(qǐng)求地址映射的注解。它可以用在類和方法級(jí)別上。
@RequestMapping
注解的屬性
value
屬性(或path
屬性,它們是等價(jià)的):用于指定請(qǐng)求路徑??梢允且粋€(gè)簡(jiǎn)單的字符串路徑,也可以是一個(gè)包含多個(gè)路徑的數(shù)組method
屬性:用于指定請(qǐng)求方法。除了RequestMethod.GET
和RequestMethod.POST
外,還可以指定RequestMethod.PUT
、RequestMethod.DELETE
、RequestMethod.HEAD
、RequestMethod.OPTIONS
等。consumes
屬性:用于指定請(qǐng)求的MIME
類型(媒體類型)。例如,consumes = "application/json"
表示該方法只處理JSON
格式的請(qǐng)求體。produces
屬性:用于指定響應(yīng)的MIME
類型。例如,produces = "application/json"
表示該方法返回的響應(yīng)是JSON
格式。
7、路徑參數(shù)
傳統(tǒng)的開(kāi)發(fā)中請(qǐng)求參數(shù)是放在請(qǐng)求體(POST請(qǐng)求)傳遞或跟在URL后面通過(guò)?key=value的形式傳遞(GET請(qǐng)求)
而在現(xiàn)在的開(kāi)發(fā)中,還是經(jīng)常會(huì)直接在請(qǐng)求的URL中傳遞參數(shù)。例如:
http://localhost:8080/user/1 ? ? ? ? ? ? ? ?
http://localhost:880/user/1/0
上述的這種傳遞請(qǐng)求參數(shù)的形式,就稱之為 路徑參數(shù)
①、傳遞單個(gè)參數(shù)
?
?
②、傳遞多個(gè)參數(shù)
和傳遞單個(gè)參數(shù)方法相同,無(wú)非就是多寫(xiě)一個(gè)形參和注解,需要注意的是:形參要和傳遞的參數(shù)相同才能接收成功
?
?
?8、相關(guān)代碼
RequestController.java
package com.example.demo.controller;import com.example.demo.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;@RestController
public class RequestController {/*@RequestMapping("/simpleParam")public String simpleParam(String name, int age) {System.out.println(name + " " + age);return "OK";}*///1 簡(jiǎn)單參數(shù)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name",required = false) String username, int age) {System.out.println(username + " " + age);return "OK";}//2 實(shí)體參數(shù) 簡(jiǎn)單實(shí)體參數(shù) 復(fù)雜實(shí)體參數(shù)@RequestMapping("/simplePojo")public String simplePojo(User user) {System.out.println(user);return "OK";}@RequestMapping("/complexPojo")public String complexPojo(User user) {System.out.println(user);return "OK";}//3 數(shù)組參數(shù) 集合參數(shù)@RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return "OK";}@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "OK";}//4 日期參數(shù)@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {System.out.println(updateTime);return "OK";}//5 json參數(shù)@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "OK";}//6 路徑參數(shù)@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id) {System.out.println(id);return "OK";}@RequestMapping("/path/{id}/{name}")public String pathParam(@PathVariable Integer id, @PathVariable String name) {System.out.println(id + " " + name);return "OK";}
}
二、響應(yīng)
1、@ResponseBody
在我們前面所編寫(xiě)的controller方法中,都已經(jīng)設(shè)置了響應(yīng)數(shù)據(jù),那controller方法中的return的結(jié)果,怎么就可以響應(yīng)給瀏覽器呢?
?
@RestController是兩個(gè)注解的組合,@RestController = @Controller + @ResponseBody?
?
2、統(tǒng)一響應(yīng)結(jié)果
大家有沒(méi)有發(fā)現(xiàn)一個(gè)問(wèn)題,我們?cè)谇懊嫠帉?xiě)的這些Controller方法中,返回值各種各樣,沒(méi)有任何的規(guī)范
?如果我們開(kāi)發(fā)一個(gè)大型項(xiàng)目,項(xiàng)目中controller方法將成千上萬(wàn),使用上述方式將造成整個(gè)項(xiàng)目難以維護(hù)。那在真實(shí)的項(xiàng)目開(kāi)發(fā)中是什么樣子的呢?
①、定義一個(gè)統(tǒng)一響應(yīng)結(jié)構(gòu)類 Result
在真實(shí)的項(xiàng)目開(kāi)發(fā)中,無(wú)論是哪種方法,我們都會(huì)定義一個(gè)統(tǒng)一的返回結(jié)果。方案如下:
> 前端:只需要按照統(tǒng)一格式的返回結(jié)果進(jìn)行解析(僅一種解析方案),就可以拿到數(shù)據(jù)
?定義在一個(gè)實(shí)體類Result來(lái)包含以上信息,代碼如下:
public class Result {
? ? private Integer code;//響應(yīng)碼,1 代表成功; 0 代表失敗
? ? private String msg; ?//響應(yīng)碼 描述字符串
? ? private Object data; //返回的數(shù)據(jù)
? ? public Result() { }
? ? public Result(Integer code, String msg, Object data) {
? ? ? ? this.code = code;
? ? ? ? this.msg = msg;
? ? ? ? this.data = data;
? ? }
? ? public Integer getCode() {
? ? ? ? return code;
? ? }
? ? public void setCode(Integer code) {
? ? ? ? this.code = code;
? ? }
? ? public String getMsg() {
? ? ? ? return msg;
? ? }
? ? public void setMsg(String msg) {
? ? ? ? this.msg = msg;
? ? }
? ? public Object getData() {
? ? ? ? return data;
? ? }
? ? public void setData(Object data) {
? ? ? ? this.data = data;
? ? }
? ? //增刪改 成功響應(yīng)(不需要給前端返回?cái)?shù)據(jù))
? ? public static Result success(){
? ? ? ? return new Result(1,"success",null);
? ? }
? ? //查詢 成功響應(yīng)(把查詢結(jié)果做為返回?cái)?shù)據(jù)響應(yīng)給前端)
? ? public static Result success(Object data){
? ? ? ? return new Result(1,"success",data);
? ? }
? ? //失敗響應(yīng)
? ? public static Result error(String msg){
? ? ? ? return new Result(0,msg,null);
? ? }
}
?效果展示: