一、什么是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

特性GETPOST
作用获取资源提交数据(创建资源)
参数位置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让客户端保存CookieSet-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抓包

  1. 打开Chrome,按F12,点击Network标签。

  2. 访问https://www.baidu.com

  3. 点击第一个请求(通常是www.baidu.com),查看:

    • Headers:Request Headers(你的浏览器发出的请求头)和Response Headers(百度服务器返回的头)。

    • Response:返回的HTML内容。

  4. 找一个图片或CSS文件的请求,观察AcceptContent-Type等字段。

观察请求体如何发送,以及服务器返回的响应体。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐