HTTP | HTTP报文
字数 2887 2025-08-18 11:38:45
HTTP报文详解
一、HTTP报文概述
HTTP报文是HTTP协议通信时发送的数据块,用于客户端与服务器端之间的数据交互。HTTP报文可以分为两类:
- 请求报文:客户端向服务器发送请求
- 响应报文:服务器对请求的回应
二、HTTP报文结构
HTTP报文由三部分组成(也有说法分为首部和主体两部分):
- 状态行(请求行/响应行)
- 首部(多个首部字段)
- 主体(可选)
报文格式特点:
- 每行以回车符(\r, %0d, CR)和换行符(\n, %0a, LF)结束
- 首部和主体之间由空行(两个CRLF)分隔
- 状态行和首部是ASCII文本,主体可包含文本或二进制数据
三、状态行详解
1. 请求行(请求报文的状态行)
格式:请求方法 URL 协议版本
示例:GET /index.html HTTP/1.1
2. 响应行(响应报文的状态行)
格式:协议版本 状态码 原因短语
示例:HTTP/1.1 200 OK
注意:原因短语只对人类有意义,服务器可能返回不同的描述文本。
四、HTTP方法
HTTP规范定义了多种请求方法,以下是常用方法:
| 方法 | 描述 |
|---|---|
| GET | 获取/查询资源,参数包含在URL中 |
| POST | 传输实体主体,数据包含在请求主体中,常用于表单提交 |
| HEAD | 只获取报文首部,不返回主体,用于测试资源是否存在 |
| OPTIONS | 查询资源支持的方法 |
| PUT | 传输文件,将请求主体内容保存到URL指定位置 |
| DELETE | 删除URL指定的资源 |
| TRACE | 路径追踪,用于诊断请求是否被篡改 |
方法特点:
- GET和POST是最常用的方法
- PUT和DELETE方法不带验证机制,存在安全问题
- 方法名称必须大写
五、HTTP状态码
HTTP状态码分为5类:
| 类别 | 描述 | 常见状态码 |
|---|---|---|
| 1xx | 信息提示 | 100 Continue, 101 Switching Protocols |
| 2xx | 成功 | 200 OK, 201 Created, 204 No Content, 206 Partial Content |
| 3xx | 重定向 | 301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx | 客户端错误 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 405 Method Not Allowed |
| 5xx | 服务器错误 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
六、HTTP首部
HTTP首部由多个首部字段构成,格式为:字段名: 字段值
首部分类:
-
通用首部(请求和响应报文都可使用)
- Cache-Control, Connection, Date, Pragma, Trailer, Transfer-Encoding, Upgrade, Via, Warning
-
请求首部(请求报文使用)
- Accept, Accept-Charset, Accept-Encoding, Accept-Language, Authorization, Expect, From, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Max-Forwards, Proxy-Authorization, Range, Referer, TE, User-Agent
-
响应首部(响应报文使用)
- Accept-Ranges, Age, ETag, Location, Proxy-Authenticate, Retry-After, Server, Vary, WWW-Authenticate
-
实体首部(描述实体信息)
- Allow, Content-Encoding, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Type, Expires, Last-Modified
七、报文主体
报文主体特点:
- 可选部分,不是所有报文都有主体
- GET请求通常没有主体
- POST请求的主体通常包含表单数据或上传的文件
- 主体格式由Content-Type首部指定
八、实际应用示例
GET请求示例
GET /search?q=google HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0
Accept: text/html
(空行)
POST请求示例
POST /login.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
username=admin&password=123456
响应示例
HTTP/1.1 200 OK
Date: Mon, 06 May 2019 05:05:05 GMT
Server: Apache
Content-Type: text/html
Content-Length: 1234
<html>...</html>
九、注意事项
- 行结束符必须是CRLF(\r\n)
- 首部字段名不区分大小写,但约定使用首字母大写
- 某些方法(如PUT、DELETE)存在安全隐患,实际应用中需谨慎使用
- 状态码描述文本不影响实际处理结果
- 主体格式和编码由Content-Type和Content-Encoding首部指定