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

  • 当我们访问各种网页时,之所以能够看到页面,是因为浏览器向服务器发送了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/112294323

二、后端接收参数

前端传来请求参数,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 Integer id) {
        System.out.println(id);
        return "success";
    }


    //路径参数  多个路径参数
    @RequestMapping("/path/{id}/{name}")
    public String pathParam2(@PathVariable Integer id, @PathVariable String name) {
        System.out.println(id + " : " + name);
        return "success";
    }
}
  • Apipost发送GET、POST请求
    单个路径参数
    在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

三、总结

在这里插入图片描述

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

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

  • 24
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值