get和post区别 后端接收参数(全面)

get和post区别 后端接收参数(全面)get 和 post 区别后端接收参数 全面

大家好,欢迎来到IT知识分享网。

  • 当我们访问各种网页时,之所以能够看到页面,是因为浏览器向服务器发送了http请求并成功响应。http协议确定了请求和响应数据的格式。其中常见请求方式有get、post、put、delete,而开发中常用的则为get、post。
  • 本文重点介绍下get请求与post请求的区别,以及后端如何接收前端传来的参数。

一、get和post区别

  • get方法用于向服务器请求获取某个资源;post方法用于向服务器提交数据或附加新的数据,通常用于表单提交、文件上传等场景
  • 请求参数、安全性:get的请求参数在请求行中,没有请求体,如 http://ip:port/user/find?name=Tom&age=5,不适合传递敏感数据;post的请求参数在请求体中(浏览器Payload),适合传递敏感信息
  • 对数据长度的限制:get请求在url中传递的参数是有长度限制的;而post请求大小是没有限制的
  • 回退按钮/刷新:get方法刷新浏览器或者回退没有影响;post方法则会重新提交请求
  • 缓存:get请求会被浏览器主动cache;而post不会,除非手动设置
  • 历史:get请求参数会被完整地保留在浏览器历史记录中;post中的参数则不会
  • 对数据类型的限制:get只接收ASCII字符;post没有限制
  • 书签:get请求可收藏为书签;post请求不可收藏为书签
  • 请求数据包:get产生一个tcp数据包,浏览器将header和data一起发送出去,服务器响应200并返回数据;post产生两个tcp数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,浏览器响应200 成功

据统计,在网络好的情况下,发一次包与发两次包的时间差别基本上可以忽视,而在网络环境差的环境下,两次包的TCP在验证数据包完整性上有较大优势。

与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用;但在以下情况中,请使用 POST 请求:

  • 不愿使用缓存文件(更新服务器上的文件或数据库)
  • 向服务器发送大量数据(POST 没有数据量限制)
  • 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

参考https://blog.csdn.net/guorui_java/article/details/

二、后端接收参数

前端传来请求参数,Java后端必须先拿到请求参数 才能进行后面的开发、处理。针对不同类型的请求参数(简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数) 接收方法有所差异,总结如下。

2.1 简单参数

在向服务器发起请求时,传递的是一些普通的请求数据,如name=Jenny、age=10。

普通类型的GET、POST请求,后端接收参数的方式相同,此处以GET为例。

在这里插入图片描述

后端有两种方式接收传递过来的请求参数:原始方式、SpringBoot方式。

2.1.1 原始方式(了解即可)

  • 接收规则:通过HttpServletRequest对象的getParameter方法手动获取参数,request.getParameter(“参数名”)。繁琐,需要手动进行类型转换。【HttpServletRequest为Servlet提供的API,Tomcat接收到http请求时,把请求的相关信息封装到HttpServletRequest对象中。因此HttpServletRequest可用于获取请求的相关信息】
//根据指定的参数名获取请求参数的数据值 String value = request.getParameter("参数名"); 
  • 具体代码
@RestController public class RequestController { 
    //原始方式 @RequestMapping("/simpleParam") public String simpleParam(HttpServletRequest request) { 
    String name = request.getParameter("name"); //name、age为请求参数名 String ageStr = request.getParameter("age"); int age = Integer.parseInt(ageStr); //需要手动进行类型转换,繁琐 //输出 Jenny : 18 System.out.println(name + " : " + age); return "success"; } } 
  • Apipost发送GET、POST请求

在这里插入图片描述

2.1.2 SpringBoot方式

  • 接收规则:Controller方法参数名与请求参数名保持一致,顺序不必一一对应。简单方便,会自动进行类型转换【在Springboot的环境中,对原始的API进行了封装,接收参数的形式更加简单。 如果是简单参数,参数名与形参变量名相同,定义同名的形参即可接收参数。】
  • 具体代码
@RestController public class RequestController { 
    //springboot方式 形参名和请求参数名保持一致 @RequestMapping("/simpleParam") public String simpleParam(String name, Integer age) { 
    //形参名和请求参数名保持一致 //输出 Jenny : 18 System.out.println(name + " : " + age); return "success"; } } 
  • Apipost发送GET、POST请求

在这里插入图片描述

注意:

如果方法形参名称与请求参数名称不一致,服务器不会报错,而会将该参数值设置为null。可以通过Spring提供的@RequestParam注解来完成映射。

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

@RestController public class RequestController { 
     //springboot方式 请求参数名和形参名不相同 @RequestMapping("/simpleParam") public String simpleParam(String username, Integer age) { 
     //输出 null : 18 System.out.println(username + " : " + age); return "success"; } //springboot方式 请求参数名和形参名不相同,加上@RequestParam注解 @RequestMapping("/simpleParam") public String simpleParam(@RequestParam("name") String username, Integer age) { 
     //输出 Jenny : 18 System.out.println(username + " : " + age); return "success"; } //springboot方式 请求参数名和形参名不相同,加上@RequestParam注解,参数可选 @RequestMapping("/simpleParam") public String simpleParam(@RequestParam(value = "name", required = false) String username, Integer age) { 
     System.out.println(username + " : " + age); return "success"; } } 

2.2 实体参数

在使用2.1简单参数作为数据传递方式时,前端传递了多少个请求参数,后端Controller方法的形参就要对应写多少个。如果请求参数比较多,通过上述方式传递参数,比较繁琐

此时可以将请求参数封装到一个实体类对象中。请求参数名与实体类的属性名相同

实体类型的GET、POST请求,后端接收参数的方式相同。

2.2.1 简单实体对象

  • 接收规则:定义pojo实体类,请求参数名与实体类的属性名相同

如前端传来name、age,后端定义User对象,封装name和age属性。

  • 具体代码
//定义pojo实体类 public class User { 
    private String name; private Integer age; //get、set方法自行书写,此处省略 @Override public String toString() { 
    return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } //Controller @RestController public class RequestController { 
    //实体参数:简单实体对象 @RequestMapping("/simplePojo") public String simplePojo(User user) { 
    System.out.println(user); return "success"; } } 

在这里插入图片描述

  • Apipost发送GET、POST请求

在这里插入图片描述

在这里插入图片描述

2.2.2 复杂实体对象

上述为简单实体对象,现在看下复杂实体对象,复杂实体对象是指,在实体类中有一个或多个属性也为实体对象类型。如User对象封装了name、age,还有一个Address类型的属性(Address是一个实体类)

  • 接收规则:接收方式同上。请求参数名与形参对象属性名相同,按照对象层次结构关系 即可接收嵌套实体类属性参数
  • 具体代码
//Address实体类 public class Address { 
    private String province; private String city; //get、set方法自行书写,此处省略 @Override public String toString() { 
    return "Address{" + "province='" + province + '\'' + ", city='" + city + '\'' + '}'; } } //User实体类 public class User { 
    private String name; private Integer age; private Address address; //地址对象 //get、set方法自行书写,此处省略 @Override public String toString() { 
    return "User{" + "name='" + name + '\'' + ", age=" + age + ", address=" + address + '}'; } } //Controller方法 @RestController public class RequestController { 
    //实体参数:复杂实体对象 @RequestMapping("/complexPojo") public String complexPojo(User user) { 
    System.out.println(user); return "success"; } } 
  • Apipost发送GET、POST请求

在这里插入图片描述

在这里插入图片描述

2.3 数组集合参数

数组集合参数的使用场景:在HTML的表单中,有些表单项是支持多选的 即复选框,可以提交选择的多个值。

后端程序有两种方式接收上述多个值:数组、集合

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

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

数组集合类型的GET、POST请求,后端接收参数的方式相同。

在这里插入图片描述

2.3.1 数组

  • 接收规则定义数组类型,形参的数组名与请求参数名保持一致,即可接收参数
  • 具体代码
@RestController public class RequestController { 
    //数组集合参数 @RequestMapping("/arrayParam") public String arrayParam(String[] course) { 
    System.out.println(Arrays.toString(course)); return "success"; } } 
  • Apipost发送GET、POST请求

法一:xxx?course=Chinese&course=Math&course=English

在这里插入图片描述

在这里插入图片描述

法二:xxx?course=Chinese,Math,English

在这里插入图片描述

在这里插入图片描述

2.3.2 集合

  • 接收规则集合名称与请求参数名称一致,加入@RequestParam注解,绑定参数关系 表示用集合接收
  • 具体代码
@RestController public class RequestController { 
    //数组集合参数 @RequestMapping("/listParam") public String listParam(@RequestParam List<String> course) { 
    System.out.println(course); return "success"; } } 
  • Apipost发送GET、POST请求

法一:xxx?course=Chinese&course=Math&course=English

在这里插入图片描述

在这里插入图片描述

法二:xxx?course=Chinese,Math,English

get、post请求方式同数组法二。

2.4 日期参数

上述演示的都是一些普通的参数,在一些特殊的需求中,可能会涉及到日期类型数据的封装,比如以下需求:

在这里插入图片描述

由于日期的格式多种多样(如:2024-01-30 11:06:45 、2024/01/30 11:06:45),因此对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解、以及其pattern属性来指定日期格式。 日期类型的GET、POST请求,后端接收参数的方式相同。

  • 接收规则:1)在后端使用@DateTimeFormat注解、pattern属性指定日期格式,前端的日期参数必须按照该指定格式传递,否则无法接收;2)后端controller方法中,需要使用Date类型或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 "success"; } } 
  • Apipost发送GET、POST请求

在这里插入图片描述

在这里插入图片描述

2.5 JSON参数 常用

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

注意:JSON格式的数据需要放在请求体中中,故只能用POST请求方式传递JSON格式的数据。

  • 接收规则在pojo中定义实体类来接收JSON格式的数据,使用@RequestBody标识
  • 具体代码
//Address、User定义同2.2.2 @RestController public class RequestController { 
    //JSON参数 @RequestMapping("/jsonParam") public String jsonParam(@RequestBody User user) { 
    System.out.println(user); return "success"; } } 
  • Apipost发送POST请求

在这里插入图片描述

2.6 路径参数

传统的开发中请求参数是放在请求体传递(POST请求)或跟在URL后面通过?key=value的形式传递(GET请求)。

在现在的开发中经常还会直接在请求的URL中传递参数,即请求参数成为了URL的一部分,我们称之为路径参数。如

http://localhost:8080/user/1 http://localhost:880/user/1/0 
  • 接收规则前端通过请求URL直接传递参数;后端使用{…}来标识该路径参数,使用@PathVariable获取路径参数

补充:路径参数的GET、POST请求,后端接收参数的方式相同。

因为前端传递的路径参数是可变的,所以后端接收到路径参数时,使用”{key}”方式来标记路径参数。

@PathVariable注解:1)获取到路径参数{id} 2)把路径参数绑定到形参变量id

  • 具体代码
@RestController public class RequestController { 
    //路径参数 单个路径参数 @RequestMapping("/path/{id}") public String pathParam(@PathVariable("id") Integer id) { 
    System.out.println(id); return "success"; } // // @RequestMapping("/path/{id}") // public String pathParam(@PathVariable Integer id) { 
    // System.out.println(id); // return "success"; // } //路径参数 多个路径参数 @RequestMapping("/path/{id}/{name}") public String pathParam2(@PathVariable("id") Integer id, @PathVariable("name") String name) { 
    System.out.println(id + " : " + name); return "success"; } } 

1)在 Spring MVC 中,@PathVariable 注解的 value 属性用于指定 URL 中路径变量的名称。路径变量是指 URL 中的占位符,通过占位符可以从 URL 中提取出具体的数值,并将其绑定到方法参数上。

在第一个示例中,@PathVariable 注解的 value 属性被设置为 “id”。这意味着在接收到 /path/123 的请求时,Spring MVC 将会提取出路径变量 “123” 并将其绑定到 id 参数上。

2)需要注意的是,value 属性是可选的,如果省略该属性,则默认使用方法参数的名称作为路径变量的名称。

在第2个示例中,@PathVariable 注解没有指定 value 属性,即value 属性被省略了。但占位符的名称默认为 “id”,与方法参数的名称相同。

因此,value 属性使我们能够显式地指定路径变量的名称,从而增加代码的可读性和灵活性。

  • Apipost发送GET、POST请求
    单个路径参数
    在这里插入图片描述

在这里插入图片描述
多个路径参数

在这里插入图片描述

在这里插入图片描述

三、总结

在这里插入图片描述

总的来说,除了JSON类型参数只能用POST请求方式传递;其他几种类型的GET、POST方式,在前端请求格式可能有所不同,但后端接收参数的方式是相同的。

参考黑马程序员对应章节视频

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/113162.html

(0)
上一篇 2025-12-16 12:33
下一篇 2025-12-16 14:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信