SpringBoot中Controller接口参数还可以这样玩?

开发 前端
指定在发生重定向时使用的属性(即要附加到查询字符串中的属性)以及要在重定向请求期间临时存储的属性。

环境:SpringBoot3.2.5

1. Optional包装参数

请求参数通过java.util.Optional包装

@GetMapping("/optional")
public Object optional(Optional<String> name) {
  return String.format("请求参数: %s", name.orElse("")) ;
}

通过Optional接受参数,效果等同于

public Object optional(@RequestParam(required=false) String name){}

与将required设置为false效果一样(@RequestHeader同样)

2. 便捷获取Servlet API

在请求参数中你可以使用WebRequest, NativeWebRequest两个任意对象来获取Request,Response,Session等对象。

@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" ;
}

当然你可以直接写你需要的具体对象

public Object servletApi(HttpServletRequest req, 
  HttpServletResponse resp) {
  // ...
}

NativeWebRequest本身提供了很多通用的方法,并且还可以获取其它对象,使用起来更加方便。

3. 获取当前认证用户

你的请求参数还可以使用java.security.Principal该对象用来获取当前请求中已经认证过的用户信息。这尤其在使用Spring Security时非常有用,在Security中的Authentication接口实现了Principal。

@GetMapping("/principal")
public Object principal(Principal principal) {
  return principal ;
}

输出如下:

图片图片

4. 获取请求其它信息

你还可以非常方便的获取当前请求Method及Locale等信息。

@GetMapping("/other")
public Object other(HttpMethod method, Locale locale) {
  return method.name() + ", " + locale.toString() ;
}
// 输出
GET, zh_CN

除此之外,你还可以获取时区信息java.util.TimeZone, java.time.ZoneId。

5. 读取输入流

将请求body中的内容以流InputStream形式获取。

@PostMapping("/inputStream")
public Object inputStream(InputStream is) throws Exception {
  return String.format("读取到内容: %s", 
    StreamUtils.copyToString(is, StandardCharsets.UTF_8)) ;
}

输出结果:

图片图片

6. 获取Header&Body

通过HttpEntity获取请求header及body内容信息;

@PostMapping("/httpentity")
public Object httpentity(HttpEntity<String> entity) {
  return Map.of(
    "headers", entity.getHeaders(), 
    "body", entity.getBody()
  ) ;
}

输出结果:

图片图片

7. 获取当前请求URI

如果你想获取当前请求的Schema,Host,Port,上下文,那么你可以通过如下参数获取

@GetMapping("/uri")
public Object uri(UriComponentsBuilder builder) {
  return builder.toUriString() ;
}

输出结果:

http://localhost:9001/api。

只包含了schema://host:port/context

8. 获取请求的部分

如果你的请求是multipart/form-data,那么你可以通过如下方式获取部分请求信息

@PostMapping("/requestpart")
public Object requestpart(@RequestPart("user") String user) {
  return user ;
}

请求结果:

图片图片

你还可以以JSON对象读取,如下:

public Object requestpart(@RequestPart("user") User user)

注意,对象接受时,你需要设置每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": "张三"
}

没有设置Content-Type将会抛出415错误。

9.重定向保存属性

指定在发生重定向时使用的属性(即要附加到查询字符串中的属性)以及要在重定向请求期间临时存储的属性。

@PostMapping("/")
public String handleFileUpload(RedirectAttributes redirectAttributes) {
  // 重定向后能够获取到这里指定的属性信息
  redirectAttributes.addFlashAttribute("message", "You successfully uploaded file!");
  // 重定向
  return "redirect:/";
}

通过该种方式,重定向后页面中也能获取设置的属性信息。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2024-08-06 09:51:21

SpringHTTPJSON

2024-08-02 08:38:20

Controller接口地址

2019-01-29 10:00:59

GitHub开源搜索

2024-05-17 09:37:26

format属性Spring

2024-12-03 09:45:34

2022-09-26 07:32:24

开发接口编程

2021-03-03 08:05:53

C++项目函数

2022-12-06 17:30:04

2022-07-30 23:45:09

内存泄漏检测工具工具

2016-09-29 17:48:32

腾讯云语音质检珍爱网

2021-02-01 13:35:28

微信Python技巧

2022-05-17 07:26:33

动画CSS前端

2023-07-03 16:49:47

5G

2013-09-18 10:44:01

搜狗输入法词语

2012-10-12 10:13:26

eclips代码编写Editplus

2017-11-27 12:24:02

命令行代码指令

2013-08-22 10:28:50

.NET MVC.NETRazor

2020-08-24 07:19:13

主键自增数据库

2017-09-27 14:57:44

IOS 11Siri苹果

2020-12-28 08:36:30

C语言编程泛型
点赞
收藏

51CTO技术栈公众号