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

