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

news2025/6/4 14:54:39

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

 --- 笔记截图。

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查询


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2396065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建基于VsCode的ESP32的开发环境教程

一、VsCode搜索ESP-IDF插件 根据插件处搜索找到ESP-IDF并安装 安装完成 二、配置安装ESP-IDF 配置IDF 按照如下配置,点击安装 安装完成 三、使用案例程序 创建一个闪光灯的例子程序,演示程序编译下载。 选择blink例子,闪烁LED的程序 选…

【MFC】初识MFC

目录 01 模态和非模态对话框 02 静态文本 static text 01 模态和非模态对话框 首先我们需要知道模态对话框和非模态对话框的区别: 模态对话框是一种阻塞时对话框,它会阻止用户与应用程序的其他部分进行交互,直到用户与该对话框进行交互并关…

如何通过数据分析优化项目决策

通过数据分析优化项目决策需从明确数据分析目标、选择适当的数据分析工具、确保数据质量、建立数据驱动文化等方面入手,其中,明确数据分析目标是优化决策过程的基础,只有清晰明确的数据分析目标才能指导有效的数据采集与分析,避免…

2024年数维杯国际大学生数学建模挑战赛B题空间变量协同估计方法研究解题全过程论文及程序

2024年数维杯国际大学生数学建模挑战赛 B题 空间变量协同估计方法研究 原题再现: 在数理统计学中,简单采样通常假设来自相同总体的采样点彼此独立。与数理统计相反,空间统计假设空间变量的采样点是相依的,并在其值中表现出某些趋…

leetcode hot100刷题日记——34.将有序数组转换为二叉搜索树

First Blood:什么是平衡二叉搜索树? 二叉搜索树(BST)的性质 左小右大:每个节点的左子树中所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。 子树也是BST:左子树和右子树也…

网页自动化部署(webhook方法)

实现步骤: 宝塔安装宝塔WebHook 2.5插件。 github 上配置网页仓库(或可在服务器的网页根目录clone)。 配置宝塔WebHook 2.5 添加hook脚本; 编辑添加syncJC脚本; #!/bin/bash # 定义网站根目录 WEBROOT"/www…

AU6825集成音频DSP的2x32W数字型ClaSSD音频功率放大器(替代TAS5825)

1.特性 ● 输出配置 - 立体声 2.0: 2 x 32W (8Ω,24V,THD N 10%) - 立体声 2.0: 2 x 26W (8Ω,21V,THD N 1%) ● 供电电压范围 - PVDD:4.5V -26.4V - DVDD: 1.8V 或者 3.3V ● 静态功耗 - 37mA at PVDD12V ● 音频性能指标 - THDN ≤ 0.02% at 1W,1kHz - SNR ≥ 107dB (A-wei…

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服务体验全流程

华为云 Flexus 与 DeepSeek-V3/R1 的深度整合,构建了一套 “弹性算力 智能引擎” 的协同体系。 Flexus 系列云服务器基于柔性计算技术,通过动态资源调度(如 Flexus X 实例)实现 CPU / 内存的实时弹性分配,尤其适合大模…

C# NX二次开发-查找连续倒圆角面

在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。 可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。 代码: Tag[] 查找连续倒圆角面(Tag faceTag) {theUf.Modl.AskFaceType(faceTag, out int typ…

今天遇到的bug

先呈现一下BUG现象。 这主要是一个传参问题,参数一直传不过去。后来我才发现,问题所在。 我们这里用的RquestBody接收参数,所有请求的参数需要用在body体中接收,但是我们用postman,用的是字符串查询方式传参&#x…

长安链智能合约命令解析(全集)

创建命令解析 ./cmc client contract user create \ --contract-namefact \ --runtime-typeWASMER \ --byte-code-path./testdata/claim-wasm-demo/rust-fact-2.0.0.wasm \ --version1.0 \ --sdk-conf-path./testdata/sdk_config.yml \ --admin-key-file-paths./testdata/cryp…

一、OpenCV的基本操作

目录 1、OpenCV的模块 2、OpenCV的基础操作 2.1图像的IO操作 2.2绘制几何图形 2.3获取并修改图像中的像素点 2.4 获取图像的属性 2.5图像通道的拆分与合并 2.6色彩空间的改变 3、OpenCV的算数操作 3.1图像的加法 3.2图像的混合 3.3总结 1、OpenCV的模块 2、OpenCV的基…

裂缝仪在线监测装置:工程安全领域的“实时守卫者”

在基础设施运维领域,裂缝扩展是威胁建筑结构安全的核心隐患之一。传统人工巡检方式存在效率低、时效性差、数据主观性强等局限,而裂缝仪在线监测装置通过技术迭代,实现了对结构裂缝的自动化、持续性追踪,为工程安全评估提供科学依…

【论文精读】2024 ECCV--MGLD-VSR现实世界视频超分辨率(RealWorld VSR)

文章目录 一、摘要二、问题三、Method3.1 Latent Diffusion Model3.2 Motion-guided Diffusion Sampling3.3 Temporal-aware Decoder Fine-tuning 四、实验设置4.1 训练阶段4.2 训练数据 贡献总结 论文全称: Motion-Guided Latent Diffusion for Temporally Consis…

SpringBoot简单体验

1 Helloworld 打开:https://start.spring.io/ 选择maven配置。增加SpringWeb的依赖。 Generate之后解压,代码大致如下: hpDESKTOP-430500P:~/springboot2/demo$ tree ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── s…

2025年通用 Linux 服务器操作系统该如何选择?

2025年通用 Linux 服务器操作系统该如何选择? 服务器操作系统的选择对一个企业IT和云服务影响很大,主推的操作系统在后期更换的成本很高,而且也有很大的迁移风险,所以企业在选择服务器操作系统时要尤为重视。 之前最流行的服务器…

Azure devops 系统之五-部署ASP.NET web app

今天介绍如何通过vscode 来创建一个asp.net web app,并部署到azure 上。 创建 ASP.NET Web 应用 在您的计算机上打开一个终端窗口并进入工作目录。使用 dotnet new webapp 命令创建一个新的 .NET Web 应用,然后将目录切换到新创建的应用。 dotnet new webapp -n MyFirstAzu…

学习路之PHP--easyswoole_panel安装使用

学习路之PHP--easyswoole_panel安装使用 一、新建文件夹二、安装三、改配置地址四、访问 IP:Port 自动进入index.html页面 一、新建文件夹 /www/wwwroot/easyswoole_panel 及配置ftp 解压easyswoole_panel源码 https://github.com/easyswoole-panel/easyswoole_panel 二、安…

【拓扑排序】P6560 [SBCOI2020] 时光的流逝|普及+

本文涉及知识点 C图论 拓扑排序 P6560 [SBCOI2020] 时光的流逝 题目背景 时间一分一秒的过着,伴随着雪一同消融在了这个冬天, 或许,要是时光能停留在这一刻,该有多好啊。 … “这是…我在这个小镇的最后一个冬天了吧。” “嗯…

SSRF 接收器

接收请求 IP.php <?php // 定义日志文件路径 $logFile hackip.txt;// 处理删除请求 if (isset($_POST[delete])) {$ipToDelete $_POST[ip];$lines file($logFile, FILE_IGNORE_NEW_LINES);$newLines array();foreach ($lines as $line) {$parts explode( | , $line);…