GET与POST请求详解:区别、POST请求体格式及Controller接收方案

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

一、GET请求与POST请求核心区别

GET和POST同属HTTP请求方法,本质差异源于HTTP协议设计语义数据传输机制,并非简单的“参数位置不同”。以下从核心维度做对比梳理:

设计语义

用于获取/查询服务器资源,无副作用(幂等)

用于提交/修改服务器资源,非幂等(多次请求可能产生不同结果)

数据传输位置

数据拼接在URL地址栏(Query参数),可见性高

数据存放在请求体(Request Body),URL无参数,隐蔽性更强

数据长度限制

受浏览器/服务器URL长度限制(通常2KB-8KB),不适合传大量数据

无显性长度限制,由服务器配置决定,支持大容量数据传输

安全性

参数明文暴露,易被抓包、篡改,绝对不能传敏感数据

参数在请求体,相对隐蔽;仍需HTTPS加密,适合传账号、密码等敏感信息

缓存机制

默认被浏览器、代理服务器缓存,可复用请求结果

默认不缓存,需手动配置缓存规则

历史记录/书签

可加入浏览器历史记录,支持生成书签

不会保留在历史记录,无法生成书签

编码类型

仅支持ASCII字符,非ASCII需手动转码

支持多种编码(表单、JSON、二进制、文件等),适配各类数据格式

误区纠正:GET和POST的安全性、长度限制并非协议强制规定,而是浏览器/服务器的实现限制;POST也并非绝对安全,仅解决了参数可见性问题。

二、POST请求体的4种主流格式(Content-Type)

POST请求通过Content-Type请求头标识请求体格式,日常开发中核心有4种,覆盖绝大多数业务场景:

1. application/x-www-form-urlencoded(默认表单格式)

浏览器原生表单默认格式,数据以键值对&拼接形式传输,类似GET的Query参数,仅存放于请求体。仅支持文本数据,不支持文件上传

示例:username=zhangsan&password=123456

2. multipart/form-data(多部分表单格式)

专门用于文件上传+文本参数混合传输,请求体被分割为多个独立部分,每部分携带独立请求头,支持二进制文件、文本参数同时提交。

3. application/json(JSON格式)

前后端分离主流格式,请求体为标准JSON字符串,支持复杂对象、数组、嵌套结构传输,可读性和扩展性极强,是接口开发首选。

示例:{"username":"zhangsan","age":20,"hobbies":["篮球","读书"]}

4. binary(二进制流格式,application/octet-stream)

纯二进制数据传输,无固定结构,通常用于传输单个文件、字节流,不支持键值对参数,多用于文件下载、大文件流式上传。

三、Spring Boot Controller对应接收方式

针对上述4种POST请求体格式,Spring Boot提供了专属注解和接收方式,以下为实操代码示例:

1. 接收 application/x-www-form-urlencoded 格式

使用@RequestParam注解接收单个键值对,或用实体类+省略注解自动映射(Spring会自动绑定表单参数到实体属性)。

@RestController
@RequestMapping("/post")
public class PostController {
    // 单个参数接收
    @PostMapping("/form1")
    public String form1(@RequestParam String username, @RequestParam String password) {
        return "接收表单参数:username=" + username + ", password=" + password;
    }

    // 实体类自动映射
    @PostMapping("/form2")
    public String form2(User user) {
        return "接收实体参数:" + user.toString();
    }
}
// 实体类
class User {
    private String username;
    private String password;
    // getter/setter/toString
}

2. 接收 multipart/form-data 格式(文件+参数)

文本参数用@RequestParam,文件用MultipartFile接收;多文件/混合场景可用@RequestPart注解。

@PostMapping("/upload")
public String upload(@RequestParam String remark, @RequestParam MultipartFile file) {
    // 获取文件名
    String fileName = file.getOriginalFilename();
    // 文件处理逻辑(存储、解析等)
    return "上传备注:" + remark + ",文件名:" + fileName;
}

// 多文件上传
@PostMapping("/uploadBatch")
public String uploadBatch(@RequestParam MultipartFile[] files) {
    return "批量上传文件数:" + files.length;
}

3. 接收 application/json 格式

必须使用@RequestBody注解,将JSON字符串自动反序列化为Java实体类/Map集合,仅支持POST/PUT等带请求体的请求

@PostMapping("/json")
public String json(@RequestBody User user) {
    return "接收JSON参数:" + user.toString();
}

// 接收Map类型(无需实体类)
@PostMapping("/jsonMap")
public String jsonMap(@RequestBody Map<String, Object> paramMap) {
    return "接收Map参数:" + paramMap.toString();
}

4. 接收 binary 二进制流格式

通过HttpServletRequest获取输入流,直接读取二进制数据,适用于纯文件流传输。

@PostMapping("/binary")
public String binary(HttpServletRequest request) throws IOException {
    // 获取输入流读取二进制数据
    InputStream inputStream = request.getInputStream();
    // 字节数组接收文件流
    byte[] bytes = inputStream.readAllBytes();
    return "接收二进制数据长度:" + bytes.length;
}

四、补充注意事项

  • @RequestBody 冲突问题:一个接口只能有一个@RequestBody注解,无法同时接收多个JSON对象;复杂场景可封装为嵌套实体类。
  • 文件上传限制:Spring Boot默认文件上传大小有限制,需在application.yml配置修改:spring.servlet.multipart.max-file-size=100MB。
  • 参数必填校验:可搭配@NotBlank、@NotNull等校验注解,实现参数合法性校验。
  • GET请求也可携带请求体,但不符合HTTP协议语义,绝大多数服务器不支持,严禁生产环境使用。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Spring 文章被收录于专栏

本专栏聚焦Spring全生态体系,从IoC/AOP核心原理入手,覆盖Spring Boot自动配置、事务管理、Web开发等实战内容。拆解循环依赖、动态代理等高频面试难点,助力开发者从入门到精通,打通单体到微服务的技术链路,解决企业级开发痛点,提升架构设计与问题排查能力,成为Java后端进阶的必备技术专栏。

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11652次浏览 100人参与
# 你的实习产出是真实的还是包装的? #
2039次浏览 43人参与
# 米连集团26产品管培生项目 #
6162次浏览 216人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7709次浏览 43人参与
# 简历第一个项目做什么 #
31810次浏览 344人参与
# 重来一次,我还会选择这个专业吗 #
433644次浏览 3926人参与
# MiniMax求职进展汇总 #
24257次浏览 310人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187280次浏览 1122人参与
# 牛客AI文生图 #
21459次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152528次浏览 888人参与
# 研究所笔面经互助 #
118985次浏览 577人参与
# 简历中的项目经历要怎么写? #
310503次浏览 4227人参与
# AI时代,哪些岗位最容易被淘汰 #
64028次浏览 837人参与
# 面试紧张时你会有什么表现? #
30528次浏览 188人参与
# 你今年的平均薪资是多少? #
213214次浏览 1039人参与
# 你怎么看待AI面试 #
180280次浏览 1266人参与
# 高学历就一定能找到好工作吗? #
64348次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76622次浏览 374人参与
# 我的求职精神状态 #
448224次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363662次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160713次浏览 1112人参与
# 校招笔试 #
471536次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务