SpringBoot-请求响应

1.简单参数

简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。

1.1 原始方式(HttpServletRequest)

在原始的Web程序当中,需要通过Servlet中提供的API:HttpServletRequest(请求对象),获取请求的相关信息。

//原始方式
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        //从HttpServletRequest对象中获取名为"name"的请求参数
        String name=request.getParameter("name");
        //从HttpServletRequest对象中获取名为"age"的请求参数
        String ageStr=request.getParameter("age");
 
        //将获取到的年龄字符串转换为整型
        int age=Integer.parseInt(ageStr);
        //在控制台中打印出获取到的信息
        System.out.println(name+";"+age);
        //返回获取到的信息
        return (name+";"+age);
    }

请添加图片描述

1.2 Springboot方式

在Springboot的环境中,对原始的API进行了封装,如果是简单参数,则请求参数名要与形参名相同,定义同名的形参即可接收参数。

//springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(String name,Integer age){//形参名和请求参数名保持一致
        System.out.println(name+";"+age);
        return "OK";
    }

1.3 参数名不一致(@RequestParam)

如果形参名与请求参数名不一致,那么值会为null

在这里插入图片描述

解决方案:使用Spring提供的@RequestParam注解完成映射,那么请求参数名就要跟name的值一致,而不是跟形参名一致

@RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name111") String username, Integer age){
        return (username+";"+age);
    }

在这里插入图片描述

如果@RequestParam中的required属性为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错

在这里插入图片描述

required属性设置为false,将不会报错,而是为null

@RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name",required = false) String username, Integer age){
        return (username+";"+age);
    }

在这里插入图片描述

2.实体参数

将请求参数封装到一个实体类对象中,请求参数名要与与实体类的属性名相同

2.1 简单实体参数

User实体类:

@Data
public class User {
    private String name;
    private Integer age;
}

Controller方法:

//实体参数:简单实体对象
    @RequestMapping("/simplePojo")
    public User simplePojo(User user){
        return user;
    }

在这里插入图片描述

2.2 复杂实体参数

复杂实体对象指的是,在实体类中有一个或多个属性,也是实体对象类型的。

例如:User类中有一个Address类型的属性(Address是一个实体类)

User实体类:

@Data
public class User {
    private String name;
    private Integer age;
    private Address address; //地址对象
}

Address实体类:

@Data
public class Address {
    private String province;
    private String city;
}

Controller方法:

//实体参数:复杂实体对象
     @RequestMapping("/complexPojo")
    public User complexPojo(User user){
        return user;
    }

在这里插入图片描述

3.JSON参数(@RequestBody)

在前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式的数据进行传输。

传递json格式的参数,在Controller中会使用实体类进行封装

封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识

//JSON参数
 @RequestMapping("/jsonParam")
    public User jsonParam(@RequestBody User user){
        return user;
    }

在这里插入图片描述

@RequestBody注解:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性名保持一致)

4.路径参数(@PathVariable)

传统的开发中请求参数是放在请求体(POST请求)传递或跟在URL后面传递(GET请求)。但在现在的开发中,经常还会直接在请求的URL中传递参数。

传统请求参数:
http://localhost:8080/user?name=hs&age=18
 
直接在请求的URL中传递参数:
http://localhost:8080/user/1
http://localhost:880/user/1/0

4.1 单个路径参数

使用{xx}来标识该路径参数,需要使用@PathVariable获取路径参数

//路径参数
   @RequestMapping("/pathParam/{id}")
    public Integer pathParam(@PathVariable Integer id){
        return id;
    }

在这里插入图片描述

4.2 传递多个路径参数

继续加/{xx}

//多个路径参数
    @RequestMapping("/pathParam/{id}/{name}")
    public String pathParam(@PathVariable Integer id,@PathVariable String name){
        return (id+","+name);
    }

在这里插入图片描述

5.数组集合参数

数组集合参数的使用场景:在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值。

后端程序接收上述多个值的方式有两种:

1.数组

2.集合

5.1 数组参数

//数组参数
   @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        return Arrays.toString(hobby);
    }

请求参数名与形参数组名称相同,且请求参数为多个,定义数组类型形参即可接收参数

在前端请求时,有两种传递形式:

方式一: ?hobby=game&hobby=java

在这里插入图片描述

方式二: ?hobby=game,java

在这里插入图片描述

5.2 集合参数(@RequestParam)

默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使用@RequestParam绑定参数关系

@RequestMapping("/listParam")
    public List listParam(@RequestParam List<String> hobby){
        return hobby;
    }

在前端请求时,有两种传递形式:

方式一: ?hobby=game&hobby=java

方式二: ?hobby=game,java

6.日期参数(@DateTimeFormat)

在一些特殊的需求中,可能会涉及到日期类型数据的封装。

因为日期的格式多种多样,那么对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式

@DateTimeFormat注解的pattern属性中指定了哪种日期格式,前端的日期参数就必须按照指定的格式传递。

后端controller方法中,需要使用Date类型或LocalDateTime类型,来封装传递的参数。

//日期参数
   @RequestMapping("/dateParam")
    public LocalDateTime dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        return updateTime;
    }

在这里插入图片描述

7.响应

7.1 @ResponseBody

@ResponseBody注解:

  • 类型:方法注解、类注解
  • 位置:书写在Controller方法上或类上
  • 作用:将方法返回值直接响应给浏览器
  • 如果返回值类型是实体对象/集合,将会转换为JSON格式后在响应给浏览器

在类上添加的@RestController注解,是一个组合注解。@RestController = @Controller + @ResponseBody

@RestController源码:

@Target({ElementType.TYPE})   //元注解(修饰注解的注解)
@Retention(RetentionPolicy.RUNTIME)  //元注解
@Documented    //元注解
@Controller   
@ResponseBody 
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

类上有@RestController注解或@ResponseBody注解时:表示当前类下所有的方法返回值做为响应数据,方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器

7.2 统一响应结果

统一的返回结果使用类来描述,在这个结果中包含:

  • 响应状态码:当前请求是成功,还是失败
  • 状态码信息:给页面的提示信息
  • 返回的数据:给前端响应的数据(字符串、对象、集合)

定义在一个实体类Result来包含以上信息。代码如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应码 描述字符串
    private Object data; //返回的数据
 
 
    //增删改 成功响应(不需要给前端返回数据)
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查询 成功响应(把查询结果做为返回数据响应给前端)
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失败响应
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

改造Controller:

//响应统一格式的结果
    @RequestMapping("/hello")
    public Result hello(){
        System.out.println("Hello World ~");
        return Result.success("Hello World ~");
    }

在这里插入图片描述

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值