找回密码
 立即注册
首页 业界区 业界 WebSocket与HTTP协议究竟有何不同?FastAPI如何让长连接 ...

WebSocket与HTTP协议究竟有何不同?FastAPI如何让长连接变得如此简单?

福清婉 2025-7-5 22:50:32
1.jpeg
扫描二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
第一章:WebSocket协议基础与FastAPI定位

1.1 WebSocket与HTTP协议核心差异

通过对比传统HTTP协议与WebSocket协议的核心特性,我们可以从以下维度理解二者的差异:
对比维度HTTP 1.1WebSocket通信模式请求-响应模式(半双工)全双工双向通信连接持久性短连接(默认关闭)长连接(保持激活状态)数据传输效率每次请求需携带完整Header初始握手后仅传输有效数据数据格式基于文本(支持二进制分帧)原生支持二进制帧和文本帧服务端推送能力依赖长轮询/SSE实现原生支持服务端主动推送sequenceDiagram    participant Client    participant Server    Client->>Server: HTTP Request    Server-->>Client: HTTP Response    Note over Client,Server: Traditional HTTP (Request/Response Model)    Client->>Server: WebSocket Handshake Request    Server-->>Client: WebSocket Handshake Response    Client->Server: WebSocket Connection Established    loop Continuous Communication        Client-->>Server: Send Data        Server-->>Client: Receive Data        Server-->>Client: Send Data        Client-->>Server: Receive Data    end    Note over Client,Server: WebSockets (Full-Duplex Communication)
类比理解:HTTP协议如同收发纸质信件(每次通信需重新建立连接),WebSocket则像是电话通话(建立连接后可随时双向对话)
1.2 FastAPI的WebSocket原生支持

1.2.1 基础路由配置

FastAPI通过简洁的装饰器语法支持WebSocket端点定义:
  1. from fastapi import FastAPI, WebSocket
  2. from pydantic import BaseModel
  3. app = FastAPI()
  4. class MessageModel(BaseModel):
  5.     content: str
  6.     type: str = "text"
  7. @app.websocket("/ws-chat")
  8. async def websocket_endpoint(websocket: WebSocket):
  9.     await websocket.accept()
  10.     try:
  11.         while True:
  12.             data = await websocket.receive_json()
  13.             message = MessageModel(**data)  # Pydantic数据验证
  14.             await websocket.send_json({"status": "received", "data": message.dict()})
  15.     except Exception as e:
  16.         await websocket.close(code=1011, reason=str(e))
复制代码
(使用环境:Python 3.8+, fastapi0.109.0, uvicorn0.27.0, pydantic==2.6.4)
1.2.2 关键技术特性


  • 异步处理架构:基于ASGI标准支持高并发连接
  • 自动协议升级:自动处理HTTP到WebSocket的协议切换
  • 数据验证集成:结合Pydantic实现强类型数据校验
  • 连接生命周期管理:提供accept()/receive()/send()/close()全流程控制
1.3 长连接应用场景实践

1.3.1 实时聊天系统
  1. # 存储活跃连接的全局字典
  2. active_connections = {}
  3. @app.websocket("/chat/{room_id}")
  4. async def chat_room(websocket: WebSocket, room_id: str):
  5.     await websocket.accept()
  6.     active_connections[websocket] = room_id
  7.     try:
  8.         while True:
  9.             message = await websocket.receive_text()
  10.             # 广播消息到同房间用户
  11.             for conn, r_id in active_connections.items():
  12.                 if r_id == room_id:
  13.                     await conn.send_text(f"Room {room_id}: {message}")
  14.     finally:
  15.         del active_connections[websocket]
复制代码
1.3.2 实时数据监控
  1. from datetime import datetime
  2. @app.websocket("/system-monitor")
  3. async def monitor_feed(websocket: WebSocket):
  4.     await websocket.accept()
  5.     while True:
  6.         # 模拟获取系统指标
  7.         metrics = {
  8.             "timestamp": datetime.now().isoformat(),
  9.             "cpu_load": os.getloadavg()[0],
  10.             "memory_usage": psutil.virtual_memory().percent
  11.         }
  12.         await websocket.send_json(metrics)
  13.         await asyncio.sleep(1)  # 每秒推送一次
复制代码
1.3.3 实时通知推送
  1. import redis
  2. from fastapi import BackgroundTasks
  3. redis_conn = redis.Redis(host='localhost', port=6379)
  4. async def notification_listener(websocket: WebSocket, user_id: str):
  5.     pubsub = redis_conn.pubsub()
  6.     await pubsub.subscribe(f"notifications:{user_id}")
  7.     while True:
  8.         message = await pubsub.get_message(ignore_subscribe_messages=True)
  9.         if message:
  10.             await websocket.send_text(message['data'])
  11. @app.websocket("/notifications")
  12. async def notification_endpoint(websocket: WebSocket, user_id: str):
  13.     await websocket.accept()
  14.     background_tasks = BackgroundTasks()
  15.     background_tasks.add_task(notification_listener, websocket, user_id)
  16.     await background_tasks()
复制代码
课后Quiz

Q1:WebSocket连接建立过程中,客户端首先发送的特殊HTTP Header是什么?
A) Upgrade: websocket
B) Connection: keep-alive
C) Accept: text/websocket
D) Protocol: ws
正确答案:A
解析:WebSocket握手阶段要求客户端发送Upgrade: websocket头,表示请求协议升级
常见报错解决方案

错误现象
WebSocket连接失败 400 Bad Request
排查步骤

  • 检查客户端是否使用ws://或wss://协议前缀
  • 验证服务器端是否正确定义WebSocket路由
  • 确认Nginx等反向代理配置包含以下参数:
    1. proxy_http_version 1.1;
    2. proxy_set_header Upgrade $http_upgrade;
    3. proxy_set_header Connection "upgrade";
    复制代码
  • 使用浏览器开发者工具查看WebSocket握手阶段的网络请求详情
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:WebSocket与HTTP协议究竟有何不同?FastAPI如何让长连接变得如此简单?
往期文章归档:


  • FastAPI如何玩转安全防护,让黑客望而却步?
  • 如何用三层防护体系打造坚不可摧的 API 安全堡垒? - cmdragon's Blog
  • FastAPI安全加固:密钥轮换、限流策略与安全头部如何实现三重防护? - cmdragon's Blog
  • 如何在FastAPI中巧妙玩转数据脱敏,让敏感信息安全无忧? - cmdragon's Blog
  • RBAC权限模型如何让API访问控制既安全又灵活? - cmdragon's Blog
  • FastAPI中的敏感数据如何在不泄露的情况下翩翩起舞?
  • FastAPI安全认证的终极秘籍:OAuth2与JWT如何完美融合? - cmdragon's Blog
  • 如何在FastAPI中打造坚不可摧的Web安全防线? - cmdragon's Blog
  • 如何用 FastAPI 和 RBAC 打造坚不可摧的安全堡垒? - cmdragon's Blog
  • FastAPI权限配置:你的系统真的安全吗? - cmdragon's Blog
  • FastAPI权限缓存:你的性能瓶颈是否藏在这只“看不见的手”里? | cmdragon's Blog
  • FastAPI日志审计:你的权限系统是否真的安全无虞? | cmdragon's Blog
  • 如何在FastAPI中打造坚不可摧的安全防线? | cmdragon's Blog
  • 如何在FastAPI中实现权限隔离并让用户乖乖听话? | cmdragon's Blog
  • 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅? | cmdragon's Blog
  • 如何在FastAPI中打造一个既安全又灵活的权限管理系统? | cmdragon's Blog
  • FastAPI访问令牌的权限声明与作用域管理:你的API安全真的无懈可击吗? | cmdragon's Blog
  • 如何在FastAPI中构建一个既安全又灵活的多层级权限系统? | cmdragon's Blog
  • FastAPI如何用角色权限让Web应用安全又灵活? | cmdragon's Blog
  • FastAPI权限验证依赖项究竟藏着什么秘密? | cmdragon's Blog
  • 如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统? | cmdragon's Blog
  • JWT令牌如何在FastAPI中实现安全又高效的生成与验证? | cmdragon's Blog
  • 你的密码存储方式是否在向黑客招手? | cmdragon's Blog
  • 如何在FastAPI中轻松实现OAuth2认证并保护你的API? | cmdragon's Blog
  • FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍 | cmdragon's Blog
  • FastAPI认证系统:从零到令牌大师的奇幻之旅 | cmdragon's Blog
  • FastAPI安全异常处理:从401到422的奇妙冒险 | cmdragon's Blog
  • FastAPI权限迷宫:RBAC与多层级依赖的魔法通关秘籍 | cmdragon's Blog
  • JWT令牌:从身份证到代码防伪的奇妙之旅 | cmdragon's Blog
  • FastAPI安全认证:从密码到令牌的魔法之旅 | cmdragon's Blog
  • 密码哈希:Bcrypt的魔法与盐值的秘密 | cmdragon's Blog
  • 用户认证的魔法配方:从模型设计到密码安全的奇幻之旅 | cmdragon's Blog
  • FastAPI安全门神:OAuth2PasswordBearer的奇妙冒险 | cmdragon's Blog
  • OAuth2密码模式:信任的甜蜜陷阱与安全指南 | cmdragon's Blog
  • API安全大揭秘:认证与授权的双面舞会 | cmdragon's Blog
  • 异步日志监控:FastAPI与MongoDB的高效整合之道 | cmdragon's Blog
免费好用的热门在线工具


  • CMDragon 在线工具 - 高级AI工具箱与开发者套件 | 免费好用的在线工具
  • 应用商店 - 发现1000+提升效率与开发的AI工具和实用程序 | 免费好用的在线工具
  • CMDragon 更新日志 - 最新更新、功能与改进 | 免费好用的在线工具
  • 支持我们 - 成为赞助者 | 免费好用的在线工具
  • AI文本生成图像 - 应用商店 | 免费好用的在线工具
  • 临时邮箱 - 应用商店 | 免费好用的在线工具
  • 二维码解析器 - 应用商店 | 免费好用的在线工具
  • 文本转思维导图 - 应用商店 | 免费好用的在线工具
  • 正则表达式可视化工具 - 应用商店 | 免费好用的在线工具
  • 文件隐写工具 - 应用商店 | 免费好用的在线工具
  • IPTV 频道探索器 - 应用商店 | 免费好用的在线工具
  • 快传 - 应用商店 | 免费好用的在线工具
  • 随机抽奖工具 - 应用商店 | 免费好用的在线工具
  • 动漫场景查找器 - 应用商店 | 免费好用的在线工具
  • 时间工具箱 - 应用商店 | 免费好用的在线工具
  • 网速测试 - 应用商店 | 免费好用的在线工具
  • AI 智能抠图工具 - 应用商店 | 免费好用的在线工具
  • 背景替换工具 - 应用商店 | 免费好用的在线工具
  • 艺术二维码生成器 - 应用商店 | 免费好用的在线工具
  • Open Graph 元标签生成器 - 应用商店 | 免费好用的在线工具
  • 图像对比工具 - 应用商店 | 免费好用的在线工具
  • 图片压缩专业版 - 应用商店 | 免费好用的在线工具
  • 密码生成器 - 应用商店 | 免费好用的在线工具
  • SVG优化器 - 应用商店 | 免费好用的在线工具
  • 调色板生成器 - 应用商店 | 免费好用的在线工具
  • 在线节拍器 - 应用商店 | 免费好用的在线工具
  • IP归属地查询 - 应用商店 | 免费好用的在线工具
  • CSS网格布局生成器 - 应用商店 | 免费好用的在线工具
  • 邮箱验证工具 - 应用商店 | 免费好用的在线工具
  • 书法练习字帖 - 应用商店 | 免费好用的在线工具
  • 金融计算器套件 - 应用商店 | 免费好用的在线工具
  • 中国亲戚关系计算器 - 应用商店 | 免费好用的在线工具
  • Protocol Buffer 工具箱 - 应用商店 | 免费好用的在线工具
  • IP归属地查询 - 应用商店 | 免费好用的在线工具
  • 图片无损放大 - 应用商店 | 免费好用的在线工具
  • 文本比较工具 - 应用商店 | 免费好用的在线工具
  • IP批量查询工具 - 应用商店 | 免费好用的在线工具
  • 域名查询工具 - 应用商店 | 免费好用的在线工具
  • DNS工具箱 - 应用商店 | 免费好用的在线工具
  • 网站图标生成器 - 应用商店 | 免费好用的在线工具
  • XML Sitemap

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册