什么是HTTP消息


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2020/02/10/%E4%BB%80%E4%B9%88%E6%98%AFHTTP%E6%B6%88%E6%81%AF/

摘要

本文主要讲述了:

  1. 什么是 HTTP 消息
  2. 分类
  3. 请求消息

正文

什么是 HTTP 消息

HTTP 消息是客户端和服务器端交换数据的方式

分类

HTTP 消息可以分为 2 类:

  • 由客户端向服务器端发出的请求消息
  • 由服务器端向客户端发回的响应消息

请求消息

请求消息可以分为 3 部分:

  • 请求行
  • 请求头
  • 请求体

请求体

不是所有请求都有请求体,例如:GETHEADDELETEOPTIONS就没有请求体。

请求体可以分为 2 类:

  • 单资源请求体
  • 多资源请求体

单资源请求体

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<form method="POST">
<input type="text" name="username" value="jsweibo" />
<button>Submit</button>
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
POST /index.html HTTP/1.1
Host: 127.0.0.1:3000
Connection: keep-alive
Content-Length: 16
Cache-Control: max-age=0
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Sec-Fetch-Dest: document
Origin: http://127.0.0.1:3000
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Referer: http://127.0.0.1:3000/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

username=jsweibo

多资源请求体

多资源请求体由多个部分请求体组成

每个部分请求体都从边界开始,每个部分请求体都拥有各自的头部区域,空行以及主体区域,最后一个部分请求体的后面有一个封闭边界

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data">
<input type="text" name="username" value="jsweibo" />
<input type="file" name="avatar" />
<button>Submit</button>
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
POST /index.html HTTP/1.1
Host: 127.0.0.1:3000
Proxy-Connection: keep-alive
Content-Length: 404
Cache-Control: max-age=0
Origin: http://127.0.0.1:3000
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLNIyFWTdmRKe5NfA
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
Sec-Fetch-Dest: document
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Referer: http://127.0.0.1:3000/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

------WebKitFormBoundaryLNIyFWTdmRKe5NfA
Content-Disposition: form-data; name="username"

jsweibo
------WebKitFormBoundaryLNIyFWTdmRKe5NfA
Content-Disposition: form-data; name="avatar"; filename="c8fb3b2a99b3678c38b537af439b6ed5a13b0d73.png"
Content-Type: image/png

iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUCB1j+M/A8B8ABQAB/8gPYhYAAAAASUVORK5CYII=
------WebKitFormBoundaryLNIyFWTdmRKe5NfA--

注:出于可读性考虑,本示例中的iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUCB1j+M/A8B8ABQAB/8gPYhYAAAAASUVORK5CYII=其实是进行 Base64 编码之后的结果。原数据为十六进制数据。

响应消息

响应消息可以分为 3 部分:

  • 状态行
  • 响应头
  • 响应体

响应体

不是所有响应都有响应体,例如:201204通常就没有请求体。

响应体可以分为 3 类:

  • 单资源响应体,由已知长度的单文件组成,存在Content-TypeContent-Length
  • 单资源响应体,由未知长度的单文件组成,使用分块编码传输,Transfer-Encoding=chunked
  • 多资源响应体

多资源响应体

多资源响应体由多个部分响应体组成

每个部分响应体都从边界开始,每个部分响应体都拥有各自的头部区域,空行以及主体区域,最后一个部分响应体的后面有一个封闭边界

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2020/02/10/%E4%BB%80%E4%B9%88%E6%98%AFHTTP%E6%B6%88%E6%81%AF/


本文对你有帮助?请支持我


支付宝
微信