Spring?MVC??接受請(qǐng)求參數(shù)的方法
一、HTTP 請(qǐng)求 如何攜帶參數(shù)
在HTTP請(qǐng)求中攜帶參數(shù)的方式取決于你使用的請(qǐng)求方法。常見的HTTP方法有GET和POST,參數(shù)傳遞的方式也有所不同:
1. GET 方法
GET方法通常用于請(qǐng)求服務(wù)器發(fā)送資源,參數(shù)直接附加在URL之后,通過(guò)?
分隔URL和參數(shù),多個(gè)參數(shù)之間用&
連接。例如:
GET /search?query=網(wǎng)絡(luò)安全&sort=latest HTTP/1.1 Host: www.example.com
這里,URL是/search
,參數(shù)有兩個(gè):
query=網(wǎng)絡(luò)安全
sort=latest
2. POST 方法
POST方法通常用于提交數(shù)據(jù)到服務(wù)器。與GET方法不同,POST方法通常將參數(shù)包含在請(qǐng)求體中,不顯示在URL中(但是普通的參數(shù)也可以出現(xiàn)在URL中)。只有form 表單在post 請(qǐng)求中固定在 body、get 出現(xiàn)在url 中。這樣可以發(fā)送更大的數(shù)據(jù)量,也更安全。參數(shù)可以以不同的格式發(fā)送,常見的有:
表單數(shù)據(jù)(application/x-www-form-urlencoded
)
數(shù)據(jù)以鍵值對(duì)形式發(fā)送,鍵值對(duì)之間用&
分隔,鍵和值之間用=
連接,類似于URL查詢字符串。例如:
POST /submit HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 27 username=alice&password=1234
JSON數(shù)據(jù)(application/json
)
數(shù)據(jù)以JSON格式發(fā)送,適用于復(fù)雜結(jié)構(gòu)的數(shù)據(jù)交換。例如:
POST /api/data HTTP/1.1 Host: www.example.com Content-Type: application/json Content-Length: 47 {"username": "alice", "password": "1234"}
雖然GET和POST是最常見的,但HTTP協(xié)議還支持其他方法,如PUT、DELETE等,這些方法也可以攜帶參數(shù),通常是在請(qǐng)求體中,格式可以是表單數(shù)據(jù)、JSON或其他MIME類型。
小技巧
- 使用GET方法時(shí),由于URL長(zhǎng)度存在限制,不適合傳輸大量信息。
- 使用POST方法時(shí),可通過(guò)適當(dāng)?shù)?code>Content-Type頭部來(lái)控制數(shù)據(jù)的編碼方式。
二、Spring MVC 接受參數(shù)
在 Spring MVC 中,處理來(lái)自客戶端的參數(shù)有幾種常用的方式。Spring MVC 提供了靈活的方式來(lái)接收來(lái)自 HTTP 請(qǐng)求的參數(shù),并將其綁定到控制器方法的參數(shù)中。這些方法包括使用注解如 @RequestParam
, @PathVariable
, @RequestBody
, 和 @ModelAttribute
等。下面是這些注解的基本使用方法:
1. 使用 @RequestParam
這個(gè)注解用于處理來(lái)自查詢字符串或表單數(shù)據(jù)的參數(shù)。例如,對(duì)于一個(gè) GET 請(qǐng)求,你可以這樣使用:
@GetMapping("/search") public String search(@RequestParam("query") String query) { // 使用 query 參數(shù) return "Result for: " + query; }
如果你的參數(shù)名和方法的參數(shù)名相同,你還可以省略 @RequestParam
中的值:
@GetMapping("/search") public String search(@RequestParam String query) { return "Result for: " + query; }
如果參數(shù)?較多時(shí), ?法聲明就需要有很多形參. 并且后續(xù)每次新增?個(gè)參數(shù), 也需要修改?法聲明. 我們不妨把這些參數(shù)封裝為?個(gè)對(duì)象.
@Data public class Person { private int id; private String name; private String password; } @RequestMapping("/m3") public Object method3(Person p){ return p.toString(); }
2. 使用 @PathVariable
用于處理 REST 風(fēng)格的 URL 中的參數(shù),如:
@GetMapping("/users/{userId}") public String getUser(@PathVariable("userId") Long userId) { // 使用 userId 參數(shù) return "User profile for ID: " + userId; }
如果變量名和參數(shù)名相同,也可以省略:
@GetMapping("/users/{userId}") public String getUser(@PathVariable Long userId) { return "User profile for ID: " + userId; }
3. 使用 @RequestBody
這個(gè)注解用于處理 JSON 或 XML 等請(qǐng)求體數(shù)據(jù)。通常與 POST 或 PUT 請(qǐng)求一起使用:
@PostMapping("/users") public String addUser(@RequestBody User user) { // 處理 user 對(duì)象 return "Added user with ID: " + user.getId(); }
4. 使用 @ModelAttribute
用于綁定請(qǐng)求參數(shù)到一個(gè)模型對(duì)象,通常用于處理表單提交:
@PostMapping("/users/update") public String updateUser(@ModelAttribute User user) { // 更新 user 對(duì)象 return "Updated user with ID: " + user.getId(); }
5.傳遞數(shù)組和集合
Spring MVC 可以?動(dòng)綁定數(shù)組參數(shù)的賦值
@RequestMapping("/m5") public String method5(String[] arrayParam) { return Arrays.toString(arrayParam); }
集合參數(shù):和數(shù)組類似, 同?個(gè)請(qǐng)求參數(shù)名有為多個(gè), 且需要使? @RequestParam 綁定參數(shù)關(guān)系 默認(rèn)情況下,請(qǐng)求中參數(shù)名相同的多個(gè)值,是封裝到數(shù)組. 如果要封裝到集合,要使? @RequestParam 綁定參數(shù)關(guān)系
6.接受String 轉(zhuǎn)成 Json
Jackson 是在 Spring 框架中常用的 JSON 處理庫(kù)。要使用 Jackson 進(jìn)行 JSON 與字符串的互轉(zhuǎn),首先需要在你的項(xiàng)目中添加 Jackson 的依賴。如果你使用 Maven,可以添加如下依賴到你的 pom.xml
文件:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency>
在 Spring MVC 中,直接使用字符串來(lái)接收參數(shù)后再手動(dòng)處理確實(shí)是一種可行的方法,尤其是在某些情況下,你可能想對(duì)接收到的數(shù)據(jù)進(jìn)行特殊處理,或者原始數(shù)據(jù)格式與你的業(yè)務(wù)邏輯需求不完全匹配時(shí)。這種方式提供了更大的靈活性,允許你在將數(shù)據(jù)轉(zhuǎn)換成 Java 對(duì)象之前,先進(jìn)行驗(yàn)證、清洗或者格式化。
import com.fasterxml.jackson.databind.ObjectMapper; public class JsonUtil { public static String toJson(Object obj) throws Exception { ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(obj); } } // 使用 Person person = new Person("Alice", 30); String jsonString = JsonUtil.toJson(person); System.out.println(jsonString);
例如,如果你希望接收一個(gè) JSON 格式的請(qǐng)求體,但暫時(shí)不想將其自動(dòng)綁定到一個(gè) Java 對(duì)象,你可以將請(qǐng)求體作為一個(gè)普通的字符串接收:
@PostMapping("/api/data") public ResponseEntity<String> processData(@RequestBody String rawData) { try { // 手動(dòng)解析 JSON 字符串 ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(rawData); // 假設(shè)我們需要處理 name 字段 String name = rootNode.path("name").asText(); // 進(jìn)行業(yè)務(wù)邏輯處理 return ResponseEntity.ok("Received name: " + name); } catch (JsonProcessingException e) { return ResponseEntity.badRequest().body("Invalid JSON"); } }
三、常見問題
在 Spring MVC 中,當(dāng)你使用基本數(shù)據(jù)類型(如 int
, double
, boolean
等)作為方法參數(shù)時(shí),確實(shí)可能遇到一些問題,尤其是涉及到參數(shù)可能不存在或可選的情況。這是因?yàn)榛緮?shù)據(jù)類型不能接受 null
值,而包裝類(如 Integer
, Double
, Boolean
等)可以接受 null
值。
假設(shè)你有一個(gè)使用基本數(shù)據(jù)類型參數(shù)的方法:
@GetMapping("/calculate") public String calculate(@RequestParam("number") int number) { // 使用 number 參數(shù) return "Result: " + number * 2; }
如果 HTTP 請(qǐng)求沒有提供 number
參數(shù),Spring MVC 將嘗試將 null
轉(zhuǎn)換為基本類型 int
,這將失敗并引發(fā)一個(gè)異常,因?yàn)榛绢愋筒荒芙邮?null
值。
解決方案
1.使用包裝類
更改參數(shù)為相應(yīng)的包裝類可以解決這個(gè)問題,因?yàn)榘b類可以接受 null
值:
@GetMapping("/calculate") public String calculate(@RequestParam("number") Integer number) { if (number == null) { return "Number parameter is missing"; } return "Result: " + number * 2; }
2.設(shè)置默認(rèn)值
另一個(gè)常用的解決方案是為 @RequestParam
設(shè)置一個(gè)默認(rèn)值,這樣如果請(qǐng)求中沒有提供該參數(shù),將使用默認(rèn)值:
@GetMapping("/calculate") public String calculate(@RequestParam(value = "number", defaultValue = "0") int number) { // 無(wú)需檢查 null,因?yàn)橐呀?jīng)有默認(rèn)值 return "Result: " + number * 2; }
在這個(gè)例子中,如果沒有提供 number
參數(shù),number
將默認(rèn)為 0
。
3.設(shè)置 required 為 false
你也可以將 @RequestParam
的 required
屬性設(shè)置為 false
,并使用包裝類來(lái)明確表明這個(gè)參數(shù)是可選的:
@GetMapping("/calculate") public String calculate(@RequestParam(value = "number", required = false) Integer number) { if (number == null) { return "Number parameter is optional"; } return "Result: " + number * 2; }
到此這篇關(guān)于Spring MVC 接受請(qǐng)求參數(shù)的文章就介紹到這了,更多相關(guān)Spring MVC 請(qǐng)求參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springmvc接口接收參數(shù)與請(qǐng)求參數(shù)格式的整理
- SpringMVC解析post請(qǐng)求參數(shù)詳解
- 使用SpringMVC 重寫、擴(kuò)展HttpServletRequest請(qǐng)求參數(shù)
- SpringMvc接受請(qǐng)求參數(shù)的幾種情況演示
- 詳解在Spring MVC或Spring Boot中使用Filter打印請(qǐng)求參數(shù)問題
- Spring MVC請(qǐng)求參數(shù)與響應(yīng)結(jié)果全局加密和解密詳解
- 快速解決SpringMVC @RequestBody 用map接收請(qǐng)求參數(shù)的問題
- 學(xué)習(xí)SpringMVC——如何獲取請(qǐng)求參數(shù)詳解
相關(guān)文章
Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常
這篇文章主要介紹了Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常,@ControllerAdvice ,@ControllerAdvice是一個(gè)非常有用的注解,顧名思義,這是一個(gè)增強(qiáng)的 Controller,一般配合@ExceptionHandler使用來(lái)處理全局異常,需要的朋友可以參考下2024-01-01Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫數(shù)字識(shí)別的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫數(shù)字識(shí)別的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01淺談js文件引用方式及其同步執(zhí)行與異步執(zhí)行
下面小編就為大家?guī)?lái)一篇淺談js文件引用方式及其同步執(zhí)行與異步執(zhí)行。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10詳解IDEA JUnit5測(cè)試套件運(yùn)行錯(cuò)誤的問題
這篇文章主要介紹了詳解IDEA JUnit5測(cè)試套件運(yùn)行錯(cuò)誤的問題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java編程實(shí)現(xiàn)對(duì)象克隆(復(fù)制)代碼詳解
這篇文章主要介紹了Java編程實(shí)現(xiàn)對(duì)象克?。◤?fù)制)代碼詳解,涉及了克隆的原因,如何實(shí)現(xiàn)克隆,克隆的一般步驟,深克隆與淺克隆的介紹等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11Springboot打包為Docker鏡像并部署的實(shí)現(xiàn)
這篇文章主要介紹了Springboot打包為Docker鏡像并部署的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12java Quartz定時(shí)器任務(wù)與Spring task定時(shí)的幾種實(shí)現(xiàn)方法
本篇文章主要介紹了java Quartz定時(shí)器任務(wù)與Spring task定時(shí)的幾種實(shí)現(xiàn)方法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02