服务端的访问点,简称为:端点
在基于FastAPI框架的WebSocket服务器中,常用到两类端点:“WebSocket端点”与“API端点”,它们在功能、用途和实现方式上存在显著的异同。以下是对两者的详细比较和举例说明:
两类端点的相同点
- 都是服务端的访问点:无论是WebSocket端点还是API端点,它们都是服务端提供的接口,用于客户端与服务器之间的通信。
- 通过路由访问:在FastAPI中,WebSocket端点和API端点都是通过路由装饰器(如
@app.websocket()
和@app.get()
,@app.post()
等)来定义的,客户端通过特定的URL来访问这些端点。
注:通过路由访问——参见:由路由装饰器定义URL
两类端点的不同点
功能和用途
- WebSocket端点
- 实时双向通信:WebSocket端点主要用于实现客户端和服务器之间的实时双向通信。一旦WebSocket连接建立,双方可以随时发送消息,无需重新建立连接。
- 应用场景:WebSocket非常适合需要实时通信的应用场景,如聊天应用、实时游戏、实时数据更新等。
- API端点
- 请求-响应模型:API端点遵循请求-响应模型,客户端发起请求,服务器处理请求并返回响应。每次请求都是独立的,服务器不会记住先前的请求状态(除非使用会话管理等技术)。
- 应用场景:API端点广泛用于各种Web服务中,如数据查询、资源管理等。它们通过HTTP协议提供对服务器资源的访问和操作。
实现方式
- 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()
等方法发送消息给客户端。 - 示例:
- 定义方式:在FastAPI中,使用
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端点外,还有其他多种类型的端点,它们各自具有不同的功能和用途。以下是一些常见的端点类型:
- 静态文件端点:
- 描述:用于提供静态文件(如HTML、CSS、JavaScript、图片等)的访问。这些文件通常存储在服务器的特定目录下,并通过HTTP请求直接发送给客户端。
- 用途:构建Web页面、提供样式和脚本支持、展示图片等。
- 流媒体端点:
- 描述:用于提供音频、视频等流媒体内容的访问。这些端点通常支持特定的流媒体协议,如HLS(HTTP Live Streaming)、DASH(Dynamic Adaptive Streaming over HTTP)等。
- 用途:在线视频播放、实时音频广播等。
- WebSocket API端点(虽然已提及,但在此上下文中强调其作为API的一部分):
- 描述:用于实现客户端和服务器之间的实时双向通信。WebSocket API端点允许双方在不重新建立连接的情况下,随时发送和接收数据。
- 用途:实时数据更新、即时消息传递、游戏等。
- RESTful API端点:
- 描述:遵循REST(Representational State Transfer)架构风格的API端点。这些端点使用HTTP协议,并通过URL、请求方法(如GET、POST、PUT、DELETE)和请求/响应体来定义和操作资源。
- 用途:数据查询、资源创建、更新和删除等。
- GraphQL API端点:
- 描述:GraphQL是一种用于API的查询语言,它允许客户端精确指定它们需要的数据,而不是依赖于多个请求和复杂的数据解析。GraphQL API端点支持GraphQL查询和变更操作。
- 用途:提供灵活且高效的数据查询和变更能力,适用于复杂的数据结构和需求。
- RPC(远程过程调用)端点:
- 描述:RPC允许一个程序调用另一个地址空间(通常是一个网络上的另一台机器)的过程或函数,就像调用本地程序中的函数一样。RPC端点提供了这种远程调用的接口。
- 用途:分布式系统中的服务间通信、微服务架构中的服务调用等。
- WebHooks端点:
- 描述:WebHooks是一种基于HTTP的“发布/订阅”模式,允许第三方在用户的数据发生变化时,通过HTTP请求实时通知用户。WebHooks端点就是这些通知的目标URL。
- 用途:自动化任务、集成第三方服务、实时数据同步等。
需要注意的是,这些端点类型并不是互斥的,一个Web应用可能会同时使用多种类型的端点来满足不同的需求。此外,随着技术的不断发展,还可能出现新的端点类型或现有类型的变种。