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

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

更多推荐