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]]}"
}
相关推荐
Amd79414 小时前
FastAPI依赖注入:从基础概念到应用
fastapi·错误处理·代码示例·认证系统·依赖注入测试·依赖解析·路由处理
清风序来1 天前
一,<FastApi>什么是FastApi?及框架介绍
fastapi
Amd7942 天前
FastAPI中实现动态条件必填字段的实践
fastapi·数据验证·pydantic·422错误处理·模型验证器·用户注册·动态必填字段
yukai080083 天前
【最后203篇系列】026 FastAPI+Celery(续)
fastapi
Amd7943 天前
FastAPI中Pydantic异步分布式唯一性校验
redis·fastapi·分布式锁·多级缓存·pydantic·唯一性校验·异步校验
techdashen4 天前
性能比拼: Go标准库 vs Python FastAPI
python·golang·fastapi
Amd7944 天前
掌握FastAPI与Pydantic的跨字段验证技巧
fastapi·web开发·数据校验·pydantic·验证器·api集成·跨字段验证
带娃的IT创业者5 天前
《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务
python·架构·flask·fastapi
Amd7945 天前
FastAPI中的Pydantic密码验证机制与实现
fastapi·数据验证·错误处理·pydantic·密码验证·安全机制·api集成
勘察加熊人6 天前
fastapi+angular在线音乐播放
前端·fastapi·angular.js