HTTP请求报文字段和响应字段报文

详细介绍HTTP请求报文和响应报文的结构和字段含义

HTTP请求报文结构

HTTP请求报文由三部分组成:

  1. 请求行(Request Line)
  2. 请求头(Request Header)
  3. 请求体(Request Body)

1. 请求行

请求行包含三个重要信息:

  • 请求方法(GET、POST、PUT等)
  • 请求URL
  • HTTP协议版本

示例:

1
GET /index.html HTTP/1.1

这个请求行表示:

  • 使用GET方法获取资源
  • 请求的资源路径是/index.html
  • 使用的是HTTP/1.1版本协议

2. 常见请求头字段

字段名说明
Host请求的服务器域名
User-Agent客户端信息
Accept客户端可接受的响应内容类型
Accept-Language客户端可接受的语言
Accept-Encoding客户端可接受的内容编码
Connection连接管理,如keep-alive
Cookie客户端存储的Cookie信息
Content-Type请求体的MIME类型
Content-Length请求体的长度

3. 请求体

请求体包含发送给服务器的数据,常见于POST请求。数据格式可以是:

1) application/x-www-form-urlencoded

  • 最常见的POST提交数据方式
  • 格式:key1=value1&key2=value2
  • 特点:
    • 数据会被URL编码(空格转换为+,特殊字符转换为ASCII HEX值)
    • 适合简单的文本数据提交
  • 示例:
1
username=张三&password=123456&age=25

这个示例表示:

  • 提交了三个字段:username、password和age
  • 数据以键值对形式传输
  • 使用&符号分隔不同的字段
  • 所有数据都经过URL编码

2) application/json

  • 现代API中最流行的数据格式
  • 数据以JSON格式传输
  • 特点:
    • 支持复杂的数据结构(嵌套对象、数组等)
    • 可读性好
    • 数据类型丰富
  • 示例:
1
2
3
4
5
6
7
8
9
{
  "username": "张三",
  "age": 25,
  "hobbies": ["读书", "运动"],
  "address": {
    "city": "北京",
    "street": "朝阳区"
  }
}

这个示例展示了JSON格式的优势:

  • 可以表示嵌套的数据结构(address是一个对象)
  • 支持数组类型(hobbies是一个数组)
  • 支持多种数据类型(字符串、数字)
  • 层次结构清晰,易于阅读和解析

3) multipart/form-data

  • 主要用于文件上传场景
  • 特点:
    • 可以同时上传文件和文本数据
    • 每个表单项都有独立的边界字符串分隔
    • 支持二进制文件传输
  • 示例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"

张三
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="photo"; filename="profile.jpg"
Content-Type: image/jpeg

[二进制文件内容]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

这个示例说明:

  • 使用特定的边界字符串分隔不同的表单项
  • 可以同时上传文本(username)和文件(photo)
  • 每个部分都有自己的Content-Disposition说明
  • 文件上传部分包含文件名和文件类型信息

HTTP响应报文结构

HTTP响应报文也由三部分组成:

  1. 状态行(Status Line)
  2. 响应头(Response Header)
  3. 响应体(Response Body)

1. 状态行

状态行包含:

  • HTTP协议版本
  • 状态码
  • 状态描述

示例:

1
HTTP/1.1 200 OK

这个状态行表示:

  • 使用HTTP/1.1版本协议
  • 状态码是200,表示请求成功
  • OK是对状态码的文字描述

2. 常见状态码

状态码类别说明
1xx信息性状态码请求已接收,继续处理
2xx成功状态码请求已成功接收、理解、接受
3xx重定向状态码需要进一步操作以完成请求
4xx客户端错误状态码请求包含语法错误或无法完成请求
5xx服务器错误状态码服务器在处理请求时发生错误

常见状态码:

  • 200 OK:请求成功
  • 301 Moved Permanently:永久重定向
  • 302 Found:临时重定向
  • 400 Bad Request:客户端请求语法错误
  • 401 Unauthorized:请求需要用户认证
  • 403 Forbidden:服务器拒绝请求
  • 404 Not Found:请求的资源不存在
  • 500 Internal Server Error:服务器内部错误
  • 503 Service Unavailable:服务器暂时无法处理请求

3. 常见响应头字段

字段名说明
Server服务器软件信息
Content-Type响应体的MIME类型
Content-Length响应体的长度
Content-Encoding响应体的编码方式
Cache-Control缓存控制
Set-Cookie设置Cookie
Location重定向的目标URL
Access-Control-Allow-OriginCORS跨域允许的来源

完整示例

GET请求示例

1
2
3
4
GET /api/users HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Accept: application/json

这个GET请求示例说明:

  • 使用GET方法请求/api/users接口
  • 请求发送到api.example.com服务器
  • 使用Mozilla/5.0浏览器发送请求
  • 期望接收JSON格式的响应

POST请求示例

1
2
3
4
5
6
7
8
9
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 57

{
    "username": "john_doe",
    "email": "john@example.com"
}

这个POST请求示例说明:

  • 使用POST方法向/api/users接口提交数据
  • 发送JSON格式的数据
  • 请求体包含用户名和邮箱信息
  • Content-Length指明了请求体的长度

响应示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 234

{
    "status": "success",
    "data": {
        "id": 1,
        "username": "john_doe",
        "email": "john@example.com"
    }
}

这个响应示例说明:

  • 请求处理成功(状态码200)
  • 返回JSON格式的数据
  • 响应体包含状态信息和用户数据
  • 服务器成功创建了用户并返回了用户ID

multipart/form-data示例(文件上传)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
------WebKitFormBoundary7MA4YWxkTrZu0gW    # 分隔边界线,用于分隔不同的表单项
Content-Disposition: form-data; name="username"  # 第一个表单项:普通文本字段

张三                                           # 字段值
------WebKitFormBoundary7MA4YWxkTrZu0gW    # 分隔边界线
Content-Disposition: form-data; name="photo"; filename="profile.jpg"  # 第二个表单项:文件上传
Content-Type: image/jpeg                     # 上传文件的MIME类型

[二进制文件内容]                              # 实际的文件内容
------WebKitFormBoundary7MA4YWxkTrZu0gW--   # 结束边界线(注意末尾有--)

application/x-www-form-urlencoded示例

1
2
3
4
5
6
POST /login HTTP/1.1                        # 请求行:POST方法,用于登录
Host: example.com                           # 请求的目标主机名
Content-Type: application/x-www-form-urlencoded  # 内容类型为表单数据
Content-Length: 38                          # 请求体长度

username=张三&password=123456&remember=true  # 请求体:键值对格式,使用&分隔

带Cookie的请求示例

1
2
3
4
GET /api/profile HTTP/1.1                   # 请求行:GET方法,获取用户资料
Host: api.example.com                       # 请求的目标主机名
Cookie: sessionId=abc123; userId=789        # Cookie信息,包含会话ID和用户ID
Accept: application/json                    # 期望接收JSON格式的响应

重定向响应示例

1
2
3
4
HTTP/1.1 302 Found                         # 状态行:302表示临时重定向
Location: https://new.example.com/page     # 重定向的目标URL
Cache-Control: no-cache                    # 缓存控制:不使用缓存
Set-Cookie: session=def456; Path=/         # 设置新的Cookie
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处