241121-REST、WebService与FastAPI之间的关系及示例代码

REST、Web Service 和 FastAPI 是现代 Web 应用开发中的重要概念或工具,下面分别介绍它们的定义及它们之间的关系:


A. REST(Representational State Transfer)

  • 定义

    REST 是一种 架构风格 ,用于设计网络分布式系统,特别是基于 HTTP 的 Web 应用。

    它通过定义一组约束(例如无状态通信、客户端-服务器分离、统一接口等),来确保系统的可扩展性和易用性。

  • 特点

    1. 使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE)进行操作。
    2. 数据以 JSON、XML 等格式传输,JSON 是最常见的格式。
    3. 面向资源的设计,所有的功能通过资源的 URL 表示(如 /users/orders)。
  • 用途

    REST 是许多 Web 服务和 API 的核心架构设计方式。


B. Web Service

  • 定义

    Web Service 是一种 协议或技术集合 ,用于通过网络提供应用之间的互操作性。

    它允许不同技术栈的应用(如 Java 和 Python)在网络中相互通信。

  • 种类

    Web Service 的实现方式有多种:

    1. 基于 SOAP(Simple Object Access Protocol):基于 XML 的协议,标准化程度高。
    2. 基于 REST:更轻量,广泛用于现代 Web 开发。
  • 关系与区别

    1. REST 并不是 Web Service 的一种技术,而是一种架构风格。
    2. Web Service 的一种流行实现是 RESTful Web Service,它遵循 REST 架构风格。

C. FastAPI

  • 定义

    FastAPI 是一个现代化、快速(基于 Starlette 和 Pydantic)、易用的 Python Web 框架,主要用于构建 RESTful API

  • 特点

    1. 高性能 :使用异步框架(如 asyncio),性能与 Node.js 和 Go 类似。
    2. 强大的数据验证:基于 Pydantic 的数据模型,支持类型检查和自动校验。
    3. 开发效率高
      • 自动生成交互式 API 文档(基于 OpenAPI 和 Swagger)。
      • 支持自动完成和类型检查(基于 Python 类型注解)。
    4. REST 支持:FastAPI 专门为实现 RESTful Web Service 设计,支持所有 HTTP 方法和资源管理。
  • 典型用途

    1. 构建高性能的 RESTful API。
    2. 提供微服务接口。
    3. 实现实时通信和数据处理。

D. 三者的关系

  1. REST 与 Web Service

    • REST 是一种设计架构。
    • Web Service 是实现应用通信的技术集合,RESTful Web Service 是两者的交集。
  2. FastAPI 与 REST

    • FastAPI 是用于构建 RESTful API 的框架,全面支持 REST 的约束和 HTTP 标准。
  3. 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))

部署步骤

  1. 运行服务器B

    • 确保安装了FastAPI和Uvicorn:

      bash 复制代码
      pip install fastapi uvicorn pandas
    • 启动服务器B:

      bash 复制代码
      uvicorn server_b:app --host 0.0.0.0 --port 8000
  2. 运行服务器A

    • 确保安装了requests库:

      bash 复制代码
      pip 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]]}"
}
相关推荐
ghostwritten19 小时前
Python FastAPI 实战应用指南
开发语言·python·fastapi
殷丿grd_志鹏4 天前
SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——主目录(持续更新)
vue.js·人工智能·python·spring cloud·fastapi
_.Switch4 天前
FastAPI 应用的容器化与 Docker 部署:提升性能与可扩展性
数据库·python·网络协议·docker·容器·eureka·fastapi
m0_748256785 天前
开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)
开源·交互·fastapi
_.Switch6 天前
高级Python Web开发:FastAPI前后端通信与跨域资源共享(CORS)实现详解
开发语言·前端·数据库·后端·python·中间件·fastapi
_.Switch7 天前
高效构建与部署Python Web应用:FastAPI的测试与持续集成
前端·网络·数据库·python·ci/cd·fastapi
_.Switch12 天前
FastAPI 的依赖注入与生命周期管理深度解析
开发语言·前端·python·中间件·性能优化·fastapi
namelijink15 天前
docker-compose部署下Fastapi中使用sqlalchemy和Alembic
adb·docker·fastapi
测开小林16 天前
Fastapi + vue3 自动化测试平台(2)--日志中间件
自动化测试·中间件·fastapi·测试工具开发
_.Switch19 天前
FastAPI 响应模型与自定义响应
开发语言·前端·数据库·python·fastapi·命令模式