0.SpringMVC中參數(shù)解析原理
1.入?yún)⒊鰠㈩愋拖薅?/h1>
(此處以入?yún)⒊鰠閖son類型為例)圖片.png
圖片.png
2.入?yún)⑹莏son類型,但是參數(shù)個數(shù)不確定
2.1方法一:
@PostMapping("/master")
public List<Stu> master(@RequestBody Map<String, Object> map){
System.out.println(map);
return stuService.hello();
}
postman訪問,入?yún)⑹纠?圖片.png
打印的結(jié)果示例:
{first_name=Douglas, last_name=Fir, age=35, about=I like to build cabinets, interests=forestry}
2.2方法二:
@PostMapping("/master")
public List<Stu> master(@RequestBody String params){
Map<String, String> map = JSON.parseObject(params, Map.class);
Set<String> keys = map.keySet();
for (String key : keys){
System.out.println(key + "=============" + map.get(key));
}
return stuService.hello();
}
postman與上述2.1調(diào)用相同時,打印結(jié)果示例:
about=============I like to build cabinets
last_name=============Fir
interests=============forestry
first_name=============Douglas
age=============35
3.springMVC實現(xiàn)路徑的模糊匹配
奋隶?: 匹配一個字符
* : 匹配任意字符
**: 匹配多層路徑
3.1下述可以匹配的規(guī)則如:
http://localhost:8081/hello/tom/20/a/b/c/d/e/f
@RequestMapping(path = "/hello/{name}/{age}/**")
@ResponseBody
public Object hello(@PathVariable("name") String name,
@PathVariable("age") Integer age,
HttpServletRequest request){
return request.getRequestURL();
}
3.2下述可以匹配的url為:
http://localhost:8081/world/abc
@RequestMapping(path = "/world/{zzz:.*}")
@ResponseBody
public Object world(HttpServletRequest request){
return request.getRequestURL();
}
3.3采用代理模式修改RestTemplate
@AllArgsConstructor
public abstract class FilterRestTemplate implements RestOperations {
@Delegate // lombok的注解
protected volatile RestTemplate restTemplate;
}
4.常見問題
4.1編解碼問題
服務(wù)端
controller層.png
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello</title>
<script type="text/javascript" src="../res/js/jquery-3.4.1.js"></script>
</head>
<body>
<div>
<form id="addAddress">
<input type="text" name="province" id="province">
<input type="text" name="addName" id="addName">
<input type="button" value="submit" id="submit"><br>
</form>
</div>
</body>
<script>
// 先引入 jquery
$("#submit").click(function () {
let str = {"province": $("#province").val(), "addName": $("#addName").val()};
$.ajax({
url: "http://localhost:8091/api/addAddress",
type: 'POST',
data: JSON.stringify(str),
contentType: "application/json",
success: function (msg) {
console.log("msg-->" + msg);
},
error: function (msg) {
console.log("msg-->" + msg);
}
})
})
</script>
</html>
http://www.reibang.com/p/53b5bd0f1d44 (兩種POST格式)
5.常用注解
package com.zy.spring.controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@RestController
public class HiController {
@RequestMapping("/pathVariable/{orderNo}/{orderMoney}")
public void pathVariable(@PathVariable("orderNo") String orderNo, @PathVariable("orderMoney") String orderMoney, HttpServletRequest request) {
System.out.println(orderNo);
System.out.println(orderMoney);
}
/**
* 表示這個參數(shù)是通過前端傳遞過來的,如果請求里沒有這個參數(shù)晌纫,則會報錯400 Bad Request劲件。
* 這個注解用來解析請求路徑里的參數(shù)(get請求)或者post請求中form表單格式的請求參數(shù)嗓化。
* 用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內(nèi)容。
* @param orderNo
* @param request
*/
@RequestMapping("/requestParam")
public void requestParam(@RequestParam("orderNo") String orderNo, HttpServletRequest request) {
System.out.println(orderNo);
}
/**
* 用來接收POST請求BODY里的參數(shù),格式為JSON格式于毙。
* 用來處理Content-Type: 為 application/json皮迟、application/xml等格式的數(shù)據(jù)宪卿。
* @param maps
* @param request
*/
@RequestMapping("/requestBody")
public void requestBody(@RequestBody Map<String, String> maps, HttpServletRequest request) {
System.out.println(maps);
}
@RequestMapping("/requestHeader")
public void requestHeader(@RequestHeader Map<String, String> maps, HttpServletRequest request) {
System.out.println(maps);
}
/**
* @RequestAttribute 注解的參數(shù)在項目里是自己解析出來的,并不是前端傳遞的万栅。
* 具體一點佑钾,在項目里的攔截器里會對Token信息進行解析,解析出來的參數(shù)重新放在請求里,
* (用httpServletRequest.setAttribute(name, value))烦粒,后邊接口接收參數(shù)時就用這個注解休溶。
* @param attr1
* @param request
*/
@RequestMapping("/requestAttribute")
public void requestAttribute(@RequestAttribute(value = "attr1") String attr1, HttpServletRequest request) {
System.out.println(attr1);
}
/**
* 在 header 中的 cookie 中設(shè)置
* @param authToken
* @param request
*/
@RequestMapping("/cookieValue")
public void cookieValue(@CookieValue(value = "authToken") String authToken, HttpServletRequest request) {
System.out.println(authToken);
}
}
參考資源
https://www.cnblogs.com/007tangtao/p/9251861.html?utm_source=debugrun&utm_medium=referral