请求报文和响应报文(详细讲解)
在网络通信中,请求报文(客户端向服务器发送的请求)和响应报文(服务器向客户端返回的结果)是数据交互的核心载体。不同的协议(如 HTTP、FTP、SMTP 等)有不同的报文格式,其中HTTP 协议是最常用的,以下以 HTTP/1.1 为例,详细讲解请求报文和响应报文的格式及各部分含义。
🐳一、HTTP 请求报文格式
HTTP 请求报文由请求行(Request Line)、请求头(Request Headers)、空行和请求体(Request Body) 四部分组成,格式如下:
请求行
请求头字段1: 值1
请求头字段2: 值2
...
空行(CRLF,即回车+换行)
请求体(可选)
🍉1. 请求行(Request Line)
请求行是请求报文的第一行,包含三个部分,用空格分隔:
- 请求方法(Method):表示客户端希望服务器执行的操作(如 GET、POST 等)。
- 请求 URI(Uniform Resource Identifier):指定要访问的资源路径(如
/index.html
)。 - HTTP 版本:客户端使用的 HTTP 协议版本(如
HTTP/1.1
)。
示例:
GET /api/user?id=123 HTTP/1.1
(含义:使用 GET 方法请求/api/user
资源,携带参数id=123
,协议版本为 HTTP/1.1)
常见请求方法:
- GET:获取资源(请求体通常为空,参数放在 URL 中)。
- POST:提交数据(参数放在请求体中,适合传输大量或敏感数据)。
- PUT:更新资源(整体替换)。
- DELETE:删除资源。
- HEAD:类似 GET,但只返回响应头(用于检查资源是否存在)。
🍉2. 请求头(Request Headers)
请求头是一系列键值对(格式:Key: Value
),用于向服务器传递附加信息(如客户端类型、支持的数据格式等)。每个字段占一行,常见字段如下:
🍉3. 空行
请求头与请求体之间必须有一个空行(由CRLF
即\r\n
组成),用于分隔头部和正文,服务器通过空行判断请求头结束。
🍉4. 请求体(Request Body)
请求体是可选的,仅在需要向服务器提交数据时存在(如 POST、PUT 方法)。其内容格式由Content-Type
字段指定,常见格式:
application/x-www-form-urlencoded
:表单数据(如username=test&password=123
)。multipart/form-data
:用于上传文件(包含二进制数据)。application/json
:JSON 格式数据(如{"name":"test","age":20}
)。
x-www-form-urlencoded
:用@RequestParam
或HttpServletRequest.getParameter
。
application/json
:用@RequestBody
绑定对象(需加@RestController
)。
multipart/form-data
:用@RequestPart
或MultipartFile
接收文件。
示例(POST 请求体):
username=admin&password=123456
(对应Content-Type: application/x-www-form-urlencoded
)
🐳二、HTTP 响应报文格式
响应报文由状态行(Status Line)、响应头(Response Headers)、空行和响应体(Response Body) 四部分组成,格式如下:
状态行
响应头字段1: 值1
响应头字段2: 值2
...
空行(CRLF)
响应体(可选)
🍉1. 状态行(Status Line)
状态行是响应报文的第一行,包含三个部分,用空格分隔:
- HTTP 版本:服务器使用的 HTTP 协议版本(如
HTTP/1.1
)。 - 状态码(Status Code):三位数的数字,表示请求处理结果(如 200 表示成功)。
- 状态描述(Reason Phrase):对状态码的文字解释(如
OK
、Not Found
)。
示例:
HTTP/1.1 200 OK
(含义:协议版本 HTTP/1.1,请求成功,状态描述为 OK)
常见状态码分类:
- 1xx(信息性):请求已接收,继续处理(如 100 Continue)。
- 2xx(成功):请求被正常处理(如 200 OK、201 Created)。
- 3xx(重定向):需要进一步操作才能完成请求(如 301 永久重定向、302 临时重定向)。
- 4xx(客户端错误):请求有误,服务器无法处理(如 404 Not Found、403 Forbidden)。
- 5xx(服务器错误):服务器处理请求时出错(如 500 Internal Server Error)。
🍉2. 响应头(Response Headers)
响应头是服务器向客户端传递的附加信息(如响应数据格式、缓存策略等),格式与请求头一致(Key: Value
)。常见字段:
🍉3. 空行
与请求报文类似,响应头与响应体之间必须有一个空行,用于分隔头部和正文。
🍉4. 响应体(Response Body)
响应体是服务器返回的实际数据(如 HTML 页面、JSON 数据、图片等),其格式由Content-Type
字段指定。
示例(JSON 响应体):
{"code": 200, "message": "success", "data": {"id": 1, "name": "test"}}
🐳三、完整示例对比
🍉1. 请求报文示例(POST 请求)
POST /api/login HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/116.0.0.0
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: sessionId=abc123username=admin&password=123456
🍉2. 响应报文示例(成功响应)
HTTP/1.1 200 OK
Server: Nginx/1.21.0
Date: Mon, 11 Aug 2025 08:00:00 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 78
Set-Cookie: token=xyz; Max-Age=3600{"code": 200, "message": "登录成功", "data": {"token": "xyz", "expire": 3600}}