HTTP
HTTP(超文本传输协议)是一种应用层协议,基于TCP协议(还不知道TCP的可参考补阙拾遗(二)-网络中的传输层(TCP/UDP))或是理论上来说可以借助任何可靠的传输协议。同时HTTP 也是一个客户端—服务器协议:请求由一个实体,即用户代理(user agent),或是一个可以代表它的代理方(proxy)发出。大多数情况下,这个用户代理都是一个 Web 浏览器,不过它也可能是任何东西,比如一个爬取网页来充实、维护搜索引擎索引的机器爬虫。它允许客户端(通常是Web浏览器)从服务器请求并接收超文本(如HTML文档)、图像、视频、音频文件等各种类型的资源。它定义了客户端和服务器之间的通信格式和规则,包括请求消息、响应消息以及数据传输的格式,它是 Web 上进行任何数据交换的基础。(HTTP协议应该是每一个前端开发者都会接触到的一个协议)
协议规定的内容
HTTP协议规定了两个方面的内容:
- 通信的模式
- 通信的格式
通信模式
利用HTTP协议客户端与服务端之间可通过交换一个个独立的消息(而非数据流)进行通信。由客户端发出的消息被称作请求(request),由服务端发出的应答消息被称作响应(response),所以HTTP通信并是以 请求——响应 这样简单的方式进行通信的,
通信报文格式
HTTP通信报文包括请求报文与响应报文。
HTTP请求信息格式
HTTP请求信息格式是一种纯文本的格式,主要分为三个部分(其实有四部分请求头与请求体之间还有个空行):
-
请求行(Request Line) :
请求行是HTTP请求的第一行,包含了三个关键元素,用空格分隔:
- 方法(Method) :描述了客户端希望对服务器上的资源执行的操作。常见的HTTP方法有GET、POST、PUT、DELETE等。例如,GET用于请求资源,POST用于提交数据。
- 请求URI(Uniform Resource Identifier) :这是要访问的资源的标识符,即URL的一部分,不包括协议和主机信息,仅指明请求资源的路径和查询字符串。例如,
/index.html或/api/data?key=value。 - 协议版本(Protocol Version) :指出了正在使用的HTTP协议版本,目前最常用的是HTTP/1.1和HTTP/2。例如,
HTTP/1.1。
示例请求行:
GET /index.html HTTP/1.1 -
请求头(Request Headers) :
请求头是紧随请求行之后的一系列键值对,每一对占一行,用于传递关于客户端、请求本身或客户端期望的响应的附加信息。这些信息不是请求主体的一部分,但对服务器如何处理请求至关重要。常见的请求头包括但不限于:
Host:指定请求的服务器的域名和端口号。Accept:指出客户端能够处理的内容类型(浏览器可以接受的文件类型)。Accept-Encodeing:浏览器允许的压缩编码User-Agent:(用户代理,他是一段用来描述浏览器信息的字符串)描述发出请求的浏览器或其他客户端软件的信息。Cookie:包含之前服务器设置的任何cookies,用于会话管理或个性化设置。Authorization:可能包含用于验证用户身份的凭证。Content-Type:它指示了发送到服务器或者从服务器接收到的响应体中的数据的MIME类型(多用途互联网邮件扩展类型)
示例请求头:
Accept:text/plain, */*; q=0.01 Accept-Encoding:gzip, deflate, br, zstd Accept-Language:zh-CN,zh;q=0.9 Host:www.baidu.com Sec-Ch-Ua:"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126" User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 X-Requested-With:XMLHttpRequest -
请求体(Request Body) :
请求体是可选的,并非所有HTTP请求都有请求体。它主要用于包含发送给服务器的数据,这在POST、PUT等方法的请求中常见。例如,在表单提交时,请求体可能包含表单字段的数据。请求体的内容类型由请求头中的
Content-Type指定,常见的类型有:- application/x-www-form-urlencoded: 这是最常见的类型,特别是在提交HTML表单时。数据被编码成URL格式,其中键值对由
&字符分隔,键和值之间由=连接(例如:key1=value1&key2=value2)。 - multipart/form-data: 用于上传文件或多部分数据,这种类型可以同时发送文件和其他表单字段,可以使用边界(boundary)来分隔不同的部分,每个部分可以有其自己的MIME类型(MIME类型是一种标准化的标识符,用于表示数据或文件的格式类型)。
- application/json: 用于发送JSON格式的数据。这是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。
- text/plain: 用于发送纯文本数据,没有特殊格式,这种类型通常用于发送简单的文本信息。
- application/octet-stream: 用于发送二进制数据,如图片、音频或视频文件。
请求体的内容长度应通过
Content-Length请求头来指定,以便服务器知道何时读取完毕。 - application/x-www-form-urlencoded: 这是最常见的类型,特别是在提交HTML表单时。数据被编码成URL格式,其中键值对由
HTTP响应信息格式
HTTP协议中服务器对客户端请求的回应,响应信息格式也主要分为三个部分(同样有四部分响应头与响应体之间还有个空行):
-
响应行(Status Line) :
响应行是响应消息的第一行,包含以下三个要素,用空格分隔:
-
协议版本(Protocol Version) :表明服务器使用的HTTP协议版本,通常与请求中的协议版本相匹配。
-
状态码(Status Code) :一个三位数的代码,用来告知客户端请求的处理结果。
-
响应状态码的规则
- 1xx:请求处理中
- 2xx:表示成功
- 3xx:表示请求重定向
- 4xx:表示客户端错误
- 5xx:服务器错误
-
-
状态消息(Reason Phrase) :是对状态码的简单描述文本,帮助理解状态码的意义,如
OK、Not Found等。虽然在现代HTTP协议中它的作用已经减弱,但仍然存在。
例如:
HTTP/1.1 200 OK -
-
响应头(Response Headers) :
响应头紧跟在响应行之后,是一系列以冒号分隔的键值对,每对占一行,提供了关于响应的元数据。常见的响应头包括:
- Content-Type: 告诉客户端响应体的数据类型。
- Content-Length: 响应体的字节数。
- Server: 服务器的软件信息。
- Date: 响应的时间戳。
- Set-Cookie: 用于设置或更新cookie。
- Location: 在重定向时使用,指示新的资源位置。
例如:
Content-Length: 651
Content-Type: application/json; charset=utf-8
Date: Fri, 05 Jul 2024 09:44:00 GMT
-
响应体(Response Body) :
响应体是服务器返回给客户端的实际数据内容,可能是HTML文档、图片、JSON数据等。响应体的内容类型由响应头中的
Content-Type指定。并非所有响应都包含响应体,如某些状态码为1xx或某些204 No Content的响应就没有响应体。