0%

HTTP报文格式

HTTP 报文格式详解

HTTP(Hypertext Transfer Protocol,超文本传输协议)是互联网中用于数据通信的核心协议,其报文格式定义了客户端与服务器之间请求和响应的结构。理解 HTTP 报文格式是解析网络请求、调试接口和优化通信的基础。

HTTP 请求报文格式

HTTP 请求报文由请求行请求头空行请求体四部分组成,结构如下:

1
2
3
4
<method> <url> <version>  // 请求行
<headers> // 请求头(多个键值对)
// 空行(分隔请求头与请求体)
<requestbody> // 请求体(可选)

请求行(Request Line)

请求行是报文的第一行,包含三个关键信息,以空格分隔:

  • 请求方法(Method):表示客户端希望服务器执行的操作(如 GET、POST)。
  • URL(Uniform Resource Locator):请求的资源路径(如/api/user)。
  • HTTP 版本(Version):使用的 HTTP 协议版本(如HTTP/1.1HTTP/2)。

示例
GET /index.html HTTP/1.1

请求头(Request Headers)

请求头由一系列键值对组成,格式为字段名: 字段值,用于向服务器传递附加信息(如客户端类型、可接受的数据格式等)。请求头以空行结束(表示请求头结束,即将开始请求体)。

常见请求头示例

1
2
3
4
5
Host: www.example.com          // 请求的服务器域名
User-Agent: Mozilla/5.0 ... // 客户端浏览器/设备信息
Accept: text/html,application/json // 客户端可接受的响应数据类型
Accept-Encoding: gzip, deflate // 客户端支持的压缩方式
Connection: keep-alive // 保持长连接

请求体(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
2
3
4
<version> <status> <reason-phrase>  // 状态行
<headers> // 响应头(多个键值对)
// 空行(分隔响应头与响应体)
<responsebody> // 响应体(可选)

状态行(Status Line)

状态行包含三个信息,以空格分隔:

  • HTTP 版本:服务器使用的 HTTP 版本(如HTTP/1.1)。
  • 状态码(Status Code):三位数字,表示请求处理结果(如200表示成功,404表示资源不存在)。
  • 原因短语(Reason Phrase):状态码的文字描述(如OKNot Found)。

示例
HTTP/1.1 200 OK

响应头(Response Headers)

响应头同样是键值对(字段名: 字段值),用于向客户端传递响应的附加信息(如服务器类型、数据类型、缓存策略等)。

常见响应头示例

1
2
3
4
5
Server: Nginx/1.21.0          // 服务器软件信息
Content-Type: text/html; charset=utf-8 // 响应体的数据类型和编码
Content-Length: 1024 // 响应体的字节数
Cache-Control: max-age=3600 // 缓存有效期(1小时)
Set-Cookie: sessionid=abc123; Path=/ // 向客户端设置Cookie

响应体(Response Body)

响应体是服务器返回的实际数据,如 HTML 页面、JSON 数据、图片等,其格式由Content-Type头字段指定。

示例(JSON 响应体)
{"code":200,"message":"success","data":{"id":1,"name":"test"}}

常见状态码分类

状态码分为五大类,首位数字表示类型:

  • 1xx(信息性状态码):请求已接收,继续处理(如100 Continue)。
  • 2xx(成功状态码):请求正常处理(如200 OK201 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-8application/json
Content-Length 实体的字节数(如Content-Length: 1024
Content-Encoding 实体的压缩方式(如gzipdeflate
Last-Modified 资源最后修改时间(如Last-Modified: Tue, 01 Aug 2023 00:00:00 GMT
Expires 实体过期时间(缓存失效时间,如Expires: Wed, 02 Aug 2023 00:00:00 GMT

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10