当前位置: 首页 > news >正文

HTTP 请求方法:GET 与 POST

一、核心定义与用途

请求方法

核心定义

典型用途

GET

从服务器获取资源,请求参数附加在 URL 中

1. 搜索(如百度搜索关键词)
2. 分页查询(如 ?page=1&size=10
3. 访问静态页面 / 图片

POST

向服务器提交资源 / 数据,请求参数放在请求体(Body)中

1. 表单提交(如登录、注册)
2. 上传文件(如头像、文档)
3. 提交复杂数据(如订单信息)

二、底层原理:HTTP 请求结构差异

HTTP 请求由「请求行 + 请求头 + 空行 + 请求体」组成,二者核心差异在参数承载方式与请求体使用:

组成部分

GET 请求特点

POST 请求特点

请求行

参数拼接到 URL 后,格式:
GET /api/search?keyword=phone&page=1 HTTP/1.1

URL 仅含路径,无参数,格式:
POST /api/login HTTP/1.1

请求头

无需指定 Content-Type;可能含 If-Modified-Since(缓存验证)

必须指定 Content-Type(告知数据格式),常见值:
application/x-www-form-urlencoded(表单默认)
multipart/form-data(文件上传)
application/json(接口常用)

请求体(Body)

空(手动添加也会被多数服务器忽略)

非空,承载所有请求数据,格式由 Content-Type 定义

三、关键区别对比(7 大维度)

对比维度

GET 请求

POST 请求

数据位置

URL 后(URL?key1=val1&key2=val2),可见

请求体(Body)中,URL 不可见

数据长度

受 URL 长度限制(浏览器 / 服务器通常约 2KB~8KB)

无明确限制,可传大体积数据(如文件)

数据类型

仅支持 ASCII 字符(非 ASCII 需 URL 编码)

支持任意类型(文本、二进制、JSON 等)

缓存性

可被浏览器 / CDN 缓存(如刷新用缓存)

默认不缓存,需手动配置 Cache-Control

安全性

数据暴露在 URL(浏览器历史、日志可见)

数据隐藏在请求体,需配合 HTTPS 才真正安全

幂等性

幂等(多次请求结果一致,无副作用)

非幂等(多次请求可能产生不同结果,如重复下单)

后退 / 刷新

刷新无提示,无风险

刷新提示 “重新提交”,可能重复触发操作

四、数据传递细节

1. GET 请求:URL 参数限制与编码

  • 参数编码:非 ASCII 字符(中文、@#&)需 URL 编码(如 “手机”→%E6%89%8B%E6%9C%BA),否则乱码 / 请求失败。

  • 长度限制本质:HTTP 无限制,是浏览器 / 服务器限制(Chrome 约 2KB~8KB,Nginx 默认 4KB)。

  • 参数可见风险:记录在浏览器地址栏、历史记录、服务器日志,绝对不能传敏感数据(密码、手机号)。

2. POST 请求:请求体格式(按 Content-Type 区分)

Content-Type 类型

数据格式示例

典型用途

application/x-www-form-urlencoded

username=admin&password=123456

普通表单提交(登录、注册)

multipart/form-data

含文本参数 + 二进制文件(用 Boundary 分隔)

文件上传(头像、Excel)

application/json

{"username":"admin","roles":["admin"]}

前后端分离接口(复杂结构化数据)

text/plain

hello, plain text

纯文本传递(极少用)

  • 长度限制:HTTP 无限制,服务器会配置上限(Nginx 默认 1MB,Spring Boot 默认 10MB,可调整)。

五、实践场景:使用边界

1. 必须用 GET 的场景

  • 缓存依赖:需浏览器 / CDN 缓存(如电商商品列表 ?category=3&page=2),减少服务器压力。

  • 书签 / 分享:参数需在 URL 中(如知乎回答页 https://zhihu.com/question/123/answer/456),支持保存 / 分享。

  • 幂等要求:多次请求结果一致(如查用户信息 /api/user?id=123、查订单 /api/order?no=20240815)。

2. 必须用 POST 的场景

  • 敏感数据:密码、银行卡号等(即使加密也不能放 URL,如登录接口传 password、支付接口传 bankCardNo)。

  • 大体积数据:超过 URL 长度(如 5MB 头像)、二进制文件(如视频)。

  • 非幂等操作:多次请求有副作用(如创建订单、支付扣款、发短信),需后端做 “防重复提交”(加 token)。

六、安全性误区澄清

  1. “POST 比 GET 更安全”:需加前提 —— 未用 HTTPS 时,二者都不安全(GET 抓包看 URL,POST 抓包看请求体);真正安全依赖 HTTPS 加密整个请求

  2. “GET 不能传复杂数据”:技术上可传数组(?ids=1&ids=2),但易超 URL 长度、可读性差,复杂数据(嵌套对象、数组)必须用 POST + JSON

  3. “POST 不会被缓存”:默认不缓存,可手动设响应头(Cache-Control: max-age=3600),但仅适用于 “非幂等 POST”(如查固定配置 /api/config),禁止用于创建 / 修改接口

七、示例对比(直观理解)

示例 1:GET 查商品列表

  • 请求行GET /api/goods?category=手机&page=2&pageSize=10 HTTP/1.1

  • 请求体:空

  • 关键特点:URL 含参数,可缓存,幂等,无敏感数据。

示例 2:POST 用户登录(HTTPS 加密)

  • 请求行POST /api/user/login HTTP/1.1

  • 请求头Content-Type: application/json

  • 请求体{"username":"admin123","password":"Abc@123456"}

  • 关键特点:参数在请求体,不缓存,非幂等,敏感数据需加密。

八、核心决策清单(开发时判断步骤)

  1. 操作类型:“获取数据”→GET,“提交数据”→POST;

  2. 数据特性:敏感 / 超 URL 长度 / 二进制→POST;

  3. 场景需求:需缓存 / 分享 / 幂等→GET;

  4. 最后检查:敏感接口是否用 HTTPS?非幂等 POST 是否加防重复提交 token?

http://www.lryc.cn/news/621565.html

相关文章:

  • STM32L051 RTC闹钟配置详解
  • 《JMeter核心技术、性能测试与性能分析》 教学大纲及标准
  • 硬核实用!R+贝叶斯解决真实问题:参数估计(含可靠性分析) + 回归建模(含贝叶斯因子比较) + 生产级计算实践 赠「常见报错解决方案」秘籍!
  • 电商架构测试体系:ZKmall开源商城筑牢高并发场景下的系统防线
  • Jmeter自定义脚本
  • Easy Rules 规则引擎详解
  • 【测试工具】JMeter基本使用及MySQL数据库压力测试
  • Stagehand深度解析:从开源自动化工具到企业级RPA平台的演进之路
  • 新手向:Python函数定义与参数传递(位置参数、关键字参数、默认参数)
  • Unity输入系统:旧版Input_System
  • 大气负氧离子自动监测站:解密空气的科技密码
  • SSL和TLS协议的消息认证码(MAC)
  • 【opencv-Python学习笔记(5):几何变换】
  • 《Effective Java》第1条:用静态工厂方法代替构造器
  • 【R语言】R 语言中 gsub 与正则表达式详解(含 POSIX 与 Perl 风格实例)
  • 【R语言】更换电脑后,如何在新设备上快速下载原来设备的 R 包?
  • 智能体开发实战:用Deepseek做一个生成思维导图的智能体
  • 2025高防IP vs 普通IP:本质差异与选型指南
  • 移动板房的网络化建设
  • StarRocks集群部署
  • 39 C++ STL模板库8-容器1-array
  • 常见IP模块的仲裁策略和实现
  • YOLO11分割模型使用rknn2量化部署
  • 网络安全蓝队常用工具全景与实战指南
  • 【DDIA】第二部分:分布式数据
  • 从零到一:发布你的第一个 npm 开源库(2025 终极指南)
  • Elasticsearch赋能规章制度智能检索:从海量文档到秒级响应
  • app-5 控制卡升级
  • 【CV 目标检测】②R-CNN模型
  • 「iOS」————UITableView性能优化