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]]}"
}
相关推荐
计算衎15 小时前
FastAPI后端和VUE前端的数据交互原理详解
前端·vue.js·fastapi
IMPYLH15 小时前
Lua 的 Debug(调试) 模块
开发语言·笔记·python·单元测试·lua·fastapi
@我本楚狂人16 小时前
Python MCP实战:构建 FastAPI 服务端与客户端示例&MCP客户端调用
开发语言·python·fastapi
绝不收费—免费看不了了联系我1 天前
Fastapi的单进程响应问题 和 解决方法
开发语言·后端·python·fastapi
Non-existent9871 天前
Flutter + FastAPI 30天速成计划自用并实践-第10天-组件化开发实践
android·flutter·fastapi
闲人编程2 天前
FastAPI性能优化技巧
后端·python·性能优化·fastapi·性能·codecapsule
力江2 天前
FastAPI 最佳架构实践,从混乱到优雅的进化之路
python·缓存·架构·单元测试·fastapi·分页·企业
询问QQ688238863 天前
多策略增强型的改进蛇优化算法在Matlab中的实现与探讨
fastapi
中年程序员一枚3 天前
python开发接口uvicorn方法启动FastAPI,postman调用接口
python·postman·fastapi
周杰伦_Jay4 天前
【FastAPI】核心特性、目录结构与生产级实践
架构·开源·fastapi