一、http请求结构


http一般包含这几个部分:
请求行(Request Line)
请求头(Request Headers)
空行(Blank Line)
请求体(Request Body)
1、请求行(Request Line)
请求行是 HTTP请求的第一行,包含三个内容:
请求方法 请求路径 HTTP版本
例如:
GET /index.html HTTP/1.1
含义:
| 部分 | 说明 |
|---|---|
| GET | 请求方法 |
| /index.html | 请求资源路径 |
| HTTP/1.1 | HTTP协议版本 |
常见请求方法:
GET
POST
PUT
DELETE
PATCH
OPTIONS
HEAD
2、请求头(Request Headers)
请求头用于描述 客户端信息和请求相关信息 ,由多行 key:value 组成。
例如:
Host: www.example.com
User-Agent: Chrome/120
Accept: application/json
Content-Type: application/json
Cookie: sessionId=123456
常见请求头:
| 请求头 | 作用 |
|---|---|
| Host | 请求的服务器地址 |
| User-Agent | 浏览器类型 |
| Accept | 可接受的数据类型 |
| Content-Type | 请求体数据类型 |
| Content-Length | 请求体长度 |
| Cookie | 携带的Cookie |
| Authorization | 认证信息 |
3、空行(Blank Line)
请求头结束后会有 一行空行 :
作用是: 分隔请求头和请求体
HTTP 协议通过这一个空行来判断 Header结束。
4、请求体(Request Body)
请求体是 真正提交给服务器的数据 。
只有部分请求方法才会有请求体,例如:
POST
PUT
PATCH
GET 一般没有请求体。
常见请求体格式:
1 表单
application/x-www-form-urlencoded
示例:
username=tom&password=123
2 JSON
application/json
示例:
{
"username": "tom",
"password": "123"
}
3 文件上传
multipart/form-data
用于:
-
上传图片
-
上传文件
5、完整 HTTP 请求示例
POST /login HTTP/1.1
Host: www.example.com
User-Agent: Chrome
Content-Type: application/json
Content-Length: 45
{
"username":"tom",
"password":"123456"
}
结构解析:
POST /login HTTP/1.1 ← 请求行 Host: www.example.com ← 请求头 User-Agent: Chrome ← 请求头 Content-Type: application/json Content-Length: 45 ← 空行 { ← 请求体 "username":"tom", "password":"123456" }
二、http响应结构

HTTP 响应(HTTP Response) 是服务器返回给客户端(浏览器)的数据。
它的结构和 HTTP 请求类似,也由 四个部分组成:
状态行(Status Line)
响应头(Response Headers)
空行(Blank Line)
响应体(Response Body)
1、状态行(Status Line)
状态行是 HTTP响应的第一行,包含三个内容:
HTTP版本 状态码 状态描述
例如:
HTTP/1.1 200 OK
含义:
| 部分 | 含义 |
|---|---|
| HTTP/1.1 | HTTP协议版本 |
| 200 | 状态码 |
| OK | 状态描述 |
常见状态码分为五类:
| 类型 | 含义 |
|---|---|
| 1xx | 信息响应 |
| 2xx | 成功 |
| 3xx | 重定向 |
| 4xx | 客户端错误 |
| 5xx | 服务器错误 |
常见状态码:
| 状态码 | 含义 |
|---|---|
| 200 | 请求成功 |
| 201 | 创建成功 |
| 204 | 无内容 |
| 301 | 永久重定向 |
| 302 | 临时重定向 |
| 304 | 资源未修改(缓存) |
| 400 | 请求错误 |
| 401 | 未认证 |
| 403 | 禁止访问 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
| 502 | 网关错误 |
| 503 | 服务不可用 |
2、响应头(Response Headers)
响应头用于描述 服务器返回的数据和服务器信息 。
格式:
Header-Name: value
例如:
Content-Type: application/json
Content-Length: 120
Server: nginx
Set-Cookie: sessionId=abc123
Cache-Control: max-age=3600
常见响应头:
1 Content-Type :表示返回的数据类型。
例如:
Content-Type: text/html
Content-Type: application/json
Content-Type: image/png
常见类型:
| 类型 | 说明 |
|---|---|
| text/html | HTML页面 |
| application/json | JSON数据 |
| text/plain | 普通文本 |
| image/png | 图片 |
| application/pdf | PDF文件 |
2 Content-Length:表示响应体的长度(字节数)。
例如:
Content-Length: 348
3 Server:服务器软件信息。
例如:
Server: nginx
Server: Apache
Server: Tomcat
4 Set-Cookie:服务器向浏览器设置 Cookie。
例如:
Set-Cookie: sessionId=abc123; Path=/; HttpOnly
浏览器以后请求会携带:
Cookie: sessionId=abc123
5 Cache-Control:控制缓存策略。
例如:
Cache-Control: no-cache
Cache-Control: max-age=3600
含义:
| 值 | 含义 |
|---|---|
| no-cache | 每次都要验证 |
| no-store | 不缓存 |
| max-age=3600 | 缓存3600秒 |
6 Location:用于 重定向。
例如:
HTTP/1.1 302 Found
Location: https://example.com/login
浏览器会跳转到新的地址。
7 Content-Encoding:表示响应是否压缩。
例如:
Content-Encoding: gzip
浏览器会自动解压。
3、空行(Blank Line)
响应头结束后会有 一行空行, 作用: 分隔响应头和响应体。
HTTP 协议通过这行空行判断 Header结束。
4、响应体(Response Body)
响应体是 服务器真正返回的数据 。
可能是:
1 HTML页面
Content-Type: text/html
例如:
<html>
<head>
<title>Hello</title>
</head>
<body>
Hello World
</body>
</html>
2 JSON数据(接口返回)
Content-Type: application/json
例如:
{
"code": 200,
"msg": "success",
"data": {
"id": 1,
"name": "Tom"
}
}
3 文件
例如下载:
Excel
图片
ZIP
响应头通常包含:
Content-Type: application/pdf
Content-Disposition: attachment; filename=test.pdf
之前做的 Java 文件下载接口 就是返回这种响应。
5、完整 HTTP 响应示例
服务器返回:
HTTP/1.1 200 OK
Server: nginx
Content-Type: application/json
Content-Length: 58
Set-Cookie: sessionId=abc123
{
"code": 200,
"msg": "success",
"data": {}
}
结构解析:
HTTP/1.1 200 OK ← 状态行
Server: nginx ← 响应头
Content-Type: application/json
Content-Length: 58
Set-Cookie: sessionId=abc123
← 空行
{ ← 响应体
"code":200,
"msg":"success"
}
三、http是如何传输数据的
1、HTTP传输的本质:字节流
在网络中传输的数据其实是:Byte Stream(字节流)
HTTP报文在网络里其实是这样的:
01001000 01010100 01010100 01010000 ...
无论是:
HTML
JSON
图片
视频
Excel
最后都会变成:
byte[]
然后通过 TCP协议 发送。