GET将参数拼在URL后,出现在请求行中,enctype无效且文件字段被丢弃;POST将参数放请求体,依赖enctype指定编码格式,支持文件上传,需后端匹配中间件解析。

GET提交时,HTTP请求行和URL里塞满了参数
浏览器看到 method="get",就直接把所有有效字段(name 不为空、未 disabled)拼成查询字符串,追加到 action URL 后面,用 ? 分隔。整个参数部分会出现在 HTTP 请求行里,例如:
GET /search?q=hello%20world&page=2 HTTP/1.1
这意味着:
-
enctype属性完全被忽略,设成"multipart/form-data"或任何值都无效 -
<input type="file">字段不会被序列化,直接丢弃 - 如果
action本身已带参数(如/search?src=form),新参数会追加在后面,变成/search?src=form&q=...,但原始参数仍存在 - 服务器必须从 URL 查询字符串解析数据,比如 Express 中读
req.query,而不是req.body
POST提交时,请求行干净,参数全在请求体里
method="post" 不决定编码格式,真正起作用的是 enctype。默认是 "application/x-www-form-urlencoded",此时请求报文长这样:
POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded username=admin&password=123456
关键点:
- 请求行只有路径,不暴露参数;敏感信息(如密码)不会出现在日志、代理记录或浏览器地址栏
- 若含文件上传,必须显式设置
enctype="multipart/form-data",否则后端只能收到文件名字符串,拿不到二进制内容 - 后端需对应解析请求体:
express.urlencoded()处理默认编码,express.multipart()或第三方中间件(如busboy)处理文件 - 漏写
method属性时,浏览器按规范默认用get,哪怕你写了enctype="multipart/form-data",文件字段也照样消失
常见错误:后端收不到参数,其实是method没对上
80% 的「req.body 是空对象」或「req.query 有值但不该有」问题,根源都在 method 属性本身:
- 写成
Method="GET"或method="Post":大小写不敏感但非规范,部分浏览器降级为get,后端却在等req.body - 漏写
method:浏览器自动按get处理,但你后端代码写了req.body.username—— 必然undefined - 前端 JS 动态改
form.method赋了非法值(如"submit"或"PUT"):浏览器不识别,静默 fallback 到get - 后端没配好中间件:比如 Express 没启用
express.urlencoded({ extended: true }),method="post"的普通字段也会进不了req.body
刷新行为暴露语义误用,不是 bug 是设计
用户点刷新按钮时:
-
method="get"请求会干净重发一次——适合搜索、分页这类幂等操作 -
method="post"请求大概率触发「确认重新提交」弹窗——这不是防重复,而是提醒你:这次提交可能已改变状态(如下单、删数据)
如果你用 post 实现搜索,不仅违背 HTTP 语义,还会让 CDN 缓存失效、前端路由复用困难、服务端日志分析失真。真正的边界不在“要不要加密”,而在“这个操作是否该被缓存、分享、重放”。


















