菜鸟之路Day27一一请求响应

简介: 本文《菜鸟之路Day27——请求响应》由作者blue于2025年4月29日撰写,主要讲解了Web开发中请求与响应的处理方式。内容涵盖简单参数、实体参数、数组集合参数、日期参数、JSON参数及路径参数的处理方法,对比了原始方式与SpringBoot的便捷实现。同时,文章深入探讨了响应数据的统一化处理,通过创建Result类规范返回结果,提升代码可维护性。适合初学者了解请求响应的核心机制与最佳实践。

菜鸟之路Day27一一请求响应

作者:blue

时间:2025.4.29

[TOC]

一.请求

1.简单参数

1.1原始方式

在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取

@RestController
public class simpleParamController {
   

    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request) {
   
        String name = request.getParameter("name");
        String ageStr = request.getParameter("age");
        int age = Integer.parseInt(ageStr);
        System.out.println("name: " + name + ", age: " + age);
        return "OK";
    }
}

image-20250427154105997.png

1.2springboot方式

①简单参数:参数名与形参变量名相同,定义形参即可接收参数

//SpringBoot方式
@RestController
public class simpleParamController {
   

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

这次我们利用采用Post方式发送请求

image-20250427155014181.png

②简单参数:如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射

注意:@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false。

//SpringBoot方式
@RestController
public class simpleParamController {
   
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name",required=false) String username, int age) {
   
        System.out.println("name: " + username + ", age: " + age);
        return "OK";
    }
}

2.实体参数

2.1简单实体对象

请求参数名与形参对象属性名相同,定义POJO接收即可

@RequestMapping("/simplePojo")
public String simplePojo(User user){
    //User是提前自定义好的类
    System.out.println("name: " + user.getName() + ", age: " + user.getAge());
    return "OK";
}
package com.bluening.pojo;

public class User {
   
    private String name;
    private int age;

    public User() {
   
    }

    public User(String name, int age) {
   
        this.name = name;
        this.age = age;
    }

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public int getAge() {
   
        return age;
    }

    public void setAge(int age) {
   
        this.age = age;
    }

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

2.2复杂实体对象

请求参数名与形参对象属性名相同,按照对象层次结构关系即可嵌套POJO属性参数

public class User {
   
    private String name;
    private int age;
    private Address address;
}
public class Address {
   
    private String province;
    private String city;
}
@RequestMapping("/complexPojo")
public String complexPojo(User user){
   
    System.out.println(user.toString());
    return "OK";
}

image-20250427210345961.png

3.数组集合参数

3.1数组参数

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

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

image-20250428194336953.png

3.2集合参数

请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系

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

4.日期参数

日期参数:使用@DataTimeFormat注解完成日期参数格式转换

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

image-20250428200554858.png

5.JSON参数

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

@RequestMapping("/JsonParam")
public String JsonParam(@RequestBody User user){
   
    System.out.println(user);
    return "Ok";
}

image-20250428204811964.png

6.路径参数

路径参数:通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数

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

image-20250428210341924.png

二.响应

@ResponseBody

类型:方法注解,类注解

位置:Controller方法上/类上

作用:将方法返回值直接响应,如果返回值类型是实体对象/集合,将会转换为JSON格式响应

说明:@RestController=@Controller+@ResponseBody

示例:

@RestController
public class ResponseController {
   
    @RequestMapping("/helloRes")
    public String helloRes() {
   
        return "Hello World";
    }

    @RequestMapping("/AddressRes")
    public Address AddressRes() {
   
        return new Address("山东","青岛");
    }

    @RequestMapping("/ListRes")
    public List<Address> ListRes() {
   
        Address add1 = new Address("广东","广州");
        Address add2 = new Address("山东","青岛");
        List<Address> addressList = new ArrayList<Address>();
        addressList.add(add1);
        addressList.add(add2);
        return addressList;
    }
}

以上各个方法的返回数据都不相同,在实际的开发过程中,这样的数据是非常难以维护的,所以,我们需要对所有的方法返回的数据进行统一化操作,即统一响应结果

统一响应结果:

创建一个Result类,作为统一返回类型

public class Result {
   
    //响应码,1代表成功,0代表失败
    private Integer code;

    //提示信息
    private String msg;

    //返回的数据
    private Object data;

    public Result() {
   
    }

    public Result(Integer code, String msg, Object data) {
   
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    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 Object getData() {
   
        return data;
    }

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

    public static Result success(Object data){
   
        return new Result(1,"success",data);
    }

    public static Result success(){
   
        return new Result(1,"success",null);
    }

    public static Result error(String msg){
   
        return new Result(0,msg,null);
    }

    @Override
    public String toString() {
   
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

统一响应结果:

@RestController
public class ResponseController {
   
    @RequestMapping("/helloRes")
    public Result helloRes() {
   
        return Result.success("Hello World");
    }

    @RequestMapping("/AddressRes")
    public Result AddressRes() {
   
        return Result.success(new Address("山东","青岛"));
    }

    @RequestMapping("/ListRes")
    public Result ListRes() {
   
        Address add1 = new Address("广东","广州");
        Address add2 = new Address("山东","青岛");
        List<Address> addressList = new ArrayList<Address>();
        addressList.add(add1);
        addressList.add(add2);
        return Result.success(addressList);
    }
}

image-20250429085304026.png

目录
相关文章
|
SQL 关系型数据库 MySQL
菜鸟之路Day30一一MySQL之DML&DQL
本文介绍了MySQL中DML(数据操作语言)和DQL(数据查询语言)的核心用法。DML主要包括插入(insert)、更新(update)和删除(delete)语句,通过具体示例演示了如何对表数据进行增删改操作。DQL则聚焦于数据查询,涵盖基本查询、条件查询、聚合函数、分组查询、排序查询和分页查询等内容。文章通过丰富的SQL语句实例,帮助读者掌握如何高效查询和操作数据库中的数据,适合初学者学习和实践。
621 12
|
Java Spring 容器
@Resource 这个注解什么用啊
@Resource 这个注解什么用啊
994 0
|
存储 Java 数据库连接
MyBatis-Plus 基础操作指南:实现高效的增删改查
MyBatis-Plus 基础操作指南:实现高效的增删改查
1025 0
|
存储 Java 程序员
菜鸟之路Day26一一Maven
本文由blue撰写,发布于2025年3月25日,主要介绍Maven工具的使用。Maven是Apache旗下的开源项目,用于管理和构建Java项目,基于项目对象模型(POM)概念。文章详细讲解了Maven的安装配置、IDEA中集成Maven的方法、依赖管理(包括依赖配置、传递与排除、依赖范围)、以及Maven的生命周期(clean、default、site)。通过学习,读者可掌握Maven的基本功能及其在项目中的应用。
627 12
|
前端开发 Java
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
文章通过一个表白墙/留言墙的初级SpringBoot项目实例,详细讲解了如何进行前后端开发,包括定义前后端交互接口、创建SpringBoot项目、编写前端页面、后端代码逻辑及实体类封装的全过程。
613 3
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
10月前
|
安全 Java API
Java日期时间API:从Date到Java.time
本文深入解析了Java 8中引入的全新日期时间API,涵盖LocalDate、LocalTime、LocalDateTime、ZonedDateTime等核心类的使用,以及时间调整、格式化、时区处理和与旧API的互操作。通过实例对比,展示了新API在可变性、线程安全与易用性方面的显著优势,并提供迁移方案与实战技巧,助你掌握现代Java时间处理的最佳实践。
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1255 5
|
SQL 数据安全/隐私保护 索引
SQL语句速成
《SQL语句速成》由blue编写,涵盖建表、插入、查询、更新、删除、视图创建、权限管理及索引操作等核心内容。通过具体示例介绍SQL基本语法和常用聚合函数,帮助读者快速掌握SQL编程技巧。发布于2024年7月19日。
359 7
|
开发工具 git 开发者
菜鸟之路day01一一学学Git
《菜鸟之路day01——学学Git》由blue编写,发布于2025年1月13日。本文简要介绍了Git这款分布式版本控制工具的基础操作,包括设置用户签名、初始化本地库、提交文件、查看历史版本、分支管理及冲突解决等。通过学习这些命令,读者可以掌握如何在本地进行版本控制和团队协作的基本技能。文章还涉及了远程仓库的操作,如推送、拉取和克隆等,帮助开发者更好地理解和使用Git。
269 6
|
Java 程序员
菜鸟之路Day22一一反射与动态代理
本文介绍了Java反射机制和动态代理的基本概念及应用。反射允许编程访问类的成员变量、构造方法和成员方法,通过三种方式获取Class对象,并演示了如何使用反射创建对象、调用方法和修改字段值。动态代理则通过接口实现无侵入式功能增强,展示了如何利用`Proxy`类和`InvocationHandler`接口生成代理对象并拦截方法调用。结合实例代码,详细讲解了反射在实际开发中的应用场景,如保存对象信息到文件和根据配置文件动态创建对象。 反射的主要作用包括: 1. 获取类的所有信息。 2. 结合配置文件动态创建对象。 动态代理的核心优势在于能够在不修改原有代码的情况下,为对象添加额外功能。
267 0