HTTP 协议中请求与响应的详细解析

news2025/3/28 17:03:13

前言:HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于在互联网上传输超文本的协议 --由一个请求和响应组成,一个完整的 HTTP 请求由请求行(Request Line)、请求头(Headers)和可选的请求体(Body)组成,一个 HTTP 响应由状态行(Status Line)、响应头(Headers)和响应体(Body)组成。


1 HTTP请求

Request Line<CRLF>

Header-Name: header-value<CRLF>

Header-Name: header-value<CRLF>

//一个或多个,均以<CRLF>结尾

<CRLF>

body//请求正文

1.1 请求行

以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下
Method Request-URI HTTP-Version CRLF

1.1.1 请求方法

其中Method表示请求方法,主要有这些方法:

请求方法描述
GET请求获取由 Request - URI 所标识的资源
POST在 Request - URI 所标识的资源后附加新的数据
HEAD请求获取由 Request - URI 所标识的资源的响应消息报头
PUT请求服务器存储一个资源,并用 Request - URI 作为其标识
DELETE请求服务器删除 Request - URI 所标识的资源
TRACE请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT保留将来使用
OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求

** 使用场景**

  • GET :访问网页:当你在浏览器的地址栏输入一个 URL 并回车时,浏览器会向服务器发送一个 GET 请求,请求该 URL 对应的网页资源。例如,访问 https://www.example.com。
    搜索数据:在搜索引擎中输入关键词进行搜索时,浏览器会将关键词作为查询参数附加在 URL 后面,向服务器发送 GET 请求。例如,https://www.google.com/search?q=apple。
  • POST:用户在网站的注册或登录表单中输入用户名、密码等信息,点击提交按钮后,浏览器会向服务器发送一个 POST 请求,将用户输入的数据发送到服务器进行处理。
    上传文件:当用户在网页上选择一个文件并点击上传按钮时,浏览器会使用 POST 请求将文件数据发送到服务器。
  • HEAD :检查资源是否存在:在下载文件之前,可以先使用 HEAD 请求检查文件是否存在,以及文件的大小和修改时间等信息。
    缓存验证:浏览器可以使用 HEAD 请求检查服务器上的资源是否有更新,从而决定是否需要重新下载资源。
  • PUT方法:更新用户信息:用户在网站上修改自己的个人信息后,浏览器会使用 PUT 请求将更新后的信息发送到服务器,更新服务器上存储的用户信息。
    文件上传与替换:将本地的文件上传到服务器指定的位置,如果该位置已经存在文件,则替换该文件
  • DELETE 方法:删除用户账户:用户在网站上选择删除自己的账户时,浏览器会向服务器发送一个 DELETE 请求,请求服务器删除该用户的账户信息。
    删除文件:在文件管理系统中,用户选择删除某个文件时,系统会使用 DELETE 请求将该文件从服务器上删除。

其他三个不常用

1.1.2 Request-URI

**Request-URI(请求统一资源标识符)**是用于指定客户端所请求资源的字符串。它就像是在互联网这个庞大的资源库中定位特定资源的 “地址”,帮助服务器明确客户端想要获取或操作的具体内容 。

组成部分
  • 路径:这是 Request - URI 的核心部分,用于指定服务器上资源的具体位置。它以 “/” 作为分隔符,代表了资源在服务器文件系统或应用程序中的层级结构。例如,/products/list.html表示服务器上 “products” 目录下的 “list.html” 文件。
  • 查询字符串:位于路径之后,以 “?” 开头,由一系列键值对组成,用于向服务器传递额外的参数信息。多个键值对之间用 “&” 分隔。例如,/search?q=python&category=books中,“q=python” 和 “category=books” 是两个查询参数,分别表示搜索关键词为 “python”,搜索类别为 “books”。服务器可以根据这些参数来执行相应的搜索逻辑,返回符合条件的结果
  • 片段标识符(Fragment Identifier)以 “#” 开头,通常用于指定网页内的特定位置或元素。例如,/article.html#section2表示请求 “article.html” 页面,并定位到页面中 “section2” 标识的位置。不过,片段标识符通常不会被发送到服务器,而是由浏览器在客户端根据其指示进行页面内的导航操作
作用
  • 定位资源:服务器根据 Request - URI 来查找并返回相应的资源。它就像是资源的 “地址”,让服务器能够准确地找到客户端所请求的文件、数据或执行特定的操作。例如,客户端请求/api/users/123,服务器就会明白需要获取 ID 为 123 的用户信息。
  • 传递参数:通过查询字符串,客户端可以向服务器传递各种参数,以便服务器根据这些参数来定制响应。比如在搜索功能中,客户端通过 Request - URI 传递搜索关键词、排序方式、结果数量等参数,服务器根据这些参数进行相应的搜索和数据处理,然后返回符合要求的结果。
  • 支持 RESTful API:在 RESTful 架构的 API 中,Request - URI 被广泛用于表示不同的资源和操作。例如,GET /api/products可以表示获取所有产品资源,POST /api/products用于创建新的产品资源,PUT /api/products/123用于更新 ID 为 123 的产品资源,DELETE /api/products/123用于删除该产品资源。通过这种方式,Request - URI 不仅定位了资源,还暗示了对该资源要执行的操作,使得 API 的设计更加清晰和规范。

1.2.3 Version

“HTTP - Version” 表示客户端使用的 HTTP 协议版本",常见的有 HTTP/1.1、HTTP/2 .
例如,一个完整的 HTTP 请求行可能看起来像这样:
GET /index.html HTTP/1.1
GET” 是方法,“/index.html” 是 Request - URI,“HTTP/1.1” 是 HTTP 版本

1.2 请求头

请求头是 HTTP 请求消息中的一部分,位于请求行(包含方法、Request - URI 和 HTTP - Version)之后,请求体之前。它由一系列的键值对组成,用于向服务器传递关于请求的附加信息,例如客户端的身份、请求的资源类型、期望的响应格式等。以下是一些常见的请求头字段及其作用

1.3 请求体

请求体是 HTTP 请求消息中的一部分,位于请求头之后,通常用于向服务器发送额外的数据。以下是关于请求体的详细介绍:

通用请求头字段

  • Cache - Control:用于指定缓存相关的指令,如no - cache表示不使用缓存,max - age = 3600表示缓存有效期为 3600 秒。
  • Connection:用于指定连接的管理方式,如keep - alive表示保持连接,以便在多个请求之间重用连接,提高性能;close表示请求完成后关闭连接。
  • Date:表示请求发送的日期和时间。

请求实体头字段

  • Content - Type:指定请求体中数据的类型,如application/json、application/x - www - form - urlencoded、multipart/form - data等。
  • Content - Length:指定请求体的长度(以字节为单位)。
  • Content - Encoding:用于指定请求体的编码方式,如gzip、deflate等,表示请求体数据经过了相应的压缩算法处理。

客户端请求头字段

  • Accept:告诉服务器客户端能够接受的响应内容类型,如Accept: text/html, application/xhtml + xml, application/xml;q = 0.9, /;q = 0.8,表示客户端优先接受 HTML、XHTML 和 XML 格式的响应,其次是其他任意类型的响应。
  • Accept - Encoding:指定客户端能够接受的响应内容的编码方式,如gzip、deflate等,用于告知服务器可以对响应数据进行压缩以减少传输量。
  • Accept - Language:表示客户端期望的响应语言,如Accept - Language: en - US, en;q = 0.5,表示客户端优先接受美式英语,其次是其他英语变体。
  • User - Agent:包含了客户端的相关信息,如浏览器类型、版本、操作系统等,例如User - Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.138 Safari/537.36,服务器可以根据这个字段来为不同的客户端提供不同的响应或进行特定的处理。
  • Cookie:用于在客户端和服务器之间传递会话相关的信息。客户端会在请求头中包含之前从服务器接收到的 Cookie,服务器可以根据这些 Cookie 来识别用户身份、跟踪用户会话等。

1.3请求头

作用

  • 提交数据:最主要的作用是向服务器提交数据。比如在用户注册、登录、发表评论、上传文件等操作中,需要将用户输入的信息、文件内容等数据发送到服务器,这些数据就包含在请求体中。
  • 支持复杂操作:对于一些需要大量数据传输或复杂操作的场景,如提交表单数据、发送 JSON 格式的配置信息、上传二进制文件等,请求体提供了一种有效的方式来传递这些数据,使服务器能够根据这些数据进行相应的处理。

数据格式

  • 表单数据:通常在提交 HTML 表单时使用,数据以键值对的形式表示,例如username=john&password=123456。多个键值对之间用 “&” 分隔。这种格式适用于简单的文本数据提交。
  • JSON 数据:由于其轻量级和易于解析的特点,在现代 Web 应用程序中被广泛用于传递结构化数据。例如:
{
"name": "John Doe",
"age": 30,
"email": "johndoe@example.com"
}
  • 二进制数据:用于上传文件,如图像、视频、文档等。在这种情况下,请求体包含的是文件的二进制内容,服务器需要根据文件类型和相关的处理逻辑来正确接收和保存这些数据。

相关请求头字段

  • Content - Type:该请求头字段用于指定请求体中数据的类型。例如,Content - Type: application/json表示请求体中的数据是 JSON 格式;Content - Type: application/x - www - form - urlencoded表示是表单数据;Content - Type: multipart/form - data用于文件上传,它允许在一个请求中同时上传多个文件和其他表单数据。
  • Content - Length:用于指定请求体的长度(以字节为单位)。服务器可以根据这个字段来确定何时接收完整个请求体的数据

实战

import requests

# 目标URL
url = 'https://example.com/api/login'

# 请求头
headers = {
    'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.138 Safari/537.36',
    'Content - Type': 'application/json',
    'Accept': 'application/json',
    'Connection': 'keep - alive'
}

# 请求体
data = {
    'username': 'your_username',
    'password': 'your_password'
}

# 发送POST请求
response = requests.post(url, headers=headers, json=data)

# 打印响应状态码和内容
print(response.status_code)
print(response.text)

响应

状态行:

位于响应消息的第一行,包含 HTTP 版本、状态码和原因短语。例如,HTTP/1.1 200 OK,其中HTTP/1.1是 HTTP 协议版本,200是状态码,OK是原因短语。状态码表示服务器对请求的处理结果,常见的状态码有:

  • 2xx 成功:如200 OK表示请求成功,服务器已成功处理请求并返回了相应的资源;201 Created表示请求已成功,并且服务器创建了一个新的资源。
  • 3xx 重定向:如301 Moved Permanently表示请求的资源已被永久移动到新的 URL;302 Found表示请求的资源临时移动到新的 URL,客户端应使用新的 URL 再次发起请求。
  • 4xx 客户端错误:如400 Bad Request表示客户端发送的请求有误,服务器无法理解;401 Unauthorized表示客户端未提供有效的身份验证信息,访问被拒绝;404 Not Found表示服务器找不到请求的资源。
  • 5xx 服务器错误:如500 Internal Server Error表示服务器内部发生错误,无法完成请求;503 Service Unavailable表示服务器暂时无法处理请求,通常是由于服务器过载或正在维护。

响应头:

包含一系列键值对,用于提供关于响应的附加信息,例如:

  • Content - Type:指定响应体中数据的类型,如text/html表示 HTML 页面,application/json表示 JSON 数据,image/jpeg表示 JPEG 图像等。
  • Content - Length:指定响应体的长度(以字节为单位),以便客户端知道需要接收多少数据。
  • Cache - Control:用于指定缓存相关的指令,如public表示响应可以被任何缓存存储;private表示响应只能被客户端缓存;no - cache表示不允许缓存。
  • Set - Cookie:用于设置 Cookie,服务器通过这个字段将 Cookie 发送给客户端,客户端会在后续的请求中包含这些 Cookie。
  • Location:在重定向响应中,用于指定客户端应重定向到的 URL。

响应体

是服务器返回给客户端的实际数据内容,可以是 HTML 页面、JSON 数据、XML 数据、图片、视频等各种类型的数据,具体取决于Content - Type字段的设置。例如,如果请求的是一个网页,响应体中就包含了该网页的 HTML 代码;如果请求的是一个 API 接口,响应体可能包含 JSON 格式的业务数据。

通俗易懂

假设你去一家图书馆借书,你向图书馆管理员提出借书的请求,这个过程就好比是客户端向服务器发送 HTTP 请求。而图书馆管理员根据你的请求,给你相应的回复,这就类似于服务器给客户端的 HTTP 响应。
比如说,你走到图书馆服务台对管理员说:“我想借一本名为《西游记》的书。” 这就是你的请求。过了一会儿,管理员对你说:“好的,这是你要的《西游记》。” 同时,管理员还告诉你一些其他信息,比如 “这本书可以借一个月”“请爱护书籍” 等。这里,管理员说 “好的,这是你要的《西游记》” 就相当于 HTTP 响应中的响应体,是你真正想要的内容;而 “这本书可以借一个月”“请爱护书籍” 等信息就像是响应头,提供了关于这本书的一些附加信息。

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

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

相关文章

对三维物体模型的阈值操作

对三维物体模型的阈值操作 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头2. point_normal_x、point_normal_y、point_normal_z有什么区别&#xff1f;3. 去除离群点 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头 dev_open_win…

prometheus 添加alertmanager添加dingtalk机器人告警

1、dingtalk创建机器人,目前我们采用加白名单的方式校验 2、定位到如下图 test结果如下

向量数据库学习笔记(1) —— 基础概念

一、 嵌入模型 Embedding Models 嵌入模型是将复杂数据&#xff08;如文本、图像、音频等&#xff09;转换为向量表示的机器学习模型 1. 核心概念 嵌入(Embedding)&#xff1a;将高维、非结构化的数据映射到低维、稠密的向量空间 向量表示&#xff1a;输出固定长度的数值向量…

【算法】动态规划:回文子串问题、两个数组的dp

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 回文子串问题回文子串最长回文子串分割回文串 IV分割回文串 II *最长回文子序列让字符串成为回文串的最少插入次数 两个数组的dp最…

文件上传绕过的小点总结(3)

6.文件首尾加空绕过 源码给出这样的&#xff0c;发现文件名处理没有首尾去空&#xff0c;于是我们可以采用首尾加空的方式绕过。 $file_name $_FILES[upload_file][name]; $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_e…

OpenHarmony 入门——ArkUI 跨页面数据同步和应用全局单例的UI状态存储AppStorage 小结(三)

文章大纲 引言一、AppStorage 应用全局的UI状态存储1、StorageProp和StorageLink装饰器建立联系2、StorageProp2.1、StorageProp使用规则2.2、StorageProp变量的传递/访问规则2.3、StorageProp支持的观察变化2.4、StorageProp 值初始化和更新 3、StorageLink3.1、StorageLink使…

阿里云国际站代理商:物联网设备怎样就近接入计算节点?

配置边缘计算实例 登录边缘计算控制台&#xff0c;找到已创建的边缘实例&#xff0c;点击实例名称后的“查看”。 分配OPC UA驱动到边缘实例中&#xff0c;选择OPCUA驱动&#xff0c;点击“设备列表”后的“驱动配置”&#xff0c;在弹出对话框中点击“添加通道”&#xff0c;…

目录遍历漏洞复现

1.在fofa中输入语法&#xff0c;查询目录遍历 body"SKControlKLForJson.ashx" 查询结果为&#xff1a; 2.寻找目录遍历漏洞&#xff0c;访问网站&#xff1a; 3.我们可以app目录中下载文件等等 4.我们还可以访问其他目录的一些东西

Java高频面试之集合-18

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;HashMap 是线程安全的吗&#xff1f;多线程下会有什么问题&#xff1f; HashMap 的线程安全性分析 HashMap 不是线程安全…

系统思考—看见未来

感谢上海财经大学终身教育学院的持续邀请&#xff01;每个月&#xff0c;都会带着不同的思维火花&#xff0c;走进财大与学员们一起探索系统思考的奥秘。 这次为宜宾市的干部们带来了一场深刻的学习体验。通过系统思考&#xff0c;帮助大家从整体视角去发现问题、分析问题、解…

保姆级教程搭建企业级智能体+私有知识库,Dify+ollama,Linux版

介绍 目前&#xff0c;AI Agent智能体已经被许多公司广泛应用&#xff0c;同时智能体借助私有知识库的加成&#xff0c;使原来知识面并不特别充分的大模型更聪明。如今特别是在医疗&#xff0c;医药&#xff0c;政企等数据保密程度高的行业&#xff0c;部署自己的私有知识库更…

记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】

1. 背景 运维侧持续反馈了几次线上业务程序 A 出现宕机告警的信息&#xff0c;重启后一段时间后又出现宕机&#xff0c;这里针对最后一次告警进行深入排查和分析。 首先这一次故障出现在 2024-03-14 04:18:23&#xff0c;和以往的宕机故障略有不同&#xff0c;以往的现象是切…

【leetcode hot 100 739】每日温度

解法一&#xff1a;暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一个更高温度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高温度的地方wh…

Cookie、Session 与 Token:核心区别与应用场景解析

目录 引言 基础概念解析&#xff1a;三大身份验证技术详解 Cookie&#xff1a;浏览器中的"身份证" Session&#xff1a;服务器记忆的"对话" Token&#xff1a;加密的"通行证" 三种技术的深度对比分析 存储位置与数据流向 安全性全面对比…

状态空间模型解析 (State-Space Model, SS)

一、文章摘要 状态空间模型&#xff08;State-Space Model, SS&#xff09;是一种广泛应用于控制系统、信号处理和系统建模的数学表示方式。MATLAB 提供的 ss 类用于描述线性时不变&#xff08;LTI&#xff09;系统的状态空间表示。本类实现了 LTI 系统的构造、属性设置、变换…

zabbix添加IIS网站计数器(并发连接数)

0. Zabbix Agent 配置 PerfCounter = iis_Current_Connections,"\Web Service(_Total)\Current Connections",30 1.在被监控主机,powershell输入perfmon.msc 2.点击添加按钮 3.在下拉菜单中点击小箭头

AI小白的第七天:必要的数学知识(概率)

概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数&#xff0c;表示某个事件发生的可能性&#xff1a; 0&#xff1a;事件不可能发生。1&#xff1a;事件必然发生。0 到 1 之间&#xff1a;事件发生的可能性大小。 例如&#xff0c;掷一枚公平的硬币&#xf…

[Windows] 图吧工具箱

[Windows] 图吧工具箱 链接&#xff1a;https://pan.xunlei.com/s/VOMCXYDix3pvwdkU7w7bfVsDA1?pwdk8v5# DIY爱好者的必备工具

【AIGC】图片变视频 - SD ComfyUI视频生成

效果图 完整过程 SD ComfyUI 下载 下载 https://pan.quark.cn/s/64b808baa960 解压密码&#xff1a;bilibili-秋葉aaaki 完整 https://www.bilibili.com/video/BV1Ew411776J/ SD ComfyUI 安装 1.解压 2.将controlnet内部文件复制到 ComfyUI-aki-v1.6\ComfyUI\models\control…

JVM详解(包括JVM内存模型与GC垃圾回收)

&#x1f4d6;前言&#xff1a; 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分&#xff0c;另一部分就是需要掌握Java内部的工作原理&#xff0c;从编译到运行&#xff0c;到底是谁在帮我们完成工作的&#xff1f; 接下来着重对Java虚拟机&#xff0c;也就…