HTTP 报文格式详解
HTTP(Hypertext Transfer Protocol,超文本传输协议)是互联网中用于数据通信的核心协议,其报文格式定义了客户端与服务器之间请求和响应的结构。理解 HTTP 报文格式是解析网络请求、调试接口和优化通信的基础。
HTTP 请求报文格式
HTTP 请求报文由请求行、请求头、空行和请求体四部分组成,结构如下:
1 | <method> <url> <version> // 请求行 |
请求行(Request Line)
请求行是报文的第一行,包含三个关键信息,以空格分隔:
- 请求方法(Method):表示客户端希望服务器执行的操作(如 GET、POST)。
- URL(Uniform Resource Locator):请求的资源路径(如
/api/user)。 - HTTP 版本(Version):使用的 HTTP 协议版本(如
HTTP/1.1、HTTP/2)。
示例:GET /index.html HTTP/1.1
请求头(Request Headers)
请求头由一系列键值对组成,格式为字段名: 字段值,用于向服务器传递附加信息(如客户端类型、可接受的数据格式等)。请求头以空行结束(表示请求头结束,即将开始请求体)。
常见请求头示例:
1 | Host: www.example.com // 请求的服务器域名 |
请求体(Request Body)
请求体是可选的,用于携带客户端向服务器发送的数据(如表单提交、API 参数),仅在需要传递数据的请求(如 POST、PUT)中存在。
示例(POST 请求体):username=test&password=123456(表单数据)
或{"name":"test","age":20}(JSON 数据)
请求方法详解
HTTP 定义了多种请求方法,每种方法对应不同的操作语义:
| 方法 | 作用描述 | 特点 |
|---|---|---|
| GET | 从服务器获取资源(如网页、图片) | 安全(不修改服务器数据)、幂等(多次请求结果一致);参数拼接在 URL 中 |
| HEAD | 与 GET 类似,但仅返回响应头,不返回响应体 | 用于检查资源是否存在、获取资源元信息(如更新时间) |
| POST | 向服务器提交数据(如表单提交、创建资源) | 可能修改服务器数据;参数放在请求体中,无长度限制 |
| PUT | 向服务器上传资源(如更新文件) | 幂等;通常用于全量更新资源(需提供完整资源内容) |
| DELETE | 请求服务器删除指定资源 | 幂等;删除服务器上的目标资源 |
| TRACE | 发起环回诊断,服务器返回原始请求报文 | 用于排查请求在传输过程中是否被修改(较少使用,存在安全风险) |
| OPTIONS | 询问服务器支持的 HTTP 方法或资源允许的操作 | 常用于跨域请求前的预检(CORS 预检请求) |
GET 与 POST 的核心区别
| 维度 | GET | POST |
|---|---|---|
| 数据位置 | 参数拼接在 URL 后(?key=value&...) |
参数放在请求体中 |
| 长度限制 | 受 URL 长度限制(通常 2KB~8KB,因浏览器而异) | 无限制(由服务器配置决定) |
| 安全性 | 数据暴露在 URL 中,不适合敏感信息 | 数据在请求体中,相对安全(仍需加密) |
| 幂等性 | 幂等(多次请求结果一致) | 非幂等(多次请求可能产生不同结果,如重复提交订单) |
| 缓存 | 可被浏览器缓存 | 默认不缓存 |
HTTP 响应报文格式
服务器收到请求后,会返回 HTTP 响应报文,结构与请求报文类似,由状态行、响应头、空行和响应体组成:
1 | <version> <status> <reason-phrase> // 状态行 |
状态行(Status Line)
状态行包含三个信息,以空格分隔:
- HTTP 版本:服务器使用的 HTTP 版本(如
HTTP/1.1)。 - 状态码(Status Code):三位数字,表示请求处理结果(如
200表示成功,404表示资源不存在)。 - 原因短语(Reason Phrase):状态码的文字描述(如
OK、Not Found)。
示例:HTTP/1.1 200 OK
响应头(Response Headers)
响应头同样是键值对(字段名: 字段值),用于向客户端传递响应的附加信息(如服务器类型、数据类型、缓存策略等)。
常见响应头示例:
1 | Server: Nginx/1.21.0 // 服务器软件信息 |
响应体(Response Body)
响应体是服务器返回的实际数据,如 HTML 页面、JSON 数据、图片等,其格式由Content-Type头字段指定。
示例(JSON 响应体):{"code":200,"message":"success","data":{"id":1,"name":"test"}}
常见状态码分类
状态码分为五大类,首位数字表示类型:
- 1xx(信息性状态码):请求已接收,继续处理(如
100 Continue)。 - 2xx(成功状态码):请求正常处理(如
200 OK、201 Created)。 - 3xx(重定向状态码):需要客户端进一步操作(如
301 Moved Permanently永久重定向、304 Not Modified缓存有效)。 - 4xx(客户端错误状态码):请求存在错误(如
400 Bad Request请求无效、401 Unauthorized未认证、403 Forbidden权限不足、404 Not Found资源不存在)。 - 5xx(服务器错误状态码):服务器处理请求出错(如
500 Internal Server Error服务器内部错误、503 Service Unavailable服务暂时不可用)。
HTTP 首部字段分类
HTTP 首部字段是请求和响应报文中的核心元数据,按用途分为四类:
通用首部字段(General Header Fields)
请求和响应报文均可使用,用于描述报文的整体属性:
| 字段名 | 作用描述 |
|---|---|
| Date | 报文创建的日期时间(如Date: Tue, 01 Aug 2023 12:00:00 GMT) |
| Connection | 管理连接状态(Connection: keep-alive表示长连接,close表示短连接) |
| Cache-Control | 控制缓存行为(如max-age=3600表示缓存 1 小时,no-cache表示不缓存) |
| Transfer-Encoding | 报文主体的传输编码方式(如chunked分块传输) |
| Via | 记录请求 / 响应经过的代理服务器(用于追踪传输路径) |
请求首部字段(Request Header Fields)
仅在请求报文中使用,用于向服务器传递客户端信息或请求条件:
| 字段名 | 作用描述 |
|---|---|
| Accept | 客户端可接受的媒体类型(如Accept: application/json) |
| Accept-Encoding | 客户端支持的压缩算法(如gzip, deflate) |
| Host | 请求的服务器域名和端口(HTTP/1.1 必需字段,如Host: www.example.com:8080) |
| User-Agent | 客户端标识(如浏览器版本、设备信息,User-Agent: Mozilla/5.0 ...) |
| Referer | 当前请求的来源页面 URL(用于追踪跳转来源) |
| Authorization | 身份认证信息(如Basic dXNlcjpwYXNzd29yZA==表示 Base64 编码的账号密码) |
| If-Modified-Since | 条件请求:仅当资源在指定时间后修改过才返回(如If-Modified-Since: Tue, 01 Aug 2023 00:00:00 GMT) |
响应首部字段(Response Header Fields)
仅在响应报文中使用,用于向客户端传递服务器信息或响应状态:
| 字段名 | 作用描述 |
|---|---|
| Server | 服务器软件信息(如Server: Apache/2.4.41) |
| Location | 重定向的目标 URL(配合 3xx 状态码使用,如Location: https://www.new.com) |
| ETag | 资源的唯一标识(用于缓存验证,如ETag: "abc123") |
| Set-Cookie | 向客户端设置 Cookie(如Set-Cookie: sessionid=xyz; Expires=...) |
| WWW-Authenticate | 要求客户端进行身份认证(如WWW-Authenticate: Basic realm="Restricted") |
实体首部字段(Entity Header Fields)
用于描述请求体或响应体(实体)的元数据:
| 字段名 | 作用描述 |
|---|---|
| Content-Type | 实体的媒体类型和编码(如text/html; charset=utf-8、application/json) |
| Content-Length | 实体的字节数(如Content-Length: 1024) |
| Content-Encoding | 实体的压缩方式(如gzip、deflate) |
| Last-Modified | 资源最后修改时间(如Last-Modified: Tue, 01 Aug 2023 00:00:00 GMT) |
| Expires | 实体过期时间(缓存失效时间,如Expires: Wed, 02 Aug 2023 00:00:00 GMT) |
v1.3.10