HTTP入门,这一篇就够了
HTTP协议是Web客户端与服务器通信的基础协议,采用请求-响应模型和无状态设计。请求报文包含请求行、请求头和可选请求体,响应报文由状态行、响应头和响应体组成。常见状态码分为2xx成功、3xx重定向、4xx客户端错误和5xx服务器错误。HTTP方法包括GET(获取)、POST(提交)、PUT(替换)等,具有不同的幂等性和安全性。为解决无状态问题,使用Cookie/Session/Token技术。通
一、什么是HTTP协议?
定义:HTTP(HyperText Transfer Protocol,超文本传输协议)是Web上客户端(如浏览器)和服务器之间交换数据的“约定语言”。它规定了请求和响应的格式、方法、状态码等。
一句话:你在浏览器输入网址,浏览器按照HTTP协议格式“说话”,服务器听懂后按同样格式“回答”。
为什么需要协议?
不同设备、不同软件要能互通,必须提前约定好:消息怎么开头、参数放哪里、如何表示成功或失败。
二、HTTP特点
1.基于TCP协议
-
TCP提供可靠、面向连接的传输:数据不会丢、不会乱序。
-
HTTP在TCP连接上传输纯文本(HTTP/1.x)或二进制(HTTP/2)。
-
连接过程:三次握手建立TCP连接 → 发送HTTP请求 → 接收HTTP响应 → 四次挥手断开(或保持持久连接)。
注意:HTTP本身不负责加密、不负责连接管理,这些都交给TCP或TLS(HTTPS)
2. 请求-响应模型
-
客户端主动发起请求,服务器被动返回响应。服务器永远不会主动推数据给客户端(WebSocket除外)。
-
一次完整的“一问一答”称为一个事务。(一次请求对应一次响应)
类比:打电话给客服。你(客户端)先说话,客服(服务器)听了之后回答。客服不会在你没说话的时候突然开口。
3. 无状态(Stateless)
-
服务器默认不记住这个用户之前发过什么请求。每次请求都是独立的。
-
优点:服务器设计简单,无需为每个用户维护状态,容易横向扩展(加机器就行),速度快。
-
缺点:需要登录、购物车等场景时,无法直接实现。需要借助额外技术(Cookie、Session、Token),多次请求间不能共享数据。
理解:你去便利店买水,每次老板都把你当陌生人。你想让他记得你?那得给他看会员卡(Cookie)。
三、HTTP请求协议
请求报文由三部分组成:请求行、请求头、请求体(请求体不一定有)。
1. 请求行
格式:方法 路径 协议版本
示例:GET /index.html HTTP/1.1
-
方法:告诉服务器你要做什么(GET获取资源,POST提交数据…)。
-
路径:要访问的资源路径,如
/user/100。可以包含查询参数,如/search?q=http。 -
协议版本:HTTP/1.0、HTTP/1.1、HTTP/2。目前1.1最普遍。
2. 请求头(Headers)
键值对,每行一个,用冒号分隔。常见请求头:
| 请求头 | 含义 | 示例 |
|---|---|---|
Host |
请求的主机名(必填) | Host: www.baidu.com |
User-Agent |
客户端软件信息 | User-Agent: Chrome/120 |
Accept |
客户端能接受的MIME类型 | Accept: text/html, application/json |
Accept-Encoding |
支持的压缩算法 | Accept-Encoding: gzip, deflate |
Accept-Language |
期望的语言 | Accept-Language: zh-CN,zh;q=0.9 |
Content-Type |
请求体数据的类型(POST/PUT时用) | Content-Type: application/json |
Content-Length |
请求体字节数 | Content-Length: 25 |
Authorization |
认证凭证 | Authorization: Bearer xyz123 |
3. 请求体(Body)
只出现在POST、PUT、PATCH等方法中,GET/DELETE一般没有。
用于携带要提交给服务器的数据,如表单、JSON、文件。
GET vs POST:
| 特性 | GET | POST |
|---|---|---|
| 作用 | 获取资源 | 提交数据(创建资源) |
| 参数位置 | URL查询字符串(?key=value) |
请求体 |
| 长度限制 | 有(浏览器限制,约2KB) | 无限制(服务器可配置) |
| 缓存 | 可以被浏览器缓存 | 一般不缓存 |
| 书签 | 可以收藏 | 不能收藏 |
| 安全性 | 参数暴露在URL,不安全 | 相对安全(但HTTPS才真安全) |
| 幂等性 | 是(多次请求结果一样) | 否(多次提交可能创建多个资源) |
注意:不要用GET提交密码等敏感信息,也不要用GET做删除操作。
四、HTTP响应协议
响应报文由三部分组成:状态行、响应头、响应体。
1. 状态行
格式:协议版本 状态码 状态描述
示例:HTTP/1.1 200 OK
-
状态码:三位数字,表示请求结果。
-
状态描述:简短的文本说明。
2. 响应头
同样为键值对。常见响应头:
| 响应头 | 含义 | 示例 |
|---|---|---|
Content-Type |
响应体的数据类型 | Content-Type: text/html; charset=utf-8 |
Content-Length |
响应体大小 | Content-Length: 1024 |
Set-Cookie |
让客户端保存Cookie | Set-Cookie: sessionId=abc123; HttpOnly |
Location |
重定向的目标地址 | Location: /new-page |
Cache-Control |
缓存控制 | Cache-Control: max-age=3600 |
3. 响应体
服务器返回的实际数据,可以是HTML、JSON、图片、文件等。浏览器或客户端根据Content-Type解析。
五、常见状态码
| 状态码 | 类别 | 含义 | 典型场景 |
|---|---|---|---|
| 200 | 成功 | OK,请求成功 | GET返回数据 |
| 201 | 成功 | Created,资源创建成功 | POST新建用户后返回 |
| 204 | 成功 | No Content,成功但无返回体 | DELETE删除成功 |
| 301 | 重定向 | Moved Permanently,永久移动 | 网站换域名 |
| 302 | 重定向 | Found,临时移动 | 未登录跳转登录页 |
| 304 | 重定向 | Not Modified,缓存未过期 | 浏览器使用本地缓存 |
| 400 | 客户端错误 | Bad Request,请求格式错误 | JSON格式不对 |
| 401 | 客户端错误 | Unauthorized,未认证 | 未提供token |
| 403 | 客户端错误 | Forbidden,无权限 | 登录了但没权限 |
| 404 | 客户端错误 | Not Found,资源不存在 | URL写错了 |
| 405 | 客户端错误 | Method Not Allowed | 用了GET但接口只支持POST |
| 500 | 服务器错误 | Internal Server Error | 后端程序抛异常 |
| 502 | 服务器错误 | Bad Gateway | 网关或代理问题 |
| 503 | 服务器错误 | Service Unavailable | 服务器过载或维护 |
记忆口诀:2xx成功,3xx搬家,4xx你错了,5xx我错了。
六、常见HTTP方法
| 方法 | 作用 | 是否携带请求体 | 幂等性 | 安全(只读) |
|---|---|---|---|---|
| GET | 获取资源 | 否 | 是 | 是 |
| POST | 提交数据/创建资源 | 是 | 否 | 否 |
| PUT | 整体替换资源 | 是 | 是 | 否 |
| DELETE | 删除资源 | 通常否 | 是 | 否 |
| PATCH | 局部更新资源 | 是 | 否 | 否 |
| HEAD | 同GET,只返回头部 | 否 | 是 | 是 |
| OPTIONS | 查询支持的HTTP方法 | 否 | 是 | 是 |
幂等性:多次执行相同请求,对服务器的状态影响与执行一次相同。
例如:DELETE执行两次和一次结果一样(资源已被删除)。POST多次可能创建多个订单,所以不幂等。
安全性:不修改服务器数据。GET和HEAD是安全的。
七、无状态解决方案
-
Cookie:服务器通过
Set-Cookie让客户端保存小数据,后续请求自动带上。 -
Session:服务器在内存/Redis中存储用户状态,客户端只保存Session ID(通常存在Cookie)。
-
Token(如JWT):客户端保存加密令牌,请求时放在
Authorization头,服务器验证签名即可,无需存储会话。
一句话总结:用Cookie/Session/Token给HTTP加上“记忆”。
八、动手实验(F12)
实验:浏览器F12抓包
-
打开Chrome,按
F12,点击Network标签。 -
访问
https://www.baidu.com。 -
点击第一个请求(通常是
www.baidu.com),查看:-
Headers:Request Headers(你的浏览器发出的请求头)和Response Headers(百度服务器返回的头)。
-
Response:返回的HTML内容。
-
-
找一个图片或CSS文件的请求,观察
Accept、Content-Type等字段。
观察请求体如何发送,以及服务器返回的响应体。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)