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. 总结对比

特性RESTWeb ServiceFastAPI
性质架构风格技术集合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并接收结果)

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并计算平均值)

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:
      pip install fastapi uvicorn pandas
      
    • 启动服务器B:
      uvicorn server_b:app --host 0.0.0.0 --port 8000
      
  2. 运行服务器A

    • 确保安装了requests库:
      pip install requests pandas
      
    • 替换<SERVER_B_IP>为服务器B的IP地址。
    • 运行服务器A脚本。

测试结果

服务器A发送DataFrame至服务器B,服务器B计算各列的平均值后返回结果。
服务器A会打印类似的返回值:

Received averages from server B: {'Column1': 2.0, 'Column2': 5.0, 'Column3': 8.0}
  • Swagger-UI: request-body
{
    "data": "{\"columns\":[\"Column1\",\"Column2\",\"Column3\"],\"index\":[0,1,2],\"data\":[[1,4,7],[2,5,8],[3,6,9]]}"
}

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuokLiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值