《Python实战进阶》专栏 No 5:GraphQL vs RESTful API 对比与实现

news2025/2/28 14:10:42
《Python实战进阶》专栏包括68集,每一集聚焦一个中高级技术知识点,涵盖Python在Web开发、数据处理、自动化、机器学习、并发编程等领域的应用,系统梳理Python开发者的知识集。本集的主题为: No4 : GraphQL vs RESTful API 对比与实现 ,第六集的主题为No6 : OAuth2.0 认证与授权的实现 。

第五集:GraphQL vs RESTful API 对比与实现


目录
  1. 引言
  2. RESTful API 简介与优缺点
  3. GraphQL 简介与优缺点
  4. GraphQL 与 RESTful API 的对比
  5. 实战:构建一个简单的 RESTful API 和 GraphQL API
    • RESTful API 实现
    • GraphQL API 实现
  6. 总结

1. 引言

在现代 Web 开发中,API 是前后端通信的核心。RESTful API 和 GraphQL 是两种主流的 API 设计方式,它们各有优劣,适用于不同的场景。本节将深入探讨两者的区别,并通过实战代码展示如何实现这两种 API。


2. RESTful API 简介与优缺点

RESTful API 是一种基于 HTTP 协议的架构风格,它通过 URL 定义资源,并使用 HTTP 方法(如 GET、POST、PUT、DELETE)对资源进行操作。

在这里插入图片描述

优点
  • 简单直观:URL 明确表示资源,HTTP 方法清晰定义操作。
  • 广泛支持:几乎所有编程语言和框架都支持 RESTful 风格。
  • 缓存友好:HTTP 缓存机制可以直接应用于 RESTful API。
缺点
  • 过度获取或不足获取数据:客户端无法灵活控制返回的数据结构,可能导致冗余或缺失。
  • 版本管理复杂:随着需求变化,可能需要维护多个版本的 API。

3. GraphQL 简介与优缺点

GraphQL 是 Facebook 开发的一种查询语言,允许客户端精确指定所需的数据结构,从而避免了 RESTful API 的过度获取问题。
在这里插入图片描述

优点
  • 灵活性:客户端可以自定义查询,只获取需要的数据。
  • 单一入口:所有请求通过一个端点完成,简化了 API 设计。
  • 强类型系统:GraphQL 提供了类型定义,便于开发和调试。
缺点
  • 学习曲线较高:相比 RESTful API,GraphQL 的概念和实现更复杂。
  • 性能问题:复杂的嵌套查询可能导致性能瓶颈。
  • 工具生态相对较少:虽然 GraphQL 工具链日益完善,但仍不及 RESTful API 成熟。

4. GraphQL 与 RESTful API 的对比

特性RESTful APIGraphQL
数据获取固定结构,可能冗余或不足灵活查询,按需获取
请求方式多个端点,每个端点对应一个资源单一端点,统一处理所有请求
缓存支持原生支持 HTTP 缓存需要额外实现缓存机制
学习难度简单直观概念较复杂,需要学习查询语言
性能优化较容易优化需要防止 N+1 查询等问题

5. 实战:构建一个简单的 RESTful API 和 GraphQL API

我们将以一个简单的任务管理系统为例,展示如何实现 RESTful API 和 GraphQL API。

环境准备
  • Python 3.8+
  • Flask(用于 RESTful API)
  • Graphene(用于 GraphQL API)

安装依赖:

pip install flask graphene flask-graphql requests
数据模型

假设我们有一个任务列表,每项任务包含以下字段:

  • id: 任务 ID
  • title: 任务标题
  • description: 任务描述
  • done: 是否完成
RESTful API 实现

创建文件 rest_api.py

from flask import Flask, jsonify, request

app = Flask(__name__)

# 模拟的任务数据
tasks = [
    {"id": 1, "title": "Learn Python", "description": "Study Python basics", "done": False},
    {"id": 2, "title": "Write Code", "description": "Practice coding daily", "done": True},
]

@app.route('/tasks', methods=['GET'])
def get_tasks():
    return jsonify(tasks)

@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = next((task for task in tasks if task["id"] == task_id), None)
    if task:
        return jsonify(task)
    return jsonify({"error": "Task not found"}), 404

@app.route('/tasks', methods=['POST'])
def create_task():
    new_task = request.json
    new_task["id"] = len(tasks) + 1
    tasks.append(new_task)
    return jsonify(new_task), 201

if __name__ == '__main__':
    app.run(debug=True)

运行 RESTful API:

python rest_api.py

测试1:

curl http://127.0.0.1:5000/tasks  
#或者在浏览器输入:
http://127.0.0.1:5000/tasks  

程序输出:

[
  {
    "description": "Study Python basics",
    "done": false,
    "id": 1,
    "title": "Learn Python"
  },
  {
    "description": "Practice coding daily",
    "done": true,
    "id": 2,
    "title": "Write Code"
  }
]

测试2:

curl http://127.0.0.1:5000/tasks/1  
#或者在浏览器输入:
http://127.0.0.1:5000/tasks/1 

程序输出:

{
  "description": "Study Python basics",
  "done": false,
  "id": 1,
  "title": "Learn Python"
}

测试3:

curl -X POST http://127.0.0.1:5000/tasks -H "Content-Type: application/json" -d "{\"title\":\"New Task\", \"description\": \"This is a new task\", \"done\": false}"

程序输出:

{
  "description": "This is a new task",
  "done": false,
  "id": 4,
  "title": "New Task"
}
GraphQL API 实现

创建文件 graphql_api.py

from flask import Flask
from flask_graphql import GraphQLView
from graphene import ObjectType, String, Boolean, List, Schema, Field, Int, Mutation

app = Flask(__name__)

# 定义任务类型
class Task(ObjectType):
    id = Int()
    title = String()
    description = String()
    done = Boolean()

# 模拟的任务数据
tasks = [
    Task(id=1, title="Learn Python", description="Study Python basics", done=False),
    Task(id=2, title="Write Code", description="Practice coding daily", done=True),
]

# 查询根类型
class Query(ObjectType):
    tasks = List(Task)
    task = Field(Task, id=Int())

    def resolve_tasks(self, info):
        return tasks

    def resolve_task(self, info, id):
        return next((task for task in tasks if task.id == id), None)

# 变更根类型
class CreateTask(Mutation):
    class Arguments:
        title = String()
        description = String()
        done = Boolean()

    task = Field(Task)

    def mutate(self, info, title, description, done):
        new_task = Task(id=len(tasks) + 1, title=title, description=description, done=done)
        tasks.append(new_task)
        return CreateTask(task=new_task)

class Mutation(ObjectType):
    create_task = CreateTask.Field()

schema = Schema(query=Query, mutation=Mutation)

# 添加 GraphQL 视图
app.add_url_rule(
    '/graphql',
    view_func=GraphQLView.as_view('graphql', schema=schema, graphiql=True)
)

if __name__ == '__main__':
    app.run(debug=True)

运行 GraphQL API:

python graphql_api.py

访问 http://127.0.0.1:5000/graphql,使用 GraphiQL 测试查询和变更。

示例查询:

{
  tasks {
    id
    title
    done
  }
}

示例变更:

mutation {
  createTask(title: "New Task", description: "Description", done: false) {
    task {
      id
      title
    }
  }
}

6. 总结

通过本节的学习,我们了解了 RESTful API 和 GraphQL 的核心概念及优缺点,并通过实战代码实现了两种 API。选择哪种技术取决于具体需求:如果需要简单易用的 API,RESTful 是不错的选择;如果需要灵活的数据查询能力,GraphQL 更加适合。

在下一集《OAuth2.0 认证与授权的实现》中,我们将探讨如何为 API 添加安全保护机制,敬请期待!


图示
  • 图1:RESTful API 请求流程图
  • 图2:GraphQL 查询流程图

希望本节内容对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MYSQL 5.7数据库,关于1067报错 invalid default value for,解决方法!

???作者&#xff1a; 米罗学长 ???个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 ???各类成品java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot&#xff0c;mysql等项目&#xff0c;源码丰富&#xff0c;欢迎咨询。 ???…

【Linux基础】Linux下的C编程指南

目录 一、前言 二、Vim的使用 2.1 普通模式 2.2 插入模式 2.3 命令行模式 2.4 可视模式 三、GCC编译器 3.1 预处理阶段 3.2 编译阶段 3.3 汇编阶段 3.4 链接阶段 3.5 静态库和动态库 四、Gdb调试器 五、总结 一、前言 在Linux环境下使用C语言进行编程是一项基础且…

浅谈HTTP及HTTPS协议

1.什么是HTTP&#xff1f; HTTP全称是超文本传输协议&#xff0c;是一种基于TCP协议的应用非常广泛的应用层协议。 1.1常见应用场景 一.浏览器与服务器之间的交互。 二.手机和服务器之间通信。 三。多个服务器之间的通信。 2.HTTP请求详解 2.1请求报文格式 我们首先看一下…

Pytest自定义测试用例执行顺序

文章目录 1.前言2.pytest默认执行顺序3.pytest自定义执行顺序 1.前言 在pytest中&#xff0c;我们可能需要自定义测试用例的执行顺序&#xff0c;例如登陆前需要先注册&#xff0c;这个时候就需要先执行注册的测试用例再执行登录的测试用例。 本文主要讲解pytest的默认执行顺序…

人大金仓KCA | 用户与角色

人大金仓KCA | 用户与角色 一、知识预备1. 用户和角色 二、具体实施1. 用户管理-命令行1.1 创建和修改用户1.2 修改用户密码1.3 修改用户的并发连接数1.4 修改用户的密码有效期 2.用户管理-EasyKStudio2.1 创建和修改用户2.2 修改用户密码2.3 修改用户的并发连接数2.4 修改用户…

【Azure 架构师学习笔记】- Azure Databricks (12) -- Medallion Architecture简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (11) – UC搭建 前言 使用ADB 或者数据湖&#xff0c;基本上绕不开一个架构“Medallion”&#xff0c; 它使得数据管理更为简单有效。ADB 通过…

智能证件照处理器(深度学习)

功能说明:支持常见证件照尺寸(一寸、二寸、护照等) 智能背景去除(使用深度学习模型)自定义背景颜色选择自动调整尺寸并保持比例实时预览处理效果注意:整合rembg进行抠图,使用Pillow处理图像缩放和背景替换,定义常见证件照尺寸,并提供用户交互选项。首次运行时会自动下…

C++-第十三章:红黑树

目录 第一节&#xff1a;红黑树的特征 第二节&#xff1a;实现思路 2-1.插入 2-1-1.unc为红 2-1-2.cur为par的左子树&#xff0c;且par为gra的左子树(cur在最左边) 2-1-2-1.unc不存在 2-1-2-2.unc为黑 2-1-3.cur为par的右子树&#xff0c;且par为gra的右子树(cur在最右侧) 2-…

推荐3个背景渐变色的wordpress主题

干净、清爽、背景渐变色的wordpress企业主题 ​ 服务类公司wordpress企业主题https://www.jianzhanpress.com/?p8255 红色大气的wordpress企业主题&#xff0c;适合服务行业的公司搭建企业官方网站使用。 ​ wordpress询盘型独立站主题https://www.jianzhanpress.com/?p8258…

Scrapy:隧道代理中移除 Proxy-Authorization 的原理解析

隧道代理中移除 Proxy-Authorization 的原理解析 背景 在 Scrapy 的 HTTP 下载处理中&#xff0c;当使用隧道代理&#xff08;TunnelingAgent&#xff09;时&#xff0c;会移除请求头中的 Proxy-Authorization。这个操作看似简单&#xff0c;但背后有着重要的安全考虑和技术原…

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…

Fiddler 的安装与使用

目录 1、Fiddler 的安装2、Fiddler 的使用 1、Fiddler 的安装 通过Fiddler 官网进行下载&#xff08;下载免费的经典版本&#xff09;&#xff0c;填写用途、邮箱、国家信息即可开始下载。 Fiddler 官网下载链接 双击安装包即可进行安装&#xff0c;显示以下界面说明安装成功。…

Hadoop架构详解

Hadoop 是一个开源的分布式计算系统&#xff0c;用于存储和处理大规模数据集。Hadoop 主要由HDFS&#xff08;Hadoop Distributed File System&#xff09;、MapReduce、Yarn&#xff08;Jobtracker&#xff0c;TaskTracker&#xff09;三大核心组件组成。其中HDFS是分布式文件…

清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)

文章目录 前言一、清华大学DeepSeek使用手册下载二、清华大学DeepSeek使用手册思维导图 前言 这是一篇关于清华大学deepseek使用手册pdf的介绍性文章&#xff0c;主要介绍了DeepSeek的定义、功能、使用方法以及如何通过提示语设计优化AI性能。以下是对这些核心内容的简要概述&…

Hadoop第2课(伪分布式集群的搭建)

jdk和hadoop安装包&#xff1a; hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下&#xff08;hadoop用户的主目录&#xff09; 2、解压jdk安装包到~目录 卸载jdk的命令&#xff1a;r…

使用Crawlee可破题js渲染采集数据

使用 Crawlee 实现自动化爬虫流程 1. Crawlee 简介 Crawlee 是一个强大的爬虫框架&#xff0c;用于快速构建和维护可靠的爬虫。它支持多种爬虫类型&#xff0c;包括基于 Cheerio 和 Playwright 的爬虫&#xff0c;能够高效处理静态和动态网页。 2. 项目目标 通过自动化脚本实…

Fiddler在Windows下抓包Https

文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量&#xff08;可选&#xff09;解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下&#xff0c;Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密&#xff1a; 1…

Java语法基础知识点1

目录 一、数组 1.1数组的初始化&#xff1a; 1.2数组的遍历方法&#xff1a; 1.3数组的常见使用方法&#xff1a; 二、类和对象 2.1构造方法&#xff1a; 2.2this关键字: 三、封装 3.1访问限定符&#xff1a; 3.2static关键字&#xff1a; 3.3代码块&#xff1a; 一…

【新手入门】SQL注入之盲注

一、引言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办? 例如应用程序返回到一个"通用的"的页面&#xff0c;或者重定向一个通用页面(可能为网站首页)。这时&#xff0c;我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无…

python-leetcode-分割等和子集

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; class Solution:def canPartition(self, nums: List[int]) -> bool:total sum(nums)if total % 2 ! 0:return Falsetarget total // 2dp [False] * (target 1)dp[0] Truefor num in nums:for j in range(tar…