菜鸟之路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";
    }
}
AI 代码解读

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";
    }
}
AI 代码解读

这次我们利用采用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";
    }
}
AI 代码解读

2.实体参数

2.1简单实体对象

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

@RequestMapping("/simplePojo")
public String simplePojo(User user){
    //User是提前自定义好的类
    System.out.println("name: " + user.getName() + ", age: " + user.getAge());
    return "OK";
}
AI 代码解读
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 +
                '}';
    }
}
AI 代码解读

2.2复杂实体对象

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

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

image-20250427210345961.png

3.数组集合参数

3.1数组参数

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

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

image-20250428194336953.png

3.2集合参数

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

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

4.日期参数

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

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

image-20250428200554858.png

5.JSON参数

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

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

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";
}
AI 代码解读

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;
    }
}
AI 代码解读

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

统一响应结果:

创建一个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 +
                '}';
    }
}
AI 代码解读

统一响应结果:

@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);
    }
}
AI 代码解读

image-20250429085304026.png

相关文章
如何用Fidder发送Post数据包(菜鸟级教程),一文讲清
如何用Fidder发送Post数据包(菜鸟级教程),一文讲清
183 0
|
11月前
|
深入Java多态:从“一个消息”到“多种响应”的进化之路
【6月更文挑战第17天】Java多态性简化教育软件开发:通过抽象Course类定义teach()方法,子类如MathCourse、EnglishCourse和ScienceCourse重写该方法,实现特定教学内容。在CourseManagementSystem中,多态允许通过Course引用调用不同课程的teach(),展示“一个消息,多种响应”的能力,增强代码灵活性和可维护性,是面向对象编程的关键。
52 2
前端学习案例2-web服务中的请求和响应之2
前端学习案例2-web服务中的请求和响应之2
64 0
前端学习案例2-web服务中的请求和响应之2
前端学习案例3-web服务中的请求和响应之3
前端学习案例3-web服务中的请求和响应之3
133 0
前端学习案例3-web服务中的请求和响应之3
前端学习案例1-web服务中的请求和响应之1
前端学习案例1-web服务中的请求和响应之1
103 0
前端学习案例1-web服务中的请求和响应之1
深入解析价值25k的蚂蚁金服异步串行面试题
注:代码有错,请阅读原文。朋友去面试蚂蚁金服,遇到了一道面试题,乍一看感觉挺简单的,但是实现起来发现内部值得一提的点还是挺多的。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等