Handler方法形参2---★接收Json参数

141 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

★接收Json参数

也是通过request来获得Json字符串

  • Content-Type:application/json
  • method:post
  • data:Json字符串

如果一个请求,它的请求方法是Post,是否一定携带Json数据?否

如果一个请求,它携带了Json数据,是否一定是Post请求呢?是

如果看到一个请求它的请求方法是Post,要判断是否携带的是Json。携带的字符串的值 里面是否有包含 {}或[]

如果看到一个请求它的请求方法是Get,不用考虑Json

构造Json请求:ajax、axios、Postman

image.png

image.png

可以这样子接收:都要增加注解@RequestBody

  • String → 如果接收为字符串需要你手动转换为引用类型的对象或其他的类型
  • 直接使用引用类型的对象或Map接收 → 接收到字符串,由Jackson帮我们自动完成这个转换
 // 接收Json数据
 @RequestMapping("login")
 public BaseRespVo login(@RequestBody String parameter) {
     return BaseRespVo.ok(null);
 }
 ​
 @RequestMapping("login2")
 public BaseRespVo login2(@RequestBody JsonUser jsonUser) {
     return BaseRespVo.ok(null);
 }
 ​
 @RequestMapping("login3")
 public BaseRespVo login3(@RequestBody Map map) {
     return BaseRespVo.ok(null);
 }

我们在开发的时候选择那种方式:

  • 引用类型的对象:其他情况使用引用类型的对象; 可以固定(确定)参数的类型
  • Map:参数比较少,参数类型比较简单(封装比较简单)

如果参数中有类似于Date格式的字符串,在这里也是可以接收的,取决于Json工具类,而不是Converter,用到 @JsonFormat → jackson提供的 ,也会影响到响应结果中的日期格式

→ 里面有一个属性 pattern:格式信息

→ timezone属性:时区信息

 {"username":"songge","password":"niupi","birthday":"1995-03-19"}

image.png

这两个URL还是要映射到不同的Handler方法上,通过请求方法做区分

  • method属性写的是RequestMethod[] 类型的值,在两个Handler方法上做请求方法的限定
  • GetMapping、PostMapping
  • Post请求方法携带的是Json数据,形参前要有@RequestBody
 /**
  * @author stone
  * @date 2022/08/08 15:12
  */
 @RestController
 @RequestMapping("admin/config")
 public class ConfigController {
     
     @GetMapping("mall")
     public BaseRespVo mall() {
         return BaseRespVo.ok(null);
     }
     
     @PostMapping("mall")
     public BaseRespVo mall2(@RequestBody Map map) {
         return BaseRespVo.ok(null);
     }
 }

其他参数(JavaEE阶段使用的一些参数)

HttpServletRequest和HttpServletResponse

在Handler方法的形参中,也可以使用request和response

 @RequestMapping("hello1")
 public BaseRespVo hello1(HttpServletRequest request,HttpServletResponse response){
    //request和response从哪里来的   
 }

但是我们通常都不写request和response,因为他们做的事情,基本上SpringMVC都是有封装、

Cookie

要通过request才能够Cookie → request.getCookies

 @RequestMapping("cookies")
 public BaseRespVo cookies(HttpServletRequest request) {
     Cookie[] cookies = request.getCookies();
     //如果你想要拿到某个name对应的value就要遍历了
     for (Cookie cookie : cookies) {
         if ("ligenli".equals(cookie.getName())) {
             System.out.println("cookieValue:" + cookie.getValue());
         }
     }
     return BaseRespVo.ok(null);
 }

构造Cookie

  • 浏览器
  • Postman

image.png

image.png

Session

可以通过request.getSession获得Session,也可以直接写在形参上

 @RequestMapping("session")
 public BaseRespVo session(HttpServletRequest request) {
     HttpSession session = request.getSession();
     return BaseRespVo.ok(null);
 }
 ​
 @RequestMapping("session2")
 public BaseRespVo session2(HttpSession session) {
     //HttpSession session = request.getSession();
     return BaseRespVo.ok(null);
 }