SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 请求响应概述

        1.1 简单参数

        1.2 实体参数

        2.3 数组集合参数

        2.4 日期参数

        2.5 json 参数

        2.6 路径参数

        3.0 完整代码


        1.0 请求响应概述

        当客户端发送不同的请求参数到服务端,服务端就需要进行不同的方法方式来接收请求参数。一般的请求参数的类型包括:简单参数、实体参数、数组集合参数、日期参数、json 参数、路径参数。

        1.1 简单参数

        客户端无论通过 get 或者是 post 方式来发送请求,对应发送简单请求参数来说,是通过键值对的方式来发送到服务端。

        1)方法一:服务端可以用到 HttpServletRequest 类对象来接收简单参数请求,再通过对象名.getParam("请求参数名") 方法来获取值。

代码演示:

    //接收简单参数方法一:使用 HttpServletRequest 类来获取客户端发送过来的请求参数
    //通过对象名.get
    //这里注解为:请求路径
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        String name = request.getParameter("name");
        String age = request.getParameter("age");

发送的请求参数:

        通过 GET 方式来发送请求,请求参数有两个 name 和 age,send 发送给服务端后,服务端给客户端返回 "OK" 。

服务器输出的结果:

        服务端成功接收请求参数且返回数据到客户端。

        2)方法二:可以直接用一一对应的方式来接收请求参数,必须要注意保持请求的参数名与服务端需要接收的变量名保持一致。

代码演示:

    //接受简单参数方法二:直接用对应请求参数的变量名称来接收,一一对应的方式
    @RequestMapping("/simpleParam1")
    //需要注意的是,参数名称与客户端发送过来的名称要一一对应,且接收后的数据会自动识别转换类型
    public String simpleParam1(String name,Integer age){
        System.out.println(name + " : " + age);
        return "OK";
    }

发送的请求:

        这次发送的请求方式为 post 方式,请求参数在请求体中。

服务器输出的结果:

        3)对方法 2 的升级,万一有需求:接收请求参数的变量名与请求参数不一致,那么可以通过变量名与请求参数进行绑定的形式。

代码演示:

    //如果方法中的参数名与请求参数名不一致,就需要进行绑定参数
    @RequestMapping("/simpleParam2")
    public String simpleParam2(@RequestParam(name = "name" ,required = false) String userName,Integer age){
        System.out.println(userName + " : " + age);
        return "OK";
    }

发送的请求:

        通过用注解 RequestParam 来绑定 name 与 userName ,也可以理解为将 name 映射到 userName 。注解中还有一个参数,该参数的作用,将 required 设置 false 时,不要求请求参数 name 一定有,但是 requider 默认为 true ,必须要求请求参数 name 必须存在。

服务端输出的结果:

        1.2 实体参数

        可以用类对象(实体)的方式来接收请求参数,类中的成员变量必须保持跟请求参数名一致。

代码演示:

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

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    public User() {
    }

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


    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}
    //接受实体参数方法三:当客户端发送过来的数据,服务端可以用对象来接受,对象中的变量要跟传输过来的参数名要保持一致
    @RequestMapping("/complexParam")
    //用一个类对象来接收
    public String complexParam(User user){
        //这样 user 就可以接收到请求参数了
        System.out.println(user);
        return "OK";
    }

发送的请求:

服务端输出的结果:

        2.3 数组集合参数

        当客户端发送的请求参数中有多个参数名是一致的且值不相同时,服务端就可以用到数组来接收这些相同参数的值了,接收参数值的数组名一定要跟该多个参数名保持一致。

代码演示:

    //接收数组参数方法:当客户端发送的参数名都是一样且值不一样的时候,就可以用到数组来接收了
    //需要注意的是,请求参数名需要跟接收的数组名保持一致
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }

发送的请求:

服务端输出的结果:

        服务端成功用数组接收请求参数所应对的值。

        除了数组这个容器之外,还可以用集合容器来接收请求参数,通过注解 @RequestParam 来绑定该集合来接收请求参数。

代码演示:

    //用集合来接收请求参数
    @RequestMapping("/listParam")
    //这里的注解:映射,默认用数组接收,若改变用集合来接收请求参数,就需要进行关系上的绑定
    //一定要注意,请求参数的名称 hobby 一定要与以下方法集合名称保持一致
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }

发送的请求:

服务端输出的结果:

        2.4 日期参数

        若客户端发送给服务端的请求参数是日期格式,服务端可以用 LocalDateTime 类型的对象来接收该日期格式的请求参数,由于日期格式是不确定的,所以需要自定义日期格式,通过 @DateTimeFormat 注解中的 pattern 参数来定义日期格式。

代码演示:

    //当客户端的请求参数是日期的格式,那么就需要用到LocalDateTime类型来接收
    @RequestMapping("/dateTimeParam")
    //这里的注释:规定日期格式
    //需要注意,方法中的参数名必须要跟请求参数的名保持一致
    public String dateTimeParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime){
        System.out.println(localDateTime);
        return "OK";
    }

发送的请求:

        需要注意的是:05 不能只写 5 ,会因为格式不对,导致报错,报错码为:400,客户端格式错误,语法错误。

服务端输出的结果:

        2.5 json 参数

        客户端用 post 方式来发送请求,请求的参数是 json 格式的参数,在请求体中。简单理解为,由于 json 格式与类的格式很像,所以用类对象来接收 json 参数,通过注解 @RequestBody 将类对象与请求 json 格式的参数进行绑定。

代码演示:

    //当客户端的请求参数是一个 json 格式,需要进行参数绑定
    //json 格式的数据可以简单理解认为就是用类对象来接收的,因为格式很相识
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }

发送的请求:

服务端输出的结果:

        这样服务端就完成了对客户端发送过来的 json 格式的请求参数接收完毕,且成功给客户端响应 "OK" 。

        2.6 路径参数

        当客户端发送的路径中就含有参数时,服务端该如何接收呢?

        使用 Spring 框架的 Java 应用程序,可以使用 @PathVariable 注解来接收客户端发送的带有参数的路径。

        在请求路径上的参数需要用 {} 进行封装

代码演示:

    //当客户端的请求参数就是路径参数
    @RequestMapping("/Path/{id}/{name}")
    public String pathParam(@PathVariable String id,@PathVariable String name){
        System.out.println(id + " : " + name);
        return "OK";
    }

发送的请求:

服务端输出的结果:

        3.0 完整代码

demo1 类:

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class demo1 {

    //接收简单参数方法一:使用 HttpServletRequest 类来获取客户端发送过来的请求参数
    //通过对象名.get
    //这里注解为:请求路径
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        String name = request.getParameter("name");
        String age = request.getParameter("age");

        //类型转化:
        int age1 = Integer.parseInt(age);
        System.out.println(name + " : " + age1);

        //给客户端返回
        return "OK";
    }


    //接受简单参数方法二:直接用对应请求参数的变量名称来接收,一一对应的方式
    @RequestMapping("/simpleParam1")
    //需要注意的是,参数名称与客户端发送过来的名称要一一对应,且接收后的数据会自动识别转换类型
    public String simpleParam1(String name,Integer age){
        System.out.println(name + " : " + age);
        return "OK";
    }

    //如果方法中的参数名与请求参数名不一致,就需要进行绑定参数
    @RequestMapping("/simpleParam2")
    public String simpleParam2(@RequestParam(name = "name" ,required = false) String userName,Integer age){
        System.out.println(userName + " : " + age);
        return "OK";
    }



    //接受实体参数方法三:当客户端发送过来的数据,服务端可以用对象来接受,对象中的变量要跟传输过来的参数名要保持一致
    @RequestMapping("/complexParam")
    //用一个类对象来接收
    public String complexParam(User user){
        //这样 user 就可以接收到请求参数了
        System.out.println(user);
        return "OK";
    }


    //接收数组参数方法:当客户端发送的参数名都是一样且值不一样的时候,就可以用到数组来接收了
    //需要注意的是,请求参数名需要跟接收的数组名保持一致
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }

    //用集合来接收请求参数
    @RequestMapping("/listParam")
    //这里的注解:映射,默认用数组接收,若改变用集合来接收请求参数,就需要进行关系上的绑定
    //一定要注意,请求参数的名称 hobby 一定要与以下方法集合名称保持一致
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }

    //当客户端的请求参数是日期的格式,那么就需要用到LocalDateTime类型来接收
    @RequestMapping("/dateTimeParam")
    //这里的注释:规定日期格式
    //需要注意,方法中的参数名必须要跟请求参数的名保持一致
    public String dateTimeParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime){
        System.out.println(localDateTime);
        return "OK";
    }


    //当客户端的请求参数是一个 json 格式,需要进行参数绑定
    //json 格式的数据可以简单理解认为就是用类对象来接收的,因为格式很相识
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }


    //当客户端的请求参数就是路径参数
    @RequestMapping("/Path/{id}/{name}")
    public String pathParam(@PathVariable String id,@PathVariable String name){
        System.out.println(id + " : " + name);
        return "OK";
    }



}

User 类:

public class User {
    private String name;
    private String age;
    private Hobby hobby;


    public User() {
    }

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

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    public Hobby getHobby() {
        return hobby;
    }

    public void setHobby(Hobby hobby) {
        this.hobby = hobby;
    }

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

Hobby 类:

public class Hobby {
    private String name1;
    private String name2;

    public Hobby() {
    }

    public Hobby(String name1, String name2) {
        this.name1 = name1;
        this.name2 = name2;
    }

    public String getName1() {
        return name1;
    }

    public void setName1(String name1) {
        this.name1 = name1;
    }

    public String getName2() {
        return name2;
    }

    public void setName2(String name2) {
        this.name2 = name2;
    }

    @Override
    public String toString() {
        return "Hobby{" +
                "name1='" + name1 + '\'' +
                ", name2='" + name2 + '\'' +
                '}';
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/614224.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【驱动】SPI

1、简介 SPI(Serial Peripheral interface)串行外设接口。 特点: 高速:最大几十M,比如,AD9361的SPI总线速度可以达到40MHz以上全双工:主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它一主多从:主机产生时钟信号,通过片选引脚选择…

微火全域外卖城市合伙人究竟是什么?详细介绍

随着外卖市场的蓬勃发展&#xff0c;微火全域外卖团购业务正逐渐崭露头角&#xff0c;成为商家与消费者之间的新桥梁。这种业务模式&#xff0c;也被称为全域合伙人&#xff0c;其魅力在于其独特的多平台销售策略和简便的管理系统。那么&#xff0c;这种全域外卖城市合伙人&…

N1077B keysight 是德 光/电时钟恢复设备,参数

Keysight N1077B是一款光/电时钟恢复设备&#xff0c;支持115 MBd至24 GBd的数据速率范围&#xff0c;适用于多模和单模光信号以及电信号。该设备能够处理PAM4和NRZ两种类型的数据信号&#xff0c;并提供符合标准的时钟恢复功能。 型 号&#xff1a;N1077B/A 名 称&#xff1a…

【教程向】从零开始创建浏览器插件(四)探索Chrome扩展的更多常用API

探索Chrome扩展的更多常用API 在Chrome扩展开发中&#xff0c;除了最基础的API外&#xff0c;Chrome还提供了一系列强大的API&#xff0c;允许开发者与浏览器的各种功能进行交互。本文将介绍其中几个常用的API&#xff0c;并提供详细的示例代码帮助您开始利用这些API。 书签…

【Spring】初识 Spring AOP(面向切面编程)

目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程&#xff0c;AOP 是一…

大型模型技术构建本地知识库

使用大型模型技术构建本地知识库是一个复杂的过程&#xff0c;涉及到数据科学、机器学习和软件工程等多个领域的知识。以下是构建本地知识库的一般步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析&#xff1a; 确定知…

软件工程经济学--期末复习资料

软件工程经济学--期末复习资料 前言第一章 绪论第二章 软件工程经济学基础第三章 软件的成本管理与定价分析第四章 软件工程项目评价方法与经济效果评价第五章 软件生产函数、效益分析及不确定性分析第六章 软件工程项目进度计划的制定结尾总结 前言 软件工程经济学&#xff0…

书生作业:XTuner

作业链接&#xff1a; https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md xtuner: https://github.com/InternLM/xtuner 环境配置 首先&#xff0c;按照xtuner的指令依次完成conda环境安装&#xff0c;以及xtuner库的安装。 然后&#xff0c;我们开始尝试…

VBA信息获取与处理第四节:获取唯一非重复值返回数组的代码

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

scanf留下的那一片云彩

【题目描述】 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&#xff09;&#xff0c;统计得分。每个O的得分为目前连续出现的O的个数&#xff0c;X的得分为0。例如&#xff0c;OOXXOXXOOO的得分为1200100123。 输入第一行表示有n个字符串&#xff0c;后续是n行字…

【matlab基础知识代码】(十八)无约束最优化问题

min下面的x称为优化向量或者是决策变量 匿名函数法 >> f(x)(x(1)^2-2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2)); x0[0; 0]; [x,b,c,d]fminsearch(f,x0), x 0.6111 -0.3056 b -0.6414 c 1 d 包含以下字段的 struct: iterations: 72 funcCount: 137 algor…

Hive SQL-DML-insert插入数据

Hive SQL-DML-insert插入数据 1. 插入静态数据 可以直接插入具体的值到Hive表中&#xff1a; INSERT INTO TABLE tablename (column1, column2, column3) VALUES (value1, value2, value3),(value4, value5, value6),...;2. 插入查询结果 将一条查询的结果直接插入到另一个表中…

软件工程基础知识,软考选择题的重点

本篇知识来自&#xff1a;软件设计师考试同步辅导 ---考点。。。。。&#xff0c;钟彩华 博伟玉 清华出版社&#xff0c;那本书。仅供学习。以下理解都是本人自己认为的。仅供参考。 本书的第132页&#xff0c;第五章知识。 目录 软件工程叙述 软件的生命周期 软件过程 软…

android studio配置Http Proxy

1、问题描述&#xff1a; Error:Unable to tunnel through proxy. Proxy returns “HTTP/1.1 400 Bad Request” 解决&#xff1a;HTTP Proxy设置 1.File→Settings…→System Settings → HTTP Proxy → Auto-detect proxy settings”&#xff1b; 2.勾选下方“Automatic prox…

Codigger:Vim的革新者,提升开发体验和功能性

深知Vim在编程和文本编辑领域的卓越地位&#xff0c;因此&#xff0c;在设计和开发过程中&#xff0c;Codigger始终将保留Vim的核心功能和高度定制能力作为首要任务。然而&#xff0c;Vim的复杂性和高度定制性也让很多新用户望而却步。为了降低这种使用门槛&#xff0c;Codigge…

常用Linux命令详细总结

一、文档编辑、过滤、查看命令 1、cp 复制文件和目录 -a 复制文件并保持文件属性 -d 若源文件为链接文件&#xff0c;则复制链接文件属性而非文件本身 -i 覆盖文件前提示&#xff0c;如果不要提示&#xff0c;在命令前加上\ -r 递归复制&#xff0c;通常用于目录的复制 …

【bug记录】清除僵尸进程,释放GPU显存

目录 1. 为什么会出现这种情况&#xff1f;2. 解决方案方法一&#xff1a;使用 fuser 命令方法二&#xff1a; 3. 小贴士 在进行深度学习或其他需要GPU支持的任务时&#xff0c;我们有时会发现虽然没有可见的进程在执行&#xff0c;但GPU资源却意外地被占用。这种情况往往会阻碍…

揭秘LLMOps,高效开发大型语言模型

大家好&#xff0c;随着人工智能&#xff08;AI&#xff09;的蓬勃发展&#xff0c;一个新兴领域语言模型运维&#xff08;LLMOps&#xff09;正逐渐成为关注的焦点。LLMOps专注于对大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如OpenAI的GPT系列&#xff0c;进行全…

ESP32重要库示例详解(一):EEPROM之Preferences库

1. 了解EEPROM 在嵌入式系统开发中&#xff0c;断电后晚能存储少量数据是常见需求。EEPROM&#xff08;Electrically Erasable Programmable Read-Only Memory&#xff09;是一种非易失性存储器&#xff0c;即使断电数据也不会丢失。ESP32的EEPROM模拟功能利用闪存空间&#x…

信创应用软件之办公流版签

信创应用软件之办公流版签 文章目录 信创应用软件之办公流版签概述流式文件版式文件电子签章厂商金山办公永中-永中Office中标-中标普华Office福昕科技e签宝法大大 概述 办公流版签软件主要包括办公中常用到的流式软件、版式软件以及电子签章。 版式文件和流式文件都是文书类…