SpringBoot——请求响应(简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数、统一响应结果)

本文主要是介绍SpringBoot——请求响应(简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数、统一响应结果),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容参考链接
Maven概念、IDEA集成、Maven坐标、依赖配置、依赖传递、排除依赖、依赖范围、生命周期

文章目录

    • 前言
    • 简单参数
      • 原始方式获取请求参数
      • SpringBoot 接收简单参数
      • @RequestParam 注解
    • 实体参数
    • 数组集合参数
    • 日期参数
    • JSON 参数
    • 路径参数
    • 统一响应结果
    • 总结

前言

大家好,这里是前端杂货铺。

本篇文章我们学习如何借助 SpringBoot 实现基本的请求和响应。


简单参数

原始方式获取请求参数

下面这个是比较原始的写法。

公共接口类 HttpServletRequest 继承自 ServletRequest。客户端浏览器发出的请求被封装成为一个 HttpServletRequest 对象。

通过 getParameter() 方法能拿到从浏览器端传递的参数。

package com.zahuopu.controller;import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {@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 + ":" + age);return "OK";}
}

接下来,在浏览器打开 http://localhost:8080/simpleParam?name=zahuopu&age=18 网址,或使用 postman / apipost 等接口测试工具测试:

浏览器查看:

接口测试工具查看:

在这里插入图片描述

idea 控制台输出:

在这里插入图片描述


SpringBoot 接收简单参数

我们既然都使用了 SpringBoot,当然可以使用它自带的一些写法(直接通过参数映射接收,此时需注意 请求参数名与方法形参变量名相同),接下来请看代码…

package com.zahuopu.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(String name, Integer age) {System.out.println(name + ": " + age);return "OK";}
}    

在这里插入图片描述


@RequestParam 注解

当方法形参名称与请求参数名称不匹配时,我们可以通过 @RequestParam 注解完成映射。

该注解的 required 属性默认是 true,代表请求参数必须传递。可以手动改为 false,此时该属性可以不传递。

package com.zahuopu.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name = "name") String username, Integer age) {System.out.println(username + ": " + age);return "OK";}
}

在这里插入图片描述


实体参数

如果请求的参数太多,我们可以使用实体对象参数。

规则:请求参数名与形参对象属性名相同,即可直接接收。

下面我们看个小例子,我们创建一个 User 类,里面定义 name 和 age 属性,并添加 get set 方法并重写 toString() 方法。再创建一个 Address 类,存放省份和城市。具体代码如下…

com.zahuopu.controller.RequestController

package com.zahuopu.controller;import com.zahuopu.pojo.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {@RequestMapping("complexPojo")public String complexPojo(User user) {System.out.println(user);return "OK";}
}

com.zahuopu.pojo.User

package com.zahuopu.pojo;public class User {private String name;private Integer age;private Address address;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}
}

com.zahuopu.pojo.Address

package com.zahuopu.pojo;public class Address {private String province;private String city;@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}

接口测试工具

在这里插入图片描述

idea 打印的内容

在这里插入图片描述


数组集合参数

数组:请求参数名与形参中数组变量名相同,可以直接使用数组封装。

集合:请求参数名与形参中集合变量名相同,通过 @RequestParam 绑定参数关系。

package com.zahuopu.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Arrays;
import java.util.List;@RestController
public class RequestController {@RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return "OK";}@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "OK";}
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


日期参数

使用 @DateTimeFormat 注解完成日期参数格式转换。

package com.zahuopu.controller;import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;@RestController
public class RequestController {@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {System.out.println(updateTime);return "OK";}
}

在这里插入图片描述

在这里插入图片描述


JSON 参数

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

package com.zahuopu.controller;import com.zahuopu.pojo.User;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user.toString());return "OK";}
}

在这里插入图片描述

在这里插入图片描述


路径参数

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

package com.zahuopu.controller;import org.springframework.web.bind.annotation.*;@RestController
public class RequestController {@RequestMapping("/path/{id}/{name}")public String pathParam(@PathVariable Integer id, @PathVariable String name) {System.out.println(id + ":" + name);return "OK";}
}

在这里插入图片描述

在这里插入图片描述


统一响应结果

@RestController 注解的底层实现其实是有好几个注解的。

@ResponseBody 的作用是将方法返回值直接响应,若返回值类型是 实体对象 / 集合,则转 JSON 格式响应。

在这里插入图片描述

统一响应结果:在响应数据时,我们可以封装一个类,进行处理响应数据。

com.zahuopu.pojo.Result.java

package com.zahuopu.pojo;public class Result {private Integer code; // 1 成功 0 失败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);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}

com.zahuopu.controller.ResponseController.java

package com.zahuopu.controller;import com.zahuopu.pojo.Address;
import com.zahuopu.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RestController
public class ResponseController {@RequestMapping("/hello")public Result hello() {return Result.success("Hello World!");}@RequestMapping("/getAddr")public Result getAddr() {Address addr = new Address();addr.setProvince("山东");addr.setCity("济南");return Result.success(addr);}@RequestMapping("/listAddr")public Result listAddr() {List<Address> list = new ArrayList<>();Address addr = new Address();addr.setProvince("山东");addr.setCity("济南");Address addr2 = new Address();addr2.setProvince("河南");addr2.setCity("郑州");list.add(addr);list.add(addr2);return Result.success(list);}
}

下面是各个请求响应的数据:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


总结

本篇文章我们认识了 如何使用 SpringBoot 进行基本的请求响应操作。并认识了多种传参方式,包括简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数等,并在最后进行了统一响应结果的封装处理!

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. JavaWeb开发(bilibili-黑马程序员)
  2. 菜鸟教程–Java

在这里插入图片描述


这篇关于SpringBoot——请求响应(简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数、统一响应结果)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116956

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que