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]]}"
}
相关推荐
强化试剂瓶2 分钟前
Silane-PEG8-DBCO,硅烷-聚乙二醇8-二苯并环辛炔技术应用全解析
python·flask·numpy·pyqt·fastapi
曲幽2 小时前
FastAPI日志实战:从踩坑到优雅配置,让你的应用会“说话”
python·logging·fastapi·web·error·log·info
布局呆星12 小时前
FastAPI:高性能Python Web框架
fastapi
曲幽1 天前
FastAPI异步多线程:从踩坑到精通,解锁高性能API的正确姿势
python·flask·fastapi·web·thread·async·httpx·asyncio
玄同7652 天前
深入理解 SQLAlchemy 的 relationship:让 ORM 关联像 Python 对象一样简单
人工智能·python·sql·conda·fastapi·pip·sqlalchemy
翱翔的苍鹰2 天前
完整的“RNN + jieba 中文情感分析”项目之一:添加 API 接口(FastAPI) 和 支持 批量分析
人工智能·rnn·fastapi
曲幽2 天前
FastAPI异常处理全解析:别让你的API在用户面前“裸奔”
python·websocket·api·fastapi·web·exception·error·httexception
Loo国昌3 天前
深入理解 FastAPI:Python高性能API框架的完整指南
开发语言·人工智能·后端·python·langchain·fastapi
摸鱼仙人~3 天前
从 Gunicorn 到 FastAPI:Python Web 生产环境架构演进与实战指南
python·fastapi·gunicorn
这儿有一堆花3 天前
实战:FastAPI与WebSocket的高并发足球数据API开发指南
websocket·网络协议·fastapi