基于FastAPI框架的WebSocket服务器中的“WebSocket端点”与“API端点”

服务端的访问点,简称为:端点

在基于FastAPI框架的WebSocket服务器中,常用到两类端点:“WebSocket端点”与“API端点”,它们在功能、用途和实现方式上存在显著的异同。以下是对两者的详细比较和举例说明:

两类端点的相同点

  1. 都是服务端的访问点:无论是WebSocket端点还是API端点,它们都是服务端提供的接口,用于客户端与服务器之间的通信。
  2. 通过路由访问:在FastAPI中,WebSocket端点和API端点都是通过路由装饰器(如@app.websocket()@app.get()@app.post()等)来定义的,客户端通过特定的URL来访问这些端点。

注:通过路由访问——参见:由路由装饰器定义URL 

两类端点的不同点

功能和用途
  1. WebSocket端点
    • 实时双向通信:WebSocket端点主要用于实现客户端和服务器之间的实时双向通信。一旦WebSocket连接建立,双方可以随时发送消息,无需重新建立连接。
    • 应用场景:WebSocket非常适合需要实时通信的应用场景,如聊天应用、实时游戏、实时数据更新等。
  2. API端点
    • 请求-响应模型:API端点遵循请求-响应模型,客户端发起请求,服务器处理请求并返回响应。每次请求都是独立的,服务器不会记住先前的请求状态(除非使用会话管理等技术)。
    • 应用场景:API端点广泛用于各种Web服务中,如数据查询、资源管理等。它们通过HTTP协议提供对服务器资源的访问和操作。
实现方式
  1. WebSocket端点
    • 定义方式:在FastAPI中,使用@app.websocket()装饰器来定义WebSocket端点。
    • 处理函数:处理函数是异步的,使用async def定义。函数内部,可以使用await websocket.accept()来接受连接,使用await websocket.receive_text()await websocket.receive_bytes()等方法接收客户端消息,使用await websocket.send_text()await websocket.send_bytes()等方法发送消息给客户端。
    • 示例
from fastapi import FastAPI, WebSocket  

app = FastAPI()  

@app.websocket("/ws")  
async def websocket_endpoint(websocket: WebSocket):  
    await websocket.accept()  
    while True:  
        data = await websocket.receive_text()  
        await websocket.send_text(f"Message text was: {data}")

2. API端点

  • 定义方式:在FastAPI中,使用@app.get()@app.post()@app.put()@app.delete()等装饰器来定义不同HTTP方法的API端点。
  • 处理函数:处理函数可以是同步的也可以是异步的(但通常对于简单的请求处理,同步函数就足够了)。函数内部,可以接收请求参数,处理业务逻辑,并返回响应。
  • 示例
from fastapi import FastAPI  

app = FastAPI()  

@app.get("/")  
def read_root():  
    return {"Hello": "World"}

小结

WebSocket端点和API端点在FastAPI框架中扮演着不同的角色,分别适用于不同的通信需求和应用场景。WebSocket端点通过实现实时双向通信,为需要实时数据更新的应用提供了强大的支持;而API端点则通过请求-响应模型,为各种Web服务提供了灵活的数据访问和操作方式。

补充:其它端点

在Web开发领域,除了WebSocket端点和API端点外,还有其他多种类型的端点,它们各自具有不同的功能和用途。以下是一些常见的端点类型:

  1. 静态文件端点
    • 描述:用于提供静态文件(如HTML、CSS、JavaScript、图片等)的访问。这些文件通常存储在服务器的特定目录下,并通过HTTP请求直接发送给客户端。
    • 用途:构建Web页面、提供样式和脚本支持、展示图片等。
  2. 流媒体端点
    • 描述:用于提供音频、视频等流媒体内容的访问。这些端点通常支持特定的流媒体协议,如HLS(HTTP Live Streaming)、DASH(Dynamic Adaptive Streaming over HTTP)等。
    • 用途:在线视频播放、实时音频广播等。
  3. WebSocket API端点(虽然已提及,但在此上下文中强调其作为API的一部分):
    • 描述:用于实现客户端和服务器之间的实时双向通信。WebSocket API端点允许双方在不重新建立连接的情况下,随时发送和接收数据。
    • 用途:实时数据更新、即时消息传递、游戏等。
  4. RESTful API端点
    • 描述:遵循REST(Representational State Transfer)架构风格的API端点。这些端点使用HTTP协议,并通过URL、请求方法(如GET、POST、PUT、DELETE)和请求/响应体来定义和操作资源。
    • 用途:数据查询、资源创建、更新和删除等。
  5. GraphQL API端点
    • 描述:GraphQL是一种用于API的查询语言,它允许客户端精确指定它们需要的数据,而不是依赖于多个请求和复杂的数据解析。GraphQL API端点支持GraphQL查询和变更操作。
    • 用途:提供灵活且高效的数据查询和变更能力,适用于复杂的数据结构和需求。
  6. RPC(远程过程调用)端点
    • 描述:RPC允许一个程序调用另一个地址空间(通常是一个网络上的另一台机器)的过程或函数,就像调用本地程序中的函数一样。RPC端点提供了这种远程调用的接口。
    • 用途:分布式系统中的服务间通信、微服务架构中的服务调用等。
  7. WebHooks端点
    • 描述:WebHooks是一种基于HTTP的“发布/订阅”模式,允许第三方在用户的数据发生变化时,通过HTTP请求实时通知用户。WebHooks端点就是这些通知的目标URL。
    • 用途:自动化任务、集成第三方服务、实时数据同步等。

需要注意的是,这些端点类型并不是互斥的,一个Web应用可能会同时使用多种类型的端点来满足不同的需求。此外,随着技术的不断发展,还可能出现新的端点类型或现有类型的变种。

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 FastAPI 使用 WebSocket,需要使用 FastAPIWebSocketEndpoint 类,该类是 WebSocket 协议的一个实现。以下是一个使用 FastAPI WebSocket 的简单示例: ```python from fastapi import FastAPI, WebSocket app = FastAPI() @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(f"You said: {data}") ``` 在上面的代码,定义了一个 WebSocket 端点 `/ws`,并使用 `async def` 定义了一个异步函数 `websocket_endpoint`。该函数的形参是一个 WebSocket,它将在连接建立时自动创建。 使用 `await websocket.accept()` 方法来接受 WebSocket 的连接请求,并在之后的循环等待从客户端接收到的数据。使用 `await websocket.receive_text()` 方法接收数据,并使用 `await websocket.send_text()` 方法向客户端发送响应。 可以使用 Python 的 WebSocket 客户端来测试这个 WebSocket 端点,比如使用 `websockets` 库: ```python import asyncio import websockets async def send_message(): async with websockets.connect('ws://localhost:8000/ws') as websocket: await websocket.send('Hello') response = await websocket.recv() print(response) asyncio.get_event_loop().run_until_complete(send_message()) ``` 在上面的代码,使用 `websockets.connect()` 方法连接到 WebSocket 端点,发送一个消息,并等待回复。最后,使用 `print()` 方法打印回复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值