当前位置: 首页 > article >正文

API设计与开发

7. API设计与开发

API(应用程序编程接口)是前后端通信的桥梁,良好的API设计能够提升应用的可用性、可维护性和扩展性。以下内容将深入探讨RESTful API原则、GraphQL的基本概念以及使用Postman进行API测试的方法。

7.1 理解RESTful API原则

REST(Representational State Transfer) 是一种架构风格,用于设计网络应用程序的API。RESTful API遵循一系列约束,使得API具备良好的可扩展性和易用性。

REST的六大约束

  1. 客户端-服务器架构(Client-Server)
    • 定义:客户端和服务器分离,客户端负责用户界面和用户体验,服务器负责数据存储和业务逻辑。
    • 优点:提升系统的可维护性和可扩展性,客户端和服务器可以独立开发和部署。
  2. 无状态(Stateless)
    • 定义:每个请求都包含了所有必要的信息,服务器不存储客户端的会话状态。
    • 优点:简化服务器设计,提高可扩展性,增强系统的可靠性。
  3. 可缓存性(Cacheable)
    • 定义:响应数据应该被标记为可缓存或不可缓存,允许客户端或中间层缓存响应以减少服务器负载。
    • 优点:提升性能,减少延迟,提高用户体验。
  4. 统一接口(Uniform Interface)
    • 定义:通过统一的接口简化和解耦客户端与服务器。包括资源的标识、资源的表现形式、资源的自描述消息和超媒体作为应用状态的引擎(HATEOAS)。
    • 优点:简化架构,提高系统的可理解性和可互操作性。
  5. 分层系统(Layered System)
    • 定义:系统可以由多个层组成,每一层只与相邻层交互,客户端无法感知到系统的具体层次结构。
    • 优点:提升系统的可扩展性和安全性,允许中间层实现负载均衡、缓存等功能。
  6. 按需代码(Code on Demand)(可选)
    • 定义:服务器可以通过传输可执行代码(如JavaScript)来扩展客户端的功能。
    • 优点:提高系统的灵活性,但由于安全性和复杂性较高,通常不推荐广泛使用。

RESTful API的核心概念

  1. 资源(Resources)
    • 定义:API中的每一个实体都是一个资源,资源通过URI(统一资源标识符)进行标识。
    • 示例/users 表示用户资源,/products 表示产品资源。
  2. HTTP方法(HTTP Methods)
    • GET:获取资源
    • POST:创建资源
    • PUT:更新资源
    • PATCH:部分更新资源
    • DELETE:删除资源
  3. 状态码(Status Codes)
    • 2xx:成功(如200 OK, 201 Created)
    • 4xx:客户端错误(如400 Bad Request, 404 Not Found)
    • 5xx:服务器错误(如500 Internal Server Error)
  4. 表示(Representations)
    • 定义:资源的具体表现形式,常见格式包括JSON、XML。
    • 示例:客户端请求 /users/1,服务器返回用户1的JSON表示。

RESTful API设计示例

假设我们要设计一个简单的用户管理API,使用FastAPI框架实现。

# app/main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Dict

app = FastAPI()

# 模拟数据库
fake_db: Dict[int, Dict[str, str]] = {}

class User(BaseModel):
    id: int
    name: str
    email: str

@app.get("/users/{user_id}", response_model=User)
def get_user(user_id: int):
    if user_id in fake_db:
        return fake_db[user_id]
    raise HTTPException(status_code=404, detail="User not found")

@app.post("/users/", response_model=User, status_code=201)
def create_user(user: User):
    if user.id in fake_db:
        raise HTTPException(status_code=400, detail="User already exists")
    fake_db[user.id] = user.dict()
    return user

@app.put("/users/{user_id}", response_model=User)
def update_user(user_id: int, user: User):
    if user_id not in fake_db:
        raise HTTPException(status_code=404, detail="User not found")
    fake_db[user_id] = user.dict()
    return user

@app.delete("/users/{user_id}", status_code=204)
def delete_user(user_id: int):
    if user_id in fake_db:
        del fake_db[user_id]
        return
    raise HTTPException(status_code=404, detail="User not found")

运行API

使用Uvicorn运行FastAPI应用:

uvicorn app.main:app --reload

API文档

FastAPI自动生成的Swagger UI和ReDoc可以访问以下地址查看和测试API:

  • Swagger UI:http://127.0.0.1:8000/docs
  • ReDoc:http://127.0.0.1:8000/redoc

7.2 熟悉GraphQL(可选)

GraphQL 是由Facebook开发的一种用于API的查询语言,与REST相比,它提供了更灵活和高效的数据获取方式。

GraphQL的核心概念

  1. 查询(Queries)
    • 定义:客户端定义所需的数据结构,服务器根据查询返回精确的数据。
    • 优点:减少数据过载和欠载,客户端可按需获取数据。
  2. 变更(Mutations)
    • 定义:用于修改服务器端数据的操作,如创建、更新、删除。
  3. 订阅(Subscriptions)
    • 定义:用于实时获取数据更新,类似于WebSocket。
  4. 类型系统(Type System)
    • 定义:GraphQL使用强类型系统定义API的数据结构,确保客户端和服务器之间的数据契约。

GraphQL与REST的对比

特性RESTGraphQL
数据获取方式多个端点,每个端点返回固定数据单一端点,根据查询返回所需数据
数据灵活性客户端获取固定结构的数据,可能过载或欠载客户端定义数据结构,按需获取数据
请求数量可能需要多个请求来获取关联数据单个请求即可获取所有相关数据
学习曲线相对简单,基于HTTP标准需要理解查询语言和类型系统

GraphQL在Python中的实现

使用Graphene库,可以在Python中快速构建GraphQL API。

安装Graphene

pip install graphene
pip install graphene-fastapi

示例代码

# app/graphql_api.py
import graphene
from fastapi import FastAPI
from graphene import ObjectType, String, Int, Field, List

# 模拟数据库
fake_db = {
    1: {"id": 1, "name": "Alice", "email": "alice@example.com"},
    2: {"id": 2, "name": "Bob", "email": "bob@example.com"},
}

class User(graphene.ObjectType):
    id = Int()
    name = String()
    email = String()

class Query(ObjectType):
    users = List(User)
    user = Field(User, user_id=Int(required=True))

    def resolve_users(root, info):
        return [User(**user) for user in fake_db.values()]

    def resolve_user(root, info, user_id):
        user = fake_db.get(user_id)
        if user:
            return User(**user)
        return None

schema = graphene.Schema(query=Query)

app = FastAPI()

from starlette.graphql import GraphQLApp

app.add_route("/graphql", GraphQLApp(schema=schema))

运行API

uvicorn app.graphql_api:app --reload

访问GraphQL Playground

访问 http://127.0.0.1:8000/graphql 使用GraphQL Playground进行查询和测试。

GraphQL查询示例

获取所有用户

query {
  users {
    id
    name
    email
  }
}

获取特定用户

query {
  user(userId: 1) {
    id
    name
    email
  }
}

注意:GraphQL适用于需要灵活查询和高效数据获取的场景,但其复杂性较高,建议在理解其优势和适用场景后再选择是否使用。

7.3 使用工具如Postman进行API测试

Postman 是一款流行的API开发和测试工具,提供了直观的界面和强大的功能,适用于开发、测试和调试API。

Postman的主要功能

  1. 发送HTTP请求
    • 支持各种HTTP方法(GET, POST, PUT, DELETE, etc.)
    • 配置请求头、参数和主体
  2. 环境与变量管理
    • 定义环境变量,简化不同环境下的测试配置
    • 使用变量在请求中动态替换值
  3. 集合与文档
    • 创建请求集合,组织和共享API测试用例
    • 自动生成API文档,便于团队协作
  4. 测试脚本
    • 使用JavaScript编写自动化测试脚本
    • 验证响应数据、状态码和其他条件
  5. 监控与自动化
    • 定时运行API测试,监控API性能和可用性
    • 集成CI/CD流程,实现持续测试

使用Postman测试RESTful API

以下以之前的FastAPI用户管理API为例,展示如何使用Postman进行测试。

1. 安装Postman

访问 Postman官网 下载并安装适合您操作系统的版本。

2. 创建请求

a. 创建用户(POST请求)

  • 方法:POST

  • URLhttp://127.0.0.1:8000/users/

  • Headers

    • Content-Type: application/json
  • Body(选择raw,格式为JSON):

    {
      "id": 1,
      "name": "Alice",
      "email": "alice@example.com"
    }
    
  • 发送请求

    • 点击Send按钮。

    • 预期响应(状态码201):

      {
        "id": 1,
        "name": "Alice",
        "email": "alice@example.com"
      }
      

b. 获取用户(GET请求)

  • 方法:GET

  • URLhttp://127.0.0.1:8000/users/1

  • 发送请求:

    • 点击Send按钮。

    • 预期响应(状态码200):

      {
        "id": 1,
        "name": "Alice",
        "email": "alice@example.com"
      }
      

c. 更新用户(PUT请求)

  • 方法:PUT

  • URLhttp://127.0.0.1:8000/users/1

  • Headers

    • Content-Type: application/json
  • Body

    {
      "id": 1,
      "name": "Alice Smith",
      "email": "alice.smith@example.com"
    }
    
  • 发送请求

    • 点击Send按钮。

    • 预期响应(状态码200):

      {
        "id": 1,
        "name": "Alice Smith",
        "email": "alice.smith@example.com"
      }
      

d. 删除用户(DELETE请求)

  • 方法:DELETE
  • URLhttp://127.0.0.1:8000/users/1
  • 发送请求:
    • 点击Send按钮。
    • 预期响应(状态码204,无内容)
3. 创建请求集合

为了组织和复用API测试用例,建议将相关请求创建为一个集合。

  • 步骤:
    1. 在Postman左侧栏,点击Collections
    2. 点击New Collection,命名为User Management API
    3. 将上述创建的各个请求添加到该集合中。
4. 使用环境变量

在不同环境(开发、测试、生产)下,API的基URL可能不同。通过环境变量,可以简化配置和切换。

  • 步骤:

    1. 点击Postman右上角的Manage Environments

    2. 点击Add,创建一个新的环境,例如Local

    3. 添加变量:

      • base_url: http://127.0.0.1:8000
    4. 在请求URL中使用变量:

      {{base_url}}/users/
      
    5. 选择对应的环境,Postman会自动替换变量。

5. 编写测试脚本

Postman允许在请求发送前后编写脚本,进行自动化测试和验证。

  • 示例:验证创建用户响应

    在创建用户的请求中,切换到Tests标签,添加以下脚本:

    pm.test("Status code is 201", function () {
        pm.response.to.have.status(201);
    });
    
    pm.test("Response has id, name, and email", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData).to.have.property("id");
        pm.expect(jsonData).to.have.property("name");
        pm.expect(jsonData).to.have.property("email");
    });
    

    解释

    • 第一个测试:检查响应状态码是否为201。
    • 第二个测试:检查响应体中是否包含idnameemail字段。
  • 运行测试

    • 发送请求后,切换到Tests标签,查看测试结果。
6. 运行集合测试

Postman支持批量运行请求集合,适用于回归测试和持续集成。

  • 步骤:
    1. 在左侧栏,右键点击User Management API集合,选择Run Collection
    2. 在弹出的窗口中,选择环境(如Local),配置并点击Run
    3. 查看运行结果,确保所有测试用例通过。
7. 使用Postman进行GraphQL测试(可选)

如果您的项目使用GraphQL,可以使用Postman发送GraphQL查询和变更。

  • 步骤:

    1. 创建一个新的请求,方法选择POST,URL为GraphQL端点(如http://127.0.0.1:8000/graphql)。

    2. Headers中添加Content-Type: application/json

    3. Body中选择raw,格式为JSON,输入GraphQL查询:

      {
        "query": "query { users { id name email } }"
      }
      
    4. 点击Send,查看响应数据。

注意:虽然Postman支持GraphQL测试,但专门的GraphQL工具(如GraphQL Playground、Insomnia)可能提供更丰富的功能和更友好的界面。

总结

作为入门级Python后端开发工程师,掌握API设计与开发的基本原则和工具至关重要。通过理解RESTful API原则、熟悉GraphQL的基本概念(可选)以及使用Postman进行API测试,您可以有效地设计、开发和验证高质量的API,为前后端协作和应用的稳定性提供坚实基础。

关键点回顾

  1. 理解RESTful API原则
    • 遵循REST的六大约束,设计清晰、可维护的API。
    • 了解资源、HTTP方法、状态码和表示的概念。
  2. 熟悉GraphQL(可选)
    • 理解GraphQL的查询、变更和订阅机制。
    • 掌握GraphQL与REST的区别和适用场景。
  3. 使用工具如Postman进行API测试
    • 学会创建和管理请求,使用环境变量简化测试配置。
    • 编写测试脚本,自动化验证API响应。
    • 组织请求集合,进行批量测试和持续集成。

http://www.kler.cn/a/409817.html

相关文章:

  • 游戏引擎学习第22天
  • C++:用红黑树封装map与set-2
  • .NET Core发布网站报错 HTTP Error 500.31
  • 网络安全概论
  • Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
  • 【计算机网络】网段划分
  • MATLAB R2024b软件下载安装步骤
  • A047-基于Spring Boot的医疗挂号管理系统的设计与实现
  • java编程开发基础,正则表达式的使用案例Demo
  • 基于微信小程序的小动物救助领养平台
  • 页的初步认识
  • H3C OSPF 多区域实验
  • 【数据结构与算法】相交链表、环形链表(判断是否有环)、环形链表(返回入环节点)
  • Rust环境安装乱码解决
  • cookie属性SameSite简介
  • java多线程 1
  • 第02章_MySQL环境搭建(基础)
  • Elasticsearch:Retrievers 介绍
  • 【Android】静态广播接收不到问题分析思路
  • 谷粒商城篇章12--P326-P339--Sentinel/Sleuth+Zipkin服务链路追踪【分布式高级篇九】
  • C++网络编程之多播
  • Js-函数-03
  • 【redis 】string类型详解
  • 工程化RAG-无法评估,就无法改进
  • 宝可梦GO如何超越李飞飞的空间智能?150万亿参数解锁现实边界 | LeetTalk Daily...
  • 新版布谷直播软件源码开发搭建功能更新明细