SpringBoot中Controller接口參數(shù)還可以這樣玩?
環(huán)境:SpringBoot3.2.5
1. Optional包裝參數(shù)
請(qǐng)求參數(shù)通過(guò)java.util.Optional包裝
@GetMapping("/optional")
public Object optional(Optional<String> name) {
return String.format("請(qǐng)求參數(shù): %s", name.orElse("")) ;
}
通過(guò)Optional接受參數(shù),效果等同于
public Object optional(@RequestParam(required=false) String name){}
與將required設(shè)置為false效果一樣(@RequestHeader同樣)
2. 便捷獲取Servlet API
在請(qǐng)求參數(shù)中你可以使用WebRequest, NativeWebRequest兩個(gè)任意對(duì)象來(lái)獲取Request,Response,Session等對(duì)象。
@GetMapping("/servlet/api")
public Object servletApi(WebRequest request, NativeWebRequest webRequest) {
String name = request.getParameter("name") ;
// 獲取Servlet API
HttpServletRequest req = webRequest.getNativeRequest(HttpServletRequest.class) ;
HttpServletResponse resp = webRequest.getNativeResponse(HttpServletResponse.class) ;
HttpSession session = webRequest.getNativeRequest(HttpSession.class) ;
return "servlet api" ;
}
當(dāng)然你可以直接寫(xiě)你需要的具體對(duì)象
public Object servletApi(HttpServletRequest req,
HttpServletResponse resp) {
// ...
}
NativeWebRequest本身提供了很多通用的方法,并且還可以獲取其它對(duì)象,使用起來(lái)更加方便。
3. 獲取當(dāng)前認(rèn)證用戶(hù)
你的請(qǐng)求參數(shù)還可以使用java.security.Principal該對(duì)象用來(lái)獲取當(dāng)前請(qǐng)求中已經(jīng)認(rèn)證過(guò)的用戶(hù)信息。這尤其在使用Spring Security時(shí)非常有用,在Security中的Authentication接口實(shí)現(xiàn)了Principal。
@GetMapping("/principal")
public Object principal(Principal principal) {
return principal ;
}
輸出如下:
圖片
4. 獲取請(qǐng)求其它信息
你還可以非常方便的獲取當(dāng)前請(qǐng)求Method及Locale等信息。
@GetMapping("/other")
public Object other(HttpMethod method, Locale locale) {
return method.name() + ", " + locale.toString() ;
}
// 輸出
GET, zh_CN
除此之外,你還可以獲取時(shí)區(qū)信息java.util.TimeZone, java.time.ZoneId。
5. 讀取輸入流
將請(qǐng)求body中的內(nèi)容以流InputStream形式獲取。
@PostMapping("/inputStream")
public Object inputStream(InputStream is) throws Exception {
return String.format("讀取到內(nèi)容: %s",
StreamUtils.copyToString(is, StandardCharsets.UTF_8)) ;
}
輸出結(jié)果:
圖片
6. 獲取Header&Body
通過(guò)HttpEntity獲取請(qǐng)求header及body內(nèi)容信息;
@PostMapping("/httpentity")
public Object httpentity(HttpEntity<String> entity) {
return Map.of(
"headers", entity.getHeaders(),
"body", entity.getBody()
) ;
}
輸出結(jié)果:
圖片
7. 獲取當(dāng)前請(qǐng)求URI
如果你想獲取當(dāng)前請(qǐng)求的Schema,Host,Port,上下文,那么你可以通過(guò)如下參數(shù)獲取
@GetMapping("/uri")
public Object uri(UriComponentsBuilder builder) {
return builder.toUriString() ;
}
輸出結(jié)果:
http://localhost:9001/api。
只包含了schema://host:port/context
8. 獲取請(qǐng)求的部分
如果你的請(qǐng)求是multipart/form-data,那么你可以通過(guò)如下方式獲取部分請(qǐng)求信息
@PostMapping("/requestpart")
public Object requestpart(@RequestPart("user") String user) {
return user ;
}
請(qǐng)求結(jié)果:
圖片
你還可以以JSON對(duì)象讀取,如下:
public Object requestpart(@RequestPart("user") User user)
注意,對(duì)象接受時(shí),你需要設(shè)置每part的Content-Type
Content-Type: multipart/mixed
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="user"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit
{
"age": 20,
"name": "張三"
}
沒(méi)有設(shè)置Content-Type將會(huì)拋出415錯(cuò)誤。
9.重定向保存屬性
指定在發(fā)生重定向時(shí)使用的屬性(即要附加到查詢(xún)字符串中的屬性)以及要在重定向請(qǐng)求期間臨時(shí)存儲(chǔ)的屬性。
@PostMapping("/")
public String handleFileUpload(RedirectAttributes redirectAttributes) {
// 重定向后能夠獲取到這里指定的屬性信息
redirectAttributes.addFlashAttribute("message", "You successfully uploaded file!");
// 重定向
return "redirect:/";
}
通過(guò)該種方式,重定向后頁(yè)面中也能獲取設(shè)置的屬性信息。