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

由enctype-引出post与get的关系,最后深究至请求/响应报文

本篇载自我的笔记,本次为第二次复习。我觉得我有能力理一下思路了。

 --- 笔记截图。

enctype

HTML 表单的 enctype(Encode Type,编码类型)属性用于控制表单数据在提交到服务器时的编码方式,不同取值的详细解析如下:

1. enctype="application/x-www-form-urlencoded"(默认值)

  • 编码方式:表单数据会被编码为 “名称 / 值” 对 的形式,即 key=value,多个值之间用 & 符号连接(如 name=John&age=30)。所有非字母数字字符会被转义(例如空格转为 %20,特殊符号转为 %xx 形式)。
  • 适用场景:
  • 请求方法:支持 GET 和 POST。若为 GET,数据会拼接到 URL 中;若为 POST,数据会放在请求体中。

2. enctype="multipart/form-data"

  • 编码方式:表单数据会被编码成 多个独立的数据块(消息部分),每个表单控件对应一个数据块,块与块之间用随机生成的边界字符串(如 --boundary)分隔。这种方式不会对数据进行 URL 编码,支持二进制数据(如文件)。
  • 适用场景:
  • 请求方法:必须使用 POST。因为数据量可能较大且包含二进制内容,不适合通过 URL(GET)传递。

3. enctype="text/plain"

  • 编码方式:表单数据以 纯文本形式 编码,仅对空格进行简单处理(转换为加号 +),不对其他字符转义(如特殊符号保持原样)。
  • 适用场景:
  • 请求方法:支持 GET 和 POST,但因编码过于简单,无法处理复杂数据(如特殊符号、二进制文件),使用场景受限。

总结对比

enctype

编码特点

典型用途

请求方法限制

application/x-www-form-urlencoded

键值对,全面转义

普通文本表单(如登录、注册)

无(GET/POST均可)

multipart/form-data

分块传输,支持二进制数据

文件上传、含文件的表单

必须为POST

text/plain

纯文本,仅简单处理空格

极少用(简单文本调试)

无(GET/POST均可)

理解这些区别后,可根据表单内容(是否含文件、特殊字符等)选择合适的 

enctype,确保服务器能正确解析数据。

GET与POST的区别

在 HTTP 协议中,GET 和 POST 是两种常用的请求方法,它们的作用及特点如下:

一、GET 的作用

  • 核心作用:从指定服务器获取数据,本质类似 “读取” 操作,例如获取网页内容、查询信息、加载资源等。
  • 数据传输方式:
    • 将数据以键值对形式附加在 URL 末尾(如 https://example.com/search?q=keyword&page=1),通过 URL 传递给服务器。
    • 数据会被编码为 application/x-www-form-urlencoded 形式(默认编码),非字母数字字符会被转义(如空格转 +,特殊符号转 %xx)。
  • 典型场景:
    • 搜索引擎搜索内容,浏览器通过 GET 请求获取搜索结果。
    • 加载静态资源(如图片、CSS、JS 文件),或简单查询数据(如分页加载商品列表)。
  • 特点:
    • 请求可被缓存,生成的 URL 可保存为书签或被浏览器记录在历史中。
    • 有长度限制(受 URL 长度制约,通常为 2048 字符左右),不适合传输大量或敏感数据(因参数暴露在 URL 中)。

二、POST 的作用

  • 核心作用:向服务器提交数据,用于修改服务器状态,例如提交表单、上传文件、创建或更新资源等。
  • 数据传输方式:
    • 数据放在请求体(Request Body)中,与 HTTP 请求一同发送给服务器。
    • 支持多种编码方式:
      • 若需上传文件或二进制数据,需用 multipart/form-data 编码(此时请求方法必须为 POST),数据被拆分为多个独立部分传输。
      • 普通文本数据也可用 application/x-www-form-urlencoded 编码(类似 GET,但数据在请求体中);text/plain 编码则以纯文本传输(极少用)。
  • 典型场景:
    • 用户登录、注册时提交账号密码(数据在请求体,相对安全)。
    • 上传文件、图片,或提交复杂表单(如含大量文本、多选框等)。
  • 特点:
    • 数据不暴露在 URL 中,相对安全(但仍需结合 HTTPS 进一步加密)。
    • 无长度限制(理论上可传输大量数据),请求通常不会被缓存。

三、结合 enctype 理解 GET/POST 的适用场景

  • 当 enctype="application/x-www-form-urlencoded"(默认值):
    • GET 和 POST 都可使用这种编码,但 GET 数据在 URL,POST 数据在请求体。简单文本数据提交两者皆可,但涉及敏感信息或稍大量数据时更适合 POST。
  • 当 enctype="multipart/form-data":
    • 必须使用 POST。因为该编码用于上传文件、二进制数据等复杂场景,数据量通常较大且需分块传输,只有 POST 支持这种方式(GET 无法处理)。
  • 当 enctype="text/plain":
    • GET 和 POST 也可使用,但该编码过于简单(仅简单处理空格),实际中很少用,仅在极简单文本传输时考虑。

HTTP报文

HTTP 消息结构 | 菜鸟教程 --- 通过这个深入了解报文

直接看菜鸟,你可以获得与众不同的体验。

一、什么是 HTTP 报文?(核心总览)

定义

HTTP 报文是客户端(如浏览器)与服务器之间通信的 数据载体,分为两种:

  • 请求报文(客户端→服务器,比如你输入网址时发送的消息)
  • 响应报文(服务器→客户端,比如服务器返回的网页数据)
通用结构(无论是请求还是响应,都遵循这个格式):

起始行(First Line) 头部(Headers) 空行(必须有,分隔头部和主体) 主体(Body,可选)

可以类比为一封 “信”:

  • 起始行:像信封上的 “收信地址”(请求)或 “回信状态”(响应)
  • 头部:像信封上的 “邮编、寄件人信息”(附加说明)
  • 主体:像信的 “正文”(真正的内容)

1、响应报文 的三大核心部分(重点!)

1. 响应行(Status Line)
  • 位置:响应报文的 第一行,唯一且必须存在。
  • 作用:告诉客户端 “服务器处理请求的结果如何”。
  • 结构:由三个部分组成,用空格分隔:
HTTP版本号 状态码 状态消息
  • 示例(来自之前的天气 API 响应):
HTTP/1.1 200 OK
    • HTTP 版本号:如 HTTP/1.1、HTTP/2,表示使用的 HTTP 协议版本。
    • 状态码(关键!):三位数,分类如下:
      • 1xx:临时响应(如 101 切换协议)
      • 2xx:成功(如 200 OK 表示请求成功)
      • 3xx:重定向(如 301 永久重定向)
      • 4xx:客户端错误(如 404 Not Found 表示资源不存在)
      • 5xx:服务器错误(如 500 Internal Server Error 表示服务器崩了)
    • 状态消息:对状态码的简短描述(如 OK、Not Found),方便人类阅读,服务器可自定义(但状态码是固定的)。
2. 响应头部(Headers)
  • 位置:响应行之后,空行之前,由多行 键: 值 组成。
  • 作用:附加说明 “如何处理响应体” 或 “服务器的额外信息”。
  • 常见示例:
Content-Type: application/json // 响应体的格式(如JSON、HTML、图片)Content-Length: 150 // 响应体的字节长度Date: Tue, 29 Apr 2025 12:00:00 GMT // 服务器生成响应的时间 Server: Apache/2.4.52// 服务器软件名称

  • 关键头部 Content-Type:必须存在,告诉客户端 “用什么方式解析响应体”(比如 text/html 表示 HTML 网页,image/png 表示图片)。
3. 响应体(Body)
  • 位置:空行之后,可选(有些响应没有体,比如 204 No Content 状态码)。
  • 作用:服务器返回的 具体数据内容,是响应的 “正文”。
  • 常见内容:
    • 网页 HTML(如你访问百度时,服务器返回的 HTML 代码)
    • 接口数据(如 JSON、XML,比如天气 API 返回的天气信息)
    • 二进制文件(如图片、视频、PDF,直接传输字节数据)
  • 示例(天气 API 的响应体,JSON 格式):
{ "city": "北京","temperature": "25°C" 
}
  • 注意:
    • 响应体是否存在,由状态码决定(如 200 OK 通常有体,302 重定向 可能没有体)。
    • 响应体的长度由 Content-Length 头部指定,或通过 Transfer-Encoding: chunked 分块传输(用于大文件)。

2、请求报文

请求报文大体上与响应报文差不多。

3、对比 请求报文 和 响应报文(避免混淆)

部分

请求报文

响应报文

起始行

请求行(Method URL Version)

例:GET /weather?city=北京  HTTP/1.1

响应行(Version StatusCode StatusMessage)

例:

HTTP/1.1  200   OK

头部

包含客户端信息(如

User-Agent、Cookie)

包含服务器信息(如

Server、Content-Type)

主体(Body)

可选(GET请求没有体,

POST请求有体)

可选(部分状态码没有体,如204)

通过浏览器开发者工具观察真实的报文,是理解这些概念的最快方式!有了这个基础,后续学习 HTTP 协议会更轻松~

二、以报文的视角分析get与post

GET 和 POST 方法的核心区别,以及它们在 响应报文 中的关联逻辑。以下是系统化讲解:

一、核心本质:GET 和 POST 是什么?

  • 共同点:都是 HTTP 请求方法(用于告诉服务器 “客户端想做什么”)。
  • 核心区别:
    • GET:获取资源(从服务器 “拿” 数据)。
    • POST:提交资源(向服务器 “发送” 数据,让服务器处理或存储)。

二、在 请求报文 中的具体区别(重点!)

1. 请求行(第一行)的差异

方法

请求行格式

示例(以获取 / 提交天气数据为例)

GET

GET URL?参数 HTTP版本

GET /weather?city=北京 HTTP/1.1

(参数在 URL 中)

POST

POST URL HTTP版本

POST /submit-weather HTTP/1.1

(参数在请求体中)

  • 关键区别:
    • GET 的参数必须附加在 URL 中(如 ?city=北京&type=today),直接可见。
    • POST 的参数放在 请求体(Body) 中,URL 中没有参数(或仅有无关的路径)。

2. 请求体(Body)的存在性

  • GET 请求:没有请求体(规范规定不允许有 Body,虽然某些客户端可能支持,但服务器通常忽略)。
  • POST 请求:必须有请求体(用于存放提交的数据,如表单、JSON 等)。

3. 请求头部(Headers)的差异

  • GET 请求:头部中可能包含 User-Agent、Cookie 等客户端信息,但无需声明请求体格式(因为没有体)。
  • POST 请求:必须包含 Content-Type 头部,告诉服务器 请求体的数据格式,例如:
Content-Type: application/x-www-form-urlencoded  // 表单数据(键值对)
Content-Type: application/json                    // JSON数据

4. 参数的安全性与可见性

  • GET:参数暴露在 URL 中,会被浏览器记录、服务器日志留存,不安全(如密码不能用 GET 传递)。
  • POST:参数在请求体中,URL 干净,相对安全(但数据是否加密取决于是否用 HTTPS)。

5. 幂等性与安全性(HTTP 规范特性)

  • 幂等性:多次调用效果是否一致。
    • GET:幂等(多次获取同一资源,结果不变,如刷新网页)。
    • POST:非幂等(多次提交可能创建多个资源,如重复提交表单会生成多条数据)。
  • 安全性:
    • GET:安全(理论上不会修改服务器数据,仅读取)。
    • POST:不安全(会修改服务器数据,如提交订单、发布评论)。

6. 常见使用场景

  • GET:
    • 搜索(如百度搜索,参数在 URL 中)。
    • 获取文章、图片、API 数据(如天气 API:GET /api/weather?city=上海)。
  • POST:
    • 登录(提交用户名密码,避免暴露在 URL)。
    • 提交表单(如注册信息、上传文件)。
    • 接口数据提交(如向服务器发送 JSON 格式的用户信息)。

三、完整请求 - 响应流程对比(以 “获取天气” 和 “提交天气” 为例)

场景 1:GET 请求(获取北京天气)

请求报文:
GET /weather?city=北京 HTTP/1.1       // 请求行:GET方法,参数在URL
Host: api.weather.com                 // 头部:指定域名
User-Agent: Mozilla/5.0 (Windows)...   // 头部:客户端信息
响应报文:

HTTP/1.1 200 OK                       // 响应行:成功
Content-Type: application/json         // 头部:体是JSON格式{                                      // 响应体:天气数据"city": "北京","temp": "25°C"
}

场景 2:POST 请求(提交上海天气数据)

请求报文:

POST /submit-weather HTTP/1.1          // 请求行:POST方法,URL无参数
Host: api.weather.com                  // 头部:域名
Content-Type: application/json         // 头部:声明体是JSON
Content-Length: 50                     // 头部:体的长度{                                      // 请求体:提交的数据"city": "上海","temp": "28°C"
}
响应报文:

HTTP/1.1 201 Created                   // 响应行:资源已创建
Location: /weather/123                 // 头部:新资源的URL
Content-Type: text/plain               // 头部:体是纯文本提交成功,数据已存储!                 // 响应体:处理结果

四、核心总结(对比表格)

对比项

GET

POST

请求目的

获取资源(读操作)

提交资源(写操作)

请求行方法

GET URL?参数 HTTP/版本

POST URL HTTP/版本

请求体

无(不允许有 Body)

有(必须包含提交的数据)

参数位置

URL 中(可见,不安全)

请求体中(相对安全)

幂等性

幂等(多次请求结果一致)

非幂等(多次请求可能创建多个资源)

安全性

安全(理论上不修改服务器数据)

不安全(会修改服务器数据)

常见状态码

200 OK

(成功获取)

201 Created

(成功创建)或

200 OK

缓存支持

支持缓存

通常不缓存

典型场景

搜索、获取数据、访问网页

登录、提交表单、上传文件、创建资源


借鉴: 

1、我的笔记 

2、AI查询


望我能在,每一次复习中,都能发现惊喜

相关文章:

  • windows系统下通过visual studio使用clang tooling
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(二十八) -> 开发云对象
  • 变更数据捕获(CDC)与流处理引擎实现医疗数据实时同步(下)
  • 【Python】3.函数与列表
  • 2025.05.28-华为暑期实习第二题-200分
  • Python 科学计算有哪些提高运算速度的技巧
  • 机器人--里程计
  • Java—多线程
  • DM达梦数据库开启SQL日志记录功能
  • DeepSeek 工作应用深度指南
  • xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行
  • 【人工智能】DeepSeek的AI狂想曲:从训练到应用的交响乐
  • Lesson 9 防火墙 iptables 和 firewalld
  • 金山云Q1营收19.7亿元 AI持续释放业务增长新动能
  • 暗通道先验去雾算法实现
  • NW845NW850美光闪存颗粒NW883NW889
  • Linux云计算训练营笔记day18(Python)
  • 18度的井水
  • 写给新人的深度学习扫盲贴:TensorFlow与Keras
  • Java数值字符串相加
  • 电子商务网站建设试卷.doc/seo的基础优化
  • 手机网站建站教育模板下载/百度助手app下载
  • wordpress5g够不够/宁波优化网页基本流程
  • 贵阳建站公司模板/游戏推广员好做吗
  • 网站接入服务单位名称/本地免费发布信息网站
  • 公积金门户网站建设方案/百度云网盘资源搜索引擎入口