SpringBoot:参数接收和响应

💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接

目录

一、项目结构

二、参数接收

1. Controller初始代码

2. 简单参数【参数可加@RequstParam】

3. 简单实体参数

4. 复杂实体参数

5. 数组参数【参数不加@RequstParam】

6. 集合参数【参数要加@RequstParam】

7. 日期参数【参数可加@DateTimeFormat】

8. JSON参数【参数要加@RequestBody】

9. 路径参数【参数要加@PathVariable】

三、响应参数

1. RestController

2. Controller初始代码

3. 响应返回字符串

4. 响应返回集合

5. 响应返回实体类

6. 统一响应结果

四、练习

1. 编写一个SpringBoot Controller方法,接收两个整数参数a和b,并返回它们的和。

2. 创建一个User实体类,包含字段name和age。编写一个SpringBoot Controller方法,接收一个User实体对象,并返回该对象的详细信息。

3. 编写一个SpringBoot Controller方法,接收一个JSON字符串,该字符串包含两个字段name和age,并返回接收到的JSON字符串。

4. 编写一个SpringBoot Controller方法,接收以下参数。

5. 编写一个Spring Boot的Controller方法,返回一个统一的响应结果,包含状态码、消息和数据。当请求路径为"/getSuccess"时,返回成功状态码和数据;当请求路径为"/getError"时,返回错误状态码和消息。


一、项目结构

二、参数接收

1. Controller初始代码

package com.example.Controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Controller //用于指示Spring框架,被注解的类是一个控制器类,控制器负责处理传入的请求并将其映射到具体的处理方法上
@ResponseBody //控制器方法的返回值直接写入HTTP响应体中,以JSON、XML或其他格式的数据返回给客户端。可写在方法上有,也可写在类上(表示作用于所有方法)
public class UserController {

    // ...省略具体的方法实现,这些方法用于接收HTTP请求参数并返回响应

}

2. 简单参数【参数可加@RequstParam】

(1)代码

UserController:

    @RequestMapping("/simpleParam")
    public String simpleParam(String name, String age) {
        System.out.println(name + ":" + age);
        return "OK";
    }

(2)接口测试

GET和POST的区别

参数位置

安全性

  • GET请求:由于参数直接暴露在URL中,因此它不适合传递敏感信息,如密码等。
  • POST请求:参数不会出现在URL中,因此更适合传递敏感信息。

数据大小:

  • GET请求:由于URL的长度限制,GET请求传递的数据量有限。
  • POST请求:理论上,POST请求可以传输更多的数据,因为数据不是通过URL传输的。

GET:

POST:

GET和POST均返回OK。

 控制台输出

张三:22

(3)注意事项

当controller中的参数名字和接口测试时传递的参数不完全一致时:

    @RequestMapping("/simpleParam")
    public String simpleParam(String username, String age) { //例如把name改成username
        System.out.println(username + ":" + age);
        return "OK";
    }

GET请求:

http://localhost:8080/simpleParam?name=张三&age=22(name和username不对应)

控制台输出

null:22

POSTMAN中查看GET返回的参数:

OK

解决方案

加上注解@RequestParam("name")

    @RequestMapping("/simpleParam")
    // @RequestParam(value = "name") String username
    // 表示将接口中传递的name参数映射成方法中的username(如果二者是同名的可以省略该注解)
    // 默认了这个参数是必须传递的,如果不传递name则返回400状态码
    public String simpleParam(@RequestParam(value = "name") String username, String age) {
        System.out.println(username + ":" + age);
        return "OK";
    }

@RequestParam(name = "name", required = false)

如果设置required = false表示这个参数可传递也可不传递,如果设置required = true表示这个参数必须传递。

RequestParam注解内部:

required属性默认为true

3. 简单实体参数

在使用简单参数做为数据传递方式时,前端传递了多少个请求参数,后端controller方法中的形参就要书写多少个。如果请求参数比较多,通过上述的方式一个参数一个参数的接收,会比较繁琐。此时,我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:请求参数名与实体类的属性名相同。

(1)代码

UserDTO代码:

package com.example.DTO;

public class UserDTO {

    private String name;
    private String age;

    public UserDTO(String name, String age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "UserDTO{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

UserController代码: 

    @RequestMapping("/simplePojo") //接收参数时会调用相应的构造方法
    public String simplePojo(UserDTO userDTO) {
        System.out.println(userDTO);
        return "OK";
    }

(2)接口测试

 控制台输出

UserDTO{name='张三', age='22'}

(3)注意事项

  控制台输出

UserDTO{name='null', age='22'}

4. 复杂实体参数

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

UserDTO类中有一个Address类型的属性(Address是一个实体类)

(1)代码

UserDTO代码:

package com.example.DTO;

import com.example.Pojo.Address;

public class UserDTO {

    private String name;
    private String age;
    private Address address; //嵌套实体

    //省略无参和有参构造方法, getter和setter, toString方法

}

Address实体代码:

package com.example.Pojo;

public class Address {

    private String province;
    private String city;

    //省略无参和有参构造方法, getter和setter, toString方法

}

UserController代码: 

    @RequestMapping("/complexPojo")
    public String complexPojo(UserDTO userDTO) {
        System.out.println(userDTO);
        return "OK";
    }

(2)接口测试

 控制台输出

UserDTO{name='张三', age='22', address=Address{province='北京', city='北京'}}

5. 数组参数【参数不加@RequstParam】

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

多个值是怎么提交的呢?其实多个值也是一个一个的提交。 后端程序接收上述多个值的方式有两种:数组和集合。

(1)代码

    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby) {
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }

(2)接口测试

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

 控制台输出

[唱, 跳, rap]

6. 集合参数【参数要加@RequstParam】

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

(1)代码

    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby) {
        System.out.println(hobby);
        return "OK";
    }

(2)接口测试

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

 控制台输出

[唱, 跳, rap]

7. 日期参数【参数可加@DateTimeFormat】

在一些特殊的需求中,可能会涉及到日期类型数据的封装。日期的格式多种多样,可通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。

(1)代码

    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
        System.out.println(updateTime);
        return "OK";
    }

(2)接口测试

 控制台输出

2024-07-25T00:00

8. JSON参数【参数要加@RequestBody】

前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式的数据进行传输。 (JSON是开发中最常用的前后端数据交互方式)

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

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

(1)代码

    @RequestMapping("jsonParam")
    public String jsonParam(@RequestBody UserDTO userDTO) {
        System.out.println(userDTO);
        return "OK";
    }

(2)接口测试

控制台输出

UserDTO{name='张三', age='16', address=Address{province='北京', city='北京'}}

9. 路径参数【参数要加@PathVariable】

在现在的开发中,经常还会直接在请求的URL中传递参数。 路径参数前端通过请求URL直接传递参数,后端使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数。

(1)代码

    @RequestMapping("/path/{id}/{name}")
    public String pathParam2(@PathVariable Integer id, @PathVariable String name) {
        System.out.print(id + "-" + name);
        return "OK";
    }

(2)接口测试

 控制台输出

1-张三

三、响应参数

1. RestController

@RestController = @Controller + @ResponseBody

@RestController底层源码

类上有@RestController注解或@ResponseBody注解时:表示当前类下所有的方法返回值做为响应数据

方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器。

2. Controller初始代码

package com.example.Controller;

import org.springframework.web.bind.annotation.RestController;

@RestController //@RestController = @Controller + @ResponseBody
public class ResponseController {
    
}

3. 响应返回字符串

(1)代码

    @RequestMapping("/getString")
    public String getString(){
        return "Hello";
    }

(2)接口测试

4. 响应返回集合

(1)代码

    @RequestMapping("/getList")
    public List<Integer> getList(){
        return List.of(1,2,3,4,5);
    }

(2)接口测试

5. 响应返回实体类

(1)代码

    @RequestMapping("/getEntity")
    public Address getEntity(){
        return new Address("北京","北京");
    }

(2)接口测试

6. 统一响应结果

前端开发人员拿到的响应数据,没有统一的规范。对前端开发人员业讲就需要针对不同的响应数据,使用不同的解析方式。上述这种情况就会造成:开发成本高、项目不方便管理、维护起来也比较难。

如果开发一个大型项目,项目中controller方法将成千上万,使用上述方式将造成整个项目难以维护。那在真实的项目开发中,都会定义一个统一的返回结果。方案如下:

(1)Result<T>类

package com.example.Result;

import java.io.Serializable; // 导入Serializable接口,用于实现序列化

public class Result<T> implements Serializable { //实现Serializable接口,以便于序列化

    private Integer code;   //编码:1成功,0和其它数字为失败
    private String msg;     //错误信息
    private T data;         //数据

    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 1;
        return result;
    }

    public static <T> Result<T> success(T object) {
        Result<T> result = new Result<T>();
        result.data = object;
        result.code = 1;
        return result;
    }

    public static <T> Result<T> error(String msg) {
        Result result = new Result();
        result.msg = msg;
        result.code = 0;
        return result;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

(2)返回字符串

    @RequestMapping("/getStringResult")
    public Result<String> getStringResult(){
        return Result.success("Hello World");
    }

(3)返回集合

    @RequestMapping("/getListResult")
    public Result<List> getListResult(){
        return Result.success(List.of(1, 2, 3, 4, 5));
    }

(4)返回实体类

    @RequestMapping("/getEntityResult")
    public Result<Address> getEntityResult(){
        return Result.success(new Address("北京","北京"));
    }

四、练习

1. 编写一个SpringBoot Controller方法,接收两个整数参数a和b,并返回它们的和。

@RestController
public class TestController {
    @RequestMapping("/add")
    public int add(@RequestParam(value = "a") int a,
                   @RequestParam(value = "b") int b) {
        return a + b;
    }
}

2. 创建一个User实体类,包含字段name和age。编写一个SpringBoot Controller方法,接收一个User实体对象,并返回该对象的详细信息。

@RestController
public class TestController {
    @RequestMapping("/user")
    public User user(User user){
        return user;
    }
}

3. 编写一个SpringBoot Controller方法,接收一个JSON字符串,该字符串包含两个字段name和age,并返回接收到的JSON字符串。

@RestController
public class TestController {
    @RequestMapping("/json")
    public void receiveJson(@RequestBody User user) {
        System.out.println(user);
    }
}

4. 编写一个SpringBoot Controller方法,接收以下参数。

  1. 数组参数ids
  2. 集合参数names
  3. 时间日期参数date
  4. 路径参数id
@RestController
public class TestController {
    @RequestMapping("/params/{id}")
    public String Params(@PathVariable Integer id,
                       @RequestParam List<String> names,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date,
                       int[] ids) {
        System.out.println(id);
        System.out.println(names);
        System.out.println(date);
        System.out.println(Arrays.toString(ids));
        return "OK";
    }
}

5. 编写一个Spring Boot的Controller方法,返回一个统一的响应结果,包含状态码、消息和数据。当请求路径为"/getSuccess"时,返回成功状态码和数据;当请求路径为"/getError"时,返回错误状态码和消息。

@RestController
public class TestController {
    @RequestMapping("/getSuccess")
    public Result<String> getSuccess() {
        return Result.success("Success");
    }

    @RequestMapping("/getError")
    public Result<String> getError() {
        return Result.error("Error");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值