一、HTTP 请求结构
HTTP 请求结构可以分为请求行、请求头和请求体三部分。
- 请求行
请求行是 HTTP 请求报文中的第一行,指定了该请求使用的方法、URL和协议版本。请求行包含以下三个部分:
a. HTTP 请求方法:指定客户端请求服务器所用的方法,常用的方法有 GET、POST、PUT、 DELETE、PATCH 等。
b. 请求的资源路径:指定了请求的资源路径。
c. HTTP 协议版本:指定了 HTTP 协议的版本,如 HTTP/1.1 等。
例如,请求行可以是这样的:
POST /api/login HTTP/1.1
- 请求头
请求头紧随请求行之后,是 HTTP 请求报文的一部分,包含了客户端向服务器端发送的元数据。请求头的格式是“键(Key)-值(Value)”对,中间用冒号(:)分隔,多个键值对之间使用回车换行符(CRLF)分隔,例如:
Accept-Language: en-US,en;q=0.9 Host: www.example.com
常见的请求头有:
a. Accept:指定客户端可处理的媒体类型。
b. Content-Type:指定请求体中的媒体类型。
c. User-Agent:指定客户端的浏览器类型、操作系统和版本信息。
d. Referer:指定来源于哪个页面或网站发出的请求。
e. Authorization:为客户端发送身份验证信息。
- 请求体
请求体是 HTTP 请求报文的最后一部分,包含了客户端向服务器端发送的实体数据。单个请求可以不含有请求体。请求体的格式根据实际的需要选择。常用的请求体格式有:
a. application/x-www-form-urlencoded:以 URL 编码的方式发送表单数据。
b. application/json:发送 JSON 格式的数据。
c. multipart/form-data:用于发送文件和二进制数据。
d. text/plain:纯文本格式的数据。
例如:
{ "username":"test", "password":"123456" }
二、HTTP 响应结构
HTTP 响应结构可以分为状态行、响应头和响应体三部分。
- 状态行
状态行是 HTTP 响应报文中的第一行,包含了 HTTP 协议版本、状态码和状态描述。状态行的格式如下:
HTTP/1.1 200 OK
状态码通常由三位数字组成,表示对请求的处理结果。常见的状态码有:
a. 2XX(成功):表示服务器成功地接收到、理解并接受了客户端请求。
b. 3XX(重定向):表示客户端需要执行一些额外的步骤,才能完成请求。
c. 4XX(客户端错误):表示客户端发送的请求包含错误语法或无法完成请求。
d. 5XX(服务器错误):表示服务器遇到错误,无法完成请求。
- 响应头
响应头紧随状态行之后,是 HTTP 响应报文的一部分,包含了服务器向客户端发送的元数据。响应头的格式和请求头相同,为键值对的形式,例如:
Content-Type: application/json Cache-Control: max-age=3600
常见的响应头有:
a. Content-Type:指定响应体的媒体类型。
b. Content-Length:指定响应体的长度。
c. Cache-Control:指定缓存控制策略。
d. Date:指定响应的日期时间。
e. Server:指定服务器的名称和版本信息。
- 响应体
响应体是 HTTP 响应报文的最后一部分,包含了服务器向客户端返回的实体数据。响应体格式根据实际需要而定,如 HTML、JSON、XML、图片、视频等。
例如:
{ "success": true, "message": "登录成功" }
HTTP 协议规定,在响应头中必须包含 Content-Type,它用于描述响应体中实体的类型和字符集。Content-Type 的格式一般为“type/subtype;charset=utf-8”,其中 charset=utf-8 指定了响应体的编码格式为 UTF-8。常见的 Content-Type 类型有:
- text/html:HTML 格式的文本
- text/plain:普通文本
- application/json:JSON 格式的数据
- application/xml:XML 格式的数据
- image/jpeg:JPEG 格式的图像
- image/png:PNG 格式的图像
除了 Content-Type 之外,HTTP 协议还支持 Content-Encoding 响应头,用于指示响应体的压缩方法。常见的压缩方法有 gzip 和 deflate,可以减少响应体的大小,提高传输效率。
例如,在使用 gzip 压缩后的响应体中,Content-Encoding 响应头的值为“gzip”,Content-Type 响应头的值为“text/html;charset=utf-8”。这样的响应体需要在客户端进行解压缩,然后按照指定的字符编码进行解码,才能得到原始的文本信息。