HTTP,英文全称HyperText Transfer Protocol,中文为超文本传输协议,下文简介一些历史发展关键节点:
这是HTTP的第一个非正式版本,功能非常简单,仅支持GET方法,并且不包含任何头部信息,主要用于传输简单的HTML文件
发布了首个官方标准的RFC 1945,引入了更多的请求方法,例如POST、HEAD,以及状态码,头字段等概念,开始支持多媒体内容类型和持久连接(keep-alive),但每个TCP连接仍然只能处理一个请求
在RFC 2616中定义,它改进了HTTP/1.0中的很多特性,比如默认启用持久连接(Persistent Connections)、管道化连接(Pipelining)、缓存控制机制(Cache-Control)、Host头字段以支持虚拟主机等。
在RFC 7540中发布,带来了显著的性能优化,如二进制分帧层、多路复用(Multiplexing)、服务器推送(Server Push)、头部压缩(HPACK)等技术,旨在解决HTTP/1.x中存在的队头阻塞问题。
在 RFC 9114 中发布,基于QUIC协议(Quick UDP Internet Connections),这是一种新的传输层协议,运行在用户数据报协议(UDP)之上,旨在解决HTTP/2中的一些性能瓶颈,特别是头部压缩和队头阻塞问题。HTTP/3通过QUIC提供多路复用、更低延迟、更佳的拥塞控制以及连接迁移等功能,从而显著提升Web应用的数据传输效率和用户体验。
简单来说,有以下几种作用(不全面,只说最简单的):
是计算机之间交流通信的一种协议,客户端和服务端需要正确的处理这些协议里面的规则
HTTP作为超文本传输协议,其中
超文本就是文字、图片、视频、链接等的结合体,典型就是HTML,本身都是纯文字,但是经过浏览器的解析之后,就成了有图片文字的网页了
传输就是把一些内容从A到B或者从B到A
状态管理,例如2xx,3xx,4xx
每个请求方法分开讲述会导致文章篇幅过大,这里简要述说(点到为止),更多可参考:CONNECT - HTTP | MDN
用途
GET是最常见的HTTP请求方法,用于从服务器获取资源(如网页、图片等)
特点
GET请求的数据会暴露在URL中,不适合传输敏感信息
GET请求可被浏览器和中间代理缓存
按照规范,GET操作应该是幂等的,即多次执行相同的操作应得到相同的结果
这里解释一下上述特点第二点,也就是“GET请求可被浏览器和中间代理缓存”,这句话就代表了
如果浏览器接收到了一个GET请求并从服务器获取到响应后,就可能根据HTTP协议中的缓存指令来决定是否被缓存(这个缓存的有效期通常有限制,例如Cache-Control: max-age=3600表示资源可缓存1小时),如果被缓存,那么在未来的某个时间点,还有相同的GET请求再次达到服务器时,浏览器可以直接使用本地的副本来响应请求,不必再次发送HTTP请求到服务器
用途
POST方法主要用于向服务器提交数据,创建或更新资源,例如表单提交、上传文件等
特点:
POST请求的数据作为请求体的一部分发送给服务器
POST操作不保证幂等,同样的请求可能产生不同的结果(如创建新资源)
用途
PUT方法用于替换指定资源的内容,如果资源不存在,则服务器可能会创建该资源
特点:
PUT请求必须包含要更新的整个资源实体,而不是部分
PUT操作应该是幂等的
用途
DELETE方法用于删除指定的资源
特点:
DELETE请求通常不需要请求体
DELETE操作也是幂等的,重复执行同样DELETE请求不影响结果(已删除的资源不会再次被删除)
用途
HEAD方法与GET类似,但服务器仅返回响应头信息,不包含任何响应内容(即没有正文),常用来检查资源的状态而不下载其内容
用途
OPTIONS方法用于获取目标资源所支持的HTTP请求方法列表以及其它与通信相关的选项。它允许客户端在实际调用资源之前了解服务器的性能特性。
还有如TRACE、PATCH、MOVE、COPY、LINK、UNLINK、WRAPPED等,这里不过多赘述。
请求方法 | 用途描述 | 特点概括 |
GET | 获取资源 | 安全性较低,可缓存,幂等 |
POST | 提交数据,创建/更新资源 | 数据位于请求体,非幂等 |
PUT | 替换或创建资源 | 必须提供完整资源内容,幂等 |
DELETE | 删除资源 | 无需请求体,幂等 |
HEAD | 获取头部信息 | 类似GET,但只返回响应头 |
OPTIONS | 查询服务端功能 | 返回允许的方法列表和其他通信选项 |
这里进行重要的部分简要介绍,详细介绍请看:HTTP请求头详解 - Teamshare | 天书
传递客户端存储的服务器设置的Cookies,可以维持会话状态,实现用户个性化服务等功能
例:Cookie:token=xxx;session_id=xxx
指明请求的主机,让服务器知道客户端请求的是哪个域名下的资源
例:hpd.baidu.com
定义请求主体中的数据格式、
例:Content-Type: application/x-www-form-urlencoded或Content-Type: application/json
主要用于提供客户端的身份验证信息
请求体一般在POST、PUT等方法中使用,用于向服务器发送需要处理的数据,当客户端想要向服务器提交或更新资源时,会将数据放在请求体中传输
请求体的内容类型由请求头中的Content-Type定义:
application/x-www-form-urlencoded: 这种格式常见于HTML表单提交,键值对以&符号分隔,每个键值对之间用等号=连接,例如:name=John&age=30
multipart/form-data: 当上传文件或者需要同时提交文本和二进制数据时使用,这种格式下数据被分割成多个部分,并且每个部分都有自己的Content-Type和名称。这种格式通常用于文件上传
application/json:在API设计中非常常见,例如:
{
"name": "John",
"age": 30
}
这里挑选重点内容简介,详解请看:HTTP状态码详解(待完善) - Teamshare | 天书
这些状态码表示服务器已收到请求,正在进行处理。但请求尚未完成,也没有任何响应内容返回给客户端
100 Continue:继续,通常用于表明客户端可以继续发送请求主体。
101 Switching Protocols:(协议切换)状态码表示服务器应客户端升级协议的请求正在切换协议
103 Early Hints: 信息状态响应码,允许用户在服务器还在准备响应数据的时候预加载一些资源。这样说可能有点抽象,举个例子:
在很多Web网站加载时候,都会先加载出来HTML页面,才能进一步知道需要加载那些CSS或者JS,那么等待HTML加载的这段时间就被浪费了
103状态码,就可以让服务器在处理主资源的时候同时向浏览器发送一些关键的子资源,用来提高页面渲染的效率
这些状态码表明请求已经被服务器成功接收、理解并接受
200 OK : 表明请求已经成功,对于不同的请求方式代表的意义不一样
GET: 已经取得资源,并将资源添加到响应的消息体中
HEAD: 响应的消息体为头部信息
POST: 响应的消息体中包含此次请求的结果
TRACE: 响应的消息体中包含服务器接收到的请求信息
201 Created:代表成功的应答状态码,表示请求已经被成功处理,并且创建了新的资源,这种状态码通常是作为POST请求的返回值
202 Accepted:表示服务器端已经收到请求消息,但是尚未进行处理
但是对于请求的处理却是无保证的,即稍后无法通过 HTTP 协议给客户端发送一个异步请求来告知其请求的处理结果。
这个状态码被设计用来将请求交由另外一个进程或者服务器来进行处理,或者是对请求进行批处理的情形。
203 Non-Authoritative Information:表示请求已经成功被响应,但是获得的负载与源头服务器的状态码为 200 (OK) 的响应相比,经过了拥有转换功能的 proxy(代理服务器)的修改,简单来说,就是消息是由第三方或者并非原始服务器生成
假设一个Web缓存服务器在向原始服务器发送请求时,由于某种原因未能接收到完整或最新的响应,但它基于已有的缓存和其他来源的信息生成了一个近似的响应。在这种情况下,缓存服务器可以返回203状态码,以表明响应内容不是直接从原始服务器获取的
204 No Content:请求已成功处理,但没有内容需要返回
301 Moved Permanently:永久性重定向,请求的URL已更改,未来所有对此资源的引用应使用新URL。
302 Found / 307 Temporary Redirect:临时重定向,请求的资源现在位于不同的URI下,但客户端应当保持使用原有URI。
400 Bad Request:服务器无法理解请求,可能是因为格式错误。
401 Unauthorized:请求未授权,需要提供有效的身份验证凭据。
403 Forbidden:服务器理解请求,但是拒绝执行,通常因为权限问题。
404 Not Found:服务器找不到所请求的资源。
500 Internal Server Error:服务器遇到了意外情况,无法完成请求。
501 Not Implemented:服务器不支持请求的功能。
503 Service Unavailable:服务器当前无法处理请求,可能是因为超载或正在进行维护。
以请求www.baidu.com为例
下面进行逐条解析:
HTTP/1.1 200 OK:
表示HTTP协议版本为1.1,并且请求成功
Connection: keep-alive:
指定服务器与客户端之间保持TCP连接开放以便于后续请求复用,提高性能
Content-Encoding: gzip:
响应体内容已经被gzip压缩
Content-Security-Policy: frame-ancestors 'self' ...:
定义了网页的Content Security Policy(CSP),限制了哪些源可以嵌入当前页面作为iframe
Content-Type: text/html; charset=utf-8:
响应体的数据类型是HTML格式,字符集采用UTF-8编码
Date: Wed, 10 Jan 2024 03:26:30 GMT:
服务器发送该响应的时间戳
Isprivate: 1:
这是一个自定义头部,表示响应是否为私有资源或具有特定隐私设置
Server: BWS/1.1:
描述了处理请求的服务器软件及版本
Set-Cookie: H_PS_PSSID=39999_40043_40074...:
设置了一个名为H_PS_PSSID的Cookie,用于跟踪用户会话或其他信息
Traceid: 1704857190376957953014645743882715244530:
追踪ID,用于在服务端记录和追踪此次请求的完整过程
X-UA-Compatible: IE=Edge,chrome=1:
指定浏览器以最高可用模式渲染文档,这里要求IE使用Edge引擎渲染,并兼容Chrome的特性
Transfer-Encoding: chunked:
表明响应报文采用了分块传输编码,即响应体由一系列大小不等的数据块组成,每个数据块前都有长度指示
对于不同类型的请求,响应体包含的资源类型通常也不相同,
例如对于GET请求,响应体通常包含请求的资源内容,例如HTML网页、JSON或XML数据、图片文件、视频流等
对于POST、PUT等方法,如果请求成功并执行了数据创建、更新或检索操作,响应体可能会包含新生成资源的详细信息、操作结果的状态报告或其他相关信息