【Spring Boot 快速入門】二、請求與響應

目錄

  • 請求響應
    • 請求
      • Postman 工具
      • 簡單參數請求
      • 實體參數請求
      • 數組集合參數
      • 日期參數
      • JSON 參數
      • 路徑參數
    • 響應

請求響應

請求

Postman 工具

Postman 是一款功能強大的網頁調試與發送網頁 HTTP 請求的 Chrome 插件

作用:常用于進行接口測試

簡單參數請求

  1. 原始方式

    在原始的 Web 程序中,獲取請求參數,需要通過 HttpServletRequest 對象手動獲取(繁瑣,手動類型轉換)

    import jakarta.servlet.http.HttpServletRequest;
    import org.springframework.boot.autoconfigure.graphql.GraphQlProperties;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){// 獲取請求參數String name = request.getParameter("name");String ageStr = request.getParameter("age");int age = Integer.parseInt(ageStr);System.out.println("name:"+name+" age:"+age);return "success";}
    }
    

    用 GET 請求在 Postman 中輸入對應的 API 并設置參數,點擊發送

在這里插入圖片描述

后端服務器接收數據成功顯示“success”。

  1. Spring Boot 方式

    簡單參數:參數名與形參變量名相同,定義形參即可接收參數

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(String name, Integer age){// 獲取請求參數System.out.println("name:"+name+" age:"+age);return "success";}
    }
    

    用 POST 請求則是在 Postman 中輸入對應的 API,在響應體中設置參數,點擊發送

    在這里插入圖片描述

    后端服務器接收數據成功顯示“success”。

  2. 如果方法形參名稱與請求參數名稱不匹配,可以使用 @RequestParam 完成映射

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){// 獲取請求參數System.out.println("name:"+username+" age:"+age);return "success";}
    }
    

    注意:用 @RequestParam 映射的參數必須傳遞,不傳遞則會報錯,因為參數的 required 屬性默認是 true

    public String simpleParam(@RequestParam(name="name", required=true)String username, Integer age)
    

    如果將 true 改為 false,不傳遞也不會報錯

實體參數請求

  1. 簡單實體對象:請求參數名與形參對象屬性名相同,定義 POJO 接收即可
    假設前端傳遞 name 和 age 兩個參數,則實體類可以定義為:

    public class User {private String name;private Integer age;public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
    }
    

    請求參數的方法為:

    @RequestMapping("/simplePojo")
    public String simplePojo(User user){// 獲取請求參數System.out.println(user);return "success";
    }
    
  2. 復雜實體對象:請求參數名與形參對象屬性名相同,按照對象層次結構關系即可接收嵌套 POJO 屬性參數

    有個實體類 User 定義如下

    public class User {private String name;private Integer age;private Address address;
    }
    

    其中嵌套著另一個實體類 Address,定義如下:

    public class Address {private String province;private String city;
    }
    

    如果說要傳遞值,則為 address.province=guangdongaddress.city=guangzhou

    在這里插入圖片描述

數組集合參數

  1. 數組參數:請求參數名與形參數組名稱相同且請求參數為多個,定義數組類型形參即可接收參數

    請求數組參數方法為:

    @RequestMapping("/arrayParam")
    public String arrayParam(String[] names){// 獲取請求參數System.out.println(Arrays.toString(names));return "success";
    }
    

    傳遞參數時只需要一個一個傳就可以了

    在這里插入圖片描述

    控制臺獲取到數組參數

    在這里插入圖片描述

  2. 集合參數:請求參數名與形參集合名稱相同且請求參數為多個,用 @RequestParam 綁定參數關系

    請求集合參數的方法為

    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> names){// 獲取請求參數System.out.println(names);return "success";
    }
    

    傳遞參數與數組參數一樣

    在這里插入圖片描述

日期參數

  1. 日期參數:使用 @DateTimeFormat 注解完成日期參數格式轉換

    請求參數的方法為:

    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){// 獲取請求參數System.out.println(updateTime);return "success";
    }
    

    注意:如果月份是個位數,要在前面加 0 才能成功傳遞參數

    在這里插入圖片描述

JSON 參數

JSON 參數:JSON 數據鍵名與形參對象屬性名相同,定義 POJO 類型形參即可接收參數,需要使用 @RequestBody 標識

請求參數的方法為:

@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){// 獲取請求參數System.out.println(user);return "success";
}

傳遞參數給后端要按照 JSON 格式,并且實體類中的變量名要與請求參數 JSON 中的一致

在這里插入圖片描述

路徑參數

路徑參數:通過請求 URL 直接傳遞參數,使用 {…} 來標識該路徑參數,需要使用 @PathVariable 獲取路徑參數

@RequestMapping("/path/{id}") // path后面的id不能寫死,應該動態的獲取
public String pathParam(@PathVariable Integer id){// 獲取請求參數System.out.println(id);return "success";
}

傳遞參數的時候就不用設置參數值了,直接填寫 URL 即可

在這里插入圖片描述

如果要用多個路徑參數,只需在前一個后面加上”/參數名“即可

@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id, @PathVariable String name){// 獲取請求參數System.out.println(id + " " + name);return "success";
}

響應

服務端在方法或者類上添加 @ResponseBody 來以 JSON 格式響應返回結果

關于服務端的響應部分其實在請求部分就有涉及,每當請求發送成功后,服務端都會返回一個“success”,但是在之前的代碼中并沒有 @ResponseBody 注解,這是因為 @RestController = @Controller + @ResponseBody,也就是說用只需添加 @RestController 即可。

由于返回的數據類型不同,響應格式也有差異

@RestController
public class HelloController {@RequestMapping("/hello")public String hello() {return "Hello World~";}@RequestMapping("/getAddress")public Address getAddress() {Address ad = new Address();ad.setProvince("廣東");ad.setCity("深圳");return ad;}@RequestMapping("/getAddresses")public List<Address> getAddresses() {List<Address> list = new ArrayList<>();Address ad = new Address();ad.setProvince("廣東");ad.setCity("深圳");Address ad2 = new Address();ad2.setProvince("廣西");ad2.setCity("桂林");list.add(ad);list.add(ad2);return list;}
}

響應的格式有字符串、JSON 格式、JSON格式的數組

在這里插入圖片描述

這樣響應的格式不規范,不便管理和維護,所以要創建一個響應結果封裝類來統一響應結果

/*
* 統一響應結果封裝類
*/
public class Result {private Integer code; // 狀態碼,200為成功,500為失敗private String message; // 返回消息private Object data; // 返回數據public Result(Integer code, String message, Object data) {this.code = code;this.message = message;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static Result success(Object data) {return new Result(200, "success", data);}public static Result success() {return new Result(200, "success", null);}public static Result error(String message) {return new Result(500, message, null);}@Overridepublic String toString() {return "Result{" +"code=" + code +", message='" + message + '\'' +", data=" + data +'}';}
}

將原來的方法改為:

@RestController
public class HelloController {@RequestMapping("/hello")public Result hello() {return Result.success("hello world");}@RequestMapping("/getAddress")public Result getAddress() {Address ad = new Address();ad.setProvince("廣東");ad.setCity("深圳");return Result.success(ad);}@RequestMapping("/getAddresses")public Result getAddresses() {List<Address> list = new ArrayList<>();Address ad = new Address();ad.setProvince("廣東");ad.setCity("深圳");Address ad2 = new Address();ad2.setProvince("廣西");ad2.setCity("桂林");list.add(ad);list.add(ad2);return Result.success(list);}
}

如此一來,響應格式就全部統一了
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91014.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高并發系統技術架構

&#xff08;點個贊&#xff0c;算法會給你推薦更多類似干貨 ~&#xff09; 口訣&#xff1a; CDN 扛靜態&#xff0c;WAF 防惡意&#xff1b;驗證碼攔機器&#xff1b; Nginx 先限流&#xff0c;Sentinel 再熔斷&#xff1b; Redis 扣庫存&#xff0c;MQ 異步寫&#xff1b; 對…

python任意模塊間采用全局字典來實現借用其他類對象的方法函數來完成任務或數據通信的功能

我們在編寫pthon代碼時&#xff0c;模塊間的數據通信主要采用以下幾種方法&#xff1a;1、采用全局變量。所有模塊都通過引用全局變量&#xff0c;通過本模塊對此全局變量數據的修改值&#xff0c;其他模塊也能訪問并得到此全局變量的當前值&#xff0c;由于全局變量的不可控性…

linux 部署 flink 1.15.1 并提交作業

下載 1.15.1 https://flink.apache.org/downloads.html#apache-flink-1151 部署模式分類 會話模式應用模式單作業模式 1、會話模式 先啟動一個集群&#xff0c;保持一個會話&#xff0c;然后通過客戶端提交作業&#xff0c;所有作業都在一個會話執行&#xff1b; 會話模式適合規…

Redis數據量過大的隱患:查詢會變慢嗎?如何避免?

一、Redis數據過多引發的五大隱患&#xff08;附系統交互圖&#xff09; #mermaid-svg-X83bpHUu830QXKUt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-X83bpHUu830QXKUt .error-icon{fill:#552222;}#mermaid-svg-…

網絡與信息安全有哪些崗位:(3)安全運維工程師

安全運維工程師是企業安全防線的 “日常守護者”&#xff0c;既要確保安全設備與系統的穩定運行&#xff0c;又要實時監控潛在威脅&#xff0c;快速響應并處置安全事件&#xff0c;是連接安全技術與業務運營的關鍵角色。其核心價值在于通過常態化運維&#xff0c;將安全風險控制…

魚皮項目簡易版 RPC 框架開發(三)

本文為筆者閱讀魚皮的項目 《簡易版 RPC 框架開發》的筆記&#xff0c;如果有時間可以直接去看原文&#xff0c; 1. 簡易版 RPC 框架開發 前面的內容可以筆者的前面兩個篇筆記 魚皮項目簡易版 RPC 框架開發&#xff08;一&#xff09; 魚皮項目簡易版 RPC 框架開發&#xff08;…

嵌入式Linux:注冊線程清理處理函數

在 Linux 多線程編程中&#xff0c;線程終止時可以執行特定的清理操作&#xff0c;通過注冊線程清理函數&#xff08;thread cleanup handler&#xff09;來實現。這類似于使用 atexit() 注冊進程終止處理函數。線程清理函數用于在線程退出時執行一些資源釋放或清理工作&#x…

【Git】Linux-ubuntu 22.04 初步認識 -> 安裝 -> 基礎操作

文章目錄Git 初識Git 安裝Linux-centosLinux-ubuntuWindowsGit 基本操作配置 Git認識工作區、暫存區、版本庫添加文件 -- 場景一查看 .git 文件添加文件 -- 場景二修改文件版本回退撤銷修改情況一&#xff1a;對于工作區的代碼&#xff0c;還沒有 add情況二&#xff1a;已經 ad…

輕量級音樂元數據編輯器Metadata Remote

簡介 什么是 Metadata Remote (mdrm) &#xff1f; Metadata Remote 是一個基于 Web 的音頻元數據編輯工具&#xff0c;旨在簡化在無頭服務器&#xff08;即沒有圖形用戶界面的服務器&#xff09;上編輯音頻文件的元數據。用戶只需使用 Docker 和瀏覽器&#xff0c;無需復雜的…

免費使用|共享服務器上線RTX3080(20GB顯存)

共享服務器也上架GPU啦 生物信息學中有很多用到GPU的場景&#xff0c;例如我們分享過的&#xff1a;利用GPU加速TensorFlow、部署本地DeepSeek&#xff0c;空間轉錄組學習手冊合輯加速。因此多種GPU供大家選擇&#xff1a;RTX5090、4080S、5070顯卡上機。為了讓此前的CPU服務器…

搭建DM數據守護集群

1環境與規劃準備3個kylin 10操作系統的虛擬機&#xff0c;規劃IP、端口、安裝目錄等。說明搭建REALTIME歸檔模式、事務一致性的數據守護名稱項初始主庫機器dm1初始備庫機器dm2監視器機器dmmon外部業務IP192.168.23.129192.168.23.130192.168.23.131內部心跳IP192.168.23.129192…

AUTOSAR進階圖解==>AUTOSAR_SRS_OCUDriver

AUTOSAR OCU驅動程序詳解 AUTOSAR標準輸出比較單元驅動程序架構與實現分析目錄 1. 概述 1.1 OCU驅動程序簡介1.2 功能概述 2. OCU驅動程序架構 2.1 架構圖2.2 層次結構 3. OCU驅動程序組件設計 3.1 組件圖3.2 接口定義 4. OCU驅動程序狀態管理 4.1 狀態圖4.2 狀態轉換 5. OCU驅…

InfluxDB 與 HTTP 協議交互進階(一)

引言 在當今數字化時代&#xff0c;數據處理的高效性和準確性成為了眾多領域關注的焦點。InfluxDB 作為一款開源的時序數據庫&#xff0c;憑借其高性能、易擴展等特性&#xff0c;在時間序列數據處理中占據了重要地位。而 HTTP 協議作為互聯網應用層的核心協議之一&#xff0c…

NAS遠程訪問新解法:OMV與cpolar的技術協同價值

文章目錄前言1. OMV安裝Cpolar2. 配置FTP公網地址3. OMV FTP 配置4. OMV FTP遠程連接前言 當家庭存儲需求突破本地邊界時&#xff0c;傳統NAS方案往往陷入"連接困境"&#xff1a;復雜的端口轉發配置、高昂的公網IP成本、以及始終存在的安全顧慮…開源解決方案OMV雖然…

vue 渲染 | 不同類型的元素渲染的方式(vue組件/htmlelement/純 html)

省流總結&#xff1a;&#xff08;具體實現見下方&#xff09; vue 組件 ——》<component :is組件名> htmlelement 元素 ——》 ref 、★ v-for ref 或是 ★ vue 的 nextTick 純 html 結構——》v-html 另外&#xff0c;當數據異步加載時&#xff0c;vue3中如何渲…

Charles中文版深度解析,輕松調試API與優化網絡請求

在現代軟件開發過程中&#xff0c;調試API、捕獲HTTP/HTTPS流量以及優化網絡性能是開發者不可避免的挑戰。特別是在處理復雜的網絡請求和驗證API接口的數據傳輸準確性時&#xff0c;開發者需要一款強大且易于使用的工具。Charles抓包工具憑借其功能強大、界面簡潔、易于操作的特…

【CF】Codeforces Round 1039 (Div. 2) E1 (二分答案求中位數)

E1. Submedians (Easy Version)題目&#xff1a;思路&#xff1a;經典不過加了點東西對于求中位數&#xff0c;我們必然要想到二分答案&#xff0c;具體的&#xff0c;對于所有大于等于 x 的數我們令其奉獻為 1&#xff0c;小于的為 -1&#xff0c;如果存在某段區間的奉獻和大于…

ESP32-S3學習筆記<8>:LEDC的應用

ESP32-S3學習筆記&#xff1c;8&#xff1e;&#xff1a;LEDC的應用1. 頭文件包含2. LEDC的配置2.1 配置定時器2.1.1 speed_mode/設置速度模式2.1.2 duty_resolution/設置占空比分辨率2.1.3 timer_num/選擇定時器2.1.4 freq_hz/設定PWM頻率2.1.5 clk_cfg/選擇LEDC的外設時鐘源2…

網絡安全第14集

前言&#xff1a;小迪安全14集&#xff0c;這集重點內容&#xff1a;0、什么是js滲透測試&#xff1f;在javascript中也存在變量和函數&#xff0c;存在可控變量和函數就有可能存在在漏洞&#xff0c;js開發的web應用和php、java開發的區別是&#xff0c;js能看得到的源代碼&am…

代碼隨想錄算法訓練營第三十三天

LeetCode.62 不同路徑 題目鏈接 不同路徑 題解 class Solution {public int uniquePaths(int m, int n) {// dp表示到達ij有多少條路徑int[][] dp new int[110][110];dp[1][1] 1;for(int i 0;i<m;i){dp[i][0] 1;}for(int j 0;j<n;j){dp[0][j] 1;}for(int i 1;i…