HTTP协议结构详解

HTTP协议主要由请求(Request)和响应(Response)两部分组成,每部分都包含三个主要组成部分。下面是详细说明:

HTTP请求(Request)

1. 请求行(Request Line)

1
GET /api/users HTTP/1.1

包含三个元素:

  • 请求方法:GET、POST、PUT、DELETE等
  • 请求路径:/api/users
  • HTTP协议版本:HTTP/1.1

2. 请求头(Request Headers)

1
2
3
4
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
Accept: application/json
  • 包含请求的附加信息
  • 采用键值对形式
  • 常见请求头包括:
    • Host:指定服务器的域名
    • User-Agent:客户端信息
    • Content-Type:请求体的数据类型
    • Accept:客户端期望接收的数据类型

3. 请求体(Request Body)

1
2
3
4
{
"username": "test",
"password": "123456"
}
  • 可选部分,并不是所有请求都有请求体
  • 通常在POST、PUT等方法中使用
  • 数据格式由Content-Type指定
  • 常见格式包括:
    • application/json
    • application/x-www-form-urlencoded
    • multipart/form-data
    • application/xml

HTTP响应(Response)

1. 响应行(Status Line)

1
HTTP/1.1 200 OK

包含三个元素:

  • HTTP协议版本:HTTP/1.1
  • 状态码:200、301、404、500等
  • 状态描述:OK、Not Found、Internal Server Error等

2. 响应头(Response Headers)

1
2
3
Content-Type: application/json
Content-Length: 100
Cache-Control: no-cache
  • 包含响应的附加信息
  • 采用键值对形式
  • 常见响应头包括:
    • Content-Type:响应体的数据类型
    • Content-Length:响应体的长度
    • Cache-Control:缓存控制
    • Set-Cookie:设置Cookie

3. 响应体(Response Body)

响应体可以包含多种类型的内容,每种类型都有其对应的Content-Type:

3.1 文本类型

  1. HTML (text/html)
1
2
3
4
5
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
  1. JSON (application/json)
1
2
3
4
5
{
"id": 1,
"name": "John",
"status": "success"
}
  1. XML (application/xml)
1
2
3
4
<user>
<id>1</id>
<name>John</name>
</user>
  1. 纯文本 (text/plain)
1
Hello World

3.2 二进制类型

图片

  • image/jpeg
  • image/png
  • image/gif
  • image/webp
  • image/svg+xml

音频

  • audio/mpeg
  • audio/wav
  • audio/ogg

视频

  • video/mp4
  • video/webm
  • video/ogg

文档

  • application/pdf
  • application/msword
  • application/vnd.openxmlformats-officedocument.wordprocessingml.document

其他二进制

  • application/octet-stream(通用二进制数据)
  • application/zip(压缩文件)
  • application/x-www-form-urlencoded(表单数据)

重要注意事项

  1. 分隔符

    • 请求头和请求体之间必须有一个空行
    • 响应头和响应体之间必须有一个空行
    • 这些空行是协议规范的一部分
  2. Content-Type

    • 必须准确指定请求体和响应体的数据格式
    • 影响数据的解析方式
    • 可以包含字符集信息,如:Content-Type: text/html; charset=utf-8
  3. 编码

    • 请求和响应都需要考虑字符编码
    • 通常使用UTF-8编码
    • 二进制数据可能需要进行Base64编码
  4. 大小限制

    • 服务器通常会对请求体大小有限制
    • 大文件传输需要考虑分块处理
    • 可以使用压缩算法减小传输大小

示例

完整的HTTP请求示例:

1
2
3
4
5
6
7
8
9
10
POST /api/users HTTP/1.1
Host: www.example.com
Content-Type: application/json
User-Agent: Mozilla/5.0
Accept: application/json

{
"username": "test",
"password": "123456"
}

完整的HTTP响应示例:

1
2
3
4
5
6
7
8
9
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 46
Cache-Control: no-cache

{
"status": "success",
"message": "用户创建成功"
}