REST、Web Service 和 FastAPI 是现代 Web 应用开发中的重要概念或工具,下面分别介绍它们的定义及它们之间的关系:
A. REST(Representational State Transfer)
-
定义 :
REST 是一种 架构风格 ,用于设计网络分布式系统,特别是基于 HTTP 的 Web 应用。
它通过定义一组约束(例如无状态通信、客户端-服务器分离、统一接口等),来确保系统的可扩展性和易用性。
-
特点:
- 使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE)进行操作。
- 数据以 JSON、XML 等格式传输,JSON 是最常见的格式。
- 面向资源的设计,所有的功能通过资源的 URL 表示(如
/users
、/orders
)。
-
用途 :
REST 是许多 Web 服务和 API 的核心架构设计方式。
B. Web Service
-
定义 :
Web Service 是一种 协议或技术集合 ,用于通过网络提供应用之间的互操作性。
它允许不同技术栈的应用(如 Java 和 Python)在网络中相互通信。
-
种类 :
Web Service 的实现方式有多种:
- 基于 SOAP(Simple Object Access Protocol):基于 XML 的协议,标准化程度高。
- 基于 REST:更轻量,广泛用于现代 Web 开发。
-
关系与区别:
- REST 并不是 Web Service 的一种技术,而是一种架构风格。
- Web Service 的一种流行实现是 RESTful Web Service,它遵循 REST 架构风格。
C. FastAPI
-
定义 :
FastAPI 是一个现代化、快速(基于 Starlette 和 Pydantic)、易用的 Python Web 框架,主要用于构建 RESTful API。
-
特点:
- 高性能 :使用异步框架(如
asyncio
),性能与 Node.js 和 Go 类似。 - 强大的数据验证:基于 Pydantic 的数据模型,支持类型检查和自动校验。
- 开发效率高 :
- 自动生成交互式 API 文档(基于 OpenAPI 和 Swagger)。
- 支持自动完成和类型检查(基于 Python 类型注解)。
- REST 支持:FastAPI 专门为实现 RESTful Web Service 设计,支持所有 HTTP 方法和资源管理。
- 高性能 :使用异步框架(如
-
典型用途:
- 构建高性能的 RESTful API。
- 提供微服务接口。
- 实现实时通信和数据处理。
D. 三者的关系
-
REST 与 Web Service:
- REST 是一种设计架构。
- Web Service 是实现应用通信的技术集合,RESTful Web Service 是两者的交集。
-
FastAPI 与 REST:
- FastAPI 是用于构建 RESTful API 的框架,全面支持 REST 的约束和 HTTP 标准。
-
FastAPI 与 Web Service:
- FastAPI 是一种工具,可以实现 RESTful Web Service。
- 它简化了 Web Service 开发,并通过自动化文档、异步处理等提升开发效率。
E. 总结对比
特性 | REST | Web Service | FastAPI |
---|---|---|---|
性质 | 架构风格 | 技术集合 | Python Web 框架 |
重点 | 资源管理与操作 | 系统间通信 | 高效构建 RESTful API |
应用场景 | 构建 API 设计规范 | 提供服务的技术实现 | 实现 RESTful Web Service |
开发工具支持 | 不限 | SOAP/RESTful API 工具 | FastAPI 框架及生态工具 |
通过 FastAPI,你可以轻松地实现基于 REST 的 Web Service,既符合 REST 架构规范,又能高效地构建和管理 API。
F. 案例分析
- 需求描述
Python代码构建REST服务,服务器A提供一个列数固定,行数变换的dataframe传递给该REST服务所在的服务器B,该服务器B会计算每一列的平均值,随后,返回给服务器A
- 测试代码
以下是一个实现此需求的Python代码示例,分别包含服务器A和服务器B的代码,使用FastAPI构建REST服务。
服务器A代码(发送DataFrame并接收结果)
python
import pandas as pd
import requests
def send_dataframe():
# 创建一个示例DataFrame
data = {
"Column1": [1, 2, 3],
"Column2": [4, 5, 6],
"Column3": [7, 8, 9]
}
df = pd.DataFrame(data)
# 将DataFrame转换为JSON
df_json = df.to_json(orient='split')
# 向服务器B发送请求
url = "http://<SERVER_B_IP>:8000/calculate-averages"
response = requests.post(url, json={"data": df_json})
if response.status_code == 200:
print("Received averages from server B:", response.json())
else:
print("Failed to get response from server B:", response.status_code)
if __name__ == "__main__":
send_dataframe()
服务器B代码(接收DataFrame并计算平均值)
python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import pandas as pd
app = FastAPI()
class DataFrameRequest(BaseModel):
data: str # DataFrame in JSON format (orient='split')
@app.post("/calculate-averages")
async def calculate_averages(request: DataFrameRequest):
try:
# 解析收到的JSON为DataFrame
df = pd.read_json(request.data, orient='split')
# 计算每一列的平均值
averages = df.mean().to_dict()
# 返回平均值
return {"averages": averages}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
部署步骤
-
运行服务器B:
-
确保安装了FastAPI和Uvicorn:
bashpip install fastapi uvicorn pandas
-
启动服务器B:
bashuvicorn server_b:app --host 0.0.0.0 --port 8000
-
-
运行服务器A:
-
确保安装了
requests
库:bashpip install requests pandas
-
替换
<SERVER_B_IP>
为服务器B的IP地址。 -
运行服务器A脚本。
-
测试结果
服务器A发送DataFrame至服务器B,服务器B计算各列的平均值后返回结果。
服务器A会打印类似的返回值:
plaintext
Received averages from server B: {'Column1': 2.0, 'Column2': 5.0, 'Column3': 8.0}
- Swagger-UI: request-body
bash
{
"data": "{\"columns\":[\"Column1\",\"Column2\",\"Column3\"],\"index\":[0,1,2],\"data\":[[1,4,7],[2,5,8],[3,6,9]]}"
}