【实战Flask API项目指南】之五 RESTful API设计

实战Flask API项目指南之 RESTful API设计
本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧!
前言
当小菜踏入Flask后端开发的世界时,遵循RESTful API规范尤为重要。
RESTful API(Representational State Transfer)是一种设计规范,用于构建可扩展、灵活且易于维护的Web服务。它强调使用HTTP方法来操作资源,并将资源的状态以及操作结果表示为数据。接下来让我们更详细地了解RESTful API的核心概念和实际设计。
RESTful API具体的内容参考以下链接:
-
RESTful API
-
阮一峰 - RESTful API 设计指南
-
阮一峰 - RESTful API 最佳实践
注意:本文直接直接上代码,干货满满。
为什么使用RESTful API
RESTful 架构可以充分的利用 HTTP 协议的各种功能,是 HTTP 协议的最佳实践
RESTful API 是一种软件架构风格、设计风格,可以让软件更加清晰,更简洁,更有层次,可维护性更好
RESTful API 设计
请求设计

响应设计

实践
理论说完了,是很枯燥的。下面开始写代码。
这里参考该 阮一峰 - RESTful API 最佳实践 文章来设计一个包含 RESTful API的基本要素的图书管理系统后端API平台。
示例代码
看以下代码,这份代码体现了RESTful API设计的一些重要原则。
下面会对它进行解析。
from flask import (Flask, jsonify, request)app = Flask(__name__)# 示例数据,用于模拟书籍数据库
books = [{"id": 1, "title": "Book 1", "author": "Frica01"},{"id": 2, "title": "Book 2", "author": "Frica02"}
]# 获取所有书籍
@app.route("/books", methods=["GET"])
def get_all_books():return jsonify(books), 200# 获取特定书籍
@app.route("/books/<int:book_id>", methods=["GET"])
def get_book(book_id):book = next((book for book in books if book["id"] == book_id), None)if book:return jsonify(book), 200return jsonify({"error": "Book not found."}), 404# 创建新书籍
@app.route("/books", methods=["POST"])
def create_book():new_book = {"id": len(books) + 1, "title": request.json.get("title")}books.append(new_book)return jsonify(new_book), 201# 更新书籍信息
@app.route("/books/<int:book_id>", methods=["PUT"])
def update_book(book_id):book = next((book for book in books if book["id"] == book_id), None)if book:book["title"] = request.json.get("title")return jsonify(book), 200return jsonify({"error": "Book not found."}), 404# 删除书籍
@app.route("/books/<int:book_id>", methods=["DELETE"])
def delete_book(book_id):global booksbooks = [book for book in books if book["id"] != book_id]return "", 204if __name__ == "__main__":app.run(debug=True)
RESTful API的体现
1. URL
如上面文章所说,URL的设计是动词+宾语,如GET /books这个命令,GET是动词, books是宾语;
- 动词指的是HTTP方法,对应CRUD操作
上面的图书管理系统的API,使用如下的URL来表示书籍资源:
- 获取所有书籍:
GET /books - 获取特定书籍:
GET /books/{book_id} - 创建新书籍:
POST /books - 更新书籍信息:
PUT /books/{book_id} - 删除书籍:
DELETE /books/{book_id}
2. HTTP方法
RESTful API使用HTTP方法来操作资源,这与CRUD(Create、Read、Update、Delete)操作相对应。
- GET:用于获取资源的信息。
- POST:用于在服务器上创建新资源。
- PUT:用于更新现有资源,或创建/替换资源。
- DELETE:用于删除资源。
例如,获取特定书籍信息的请求通过HTTP GET方法发起:
GET /books/9527
3. 状态码
客户端的每一次请求,服务器都必须给出回应。回应包括 HTTP 状态码和数据两部分。
HTTP 状态码就是一个三位数,分成五个类别。
- 具体的还可以细分,看这里:阮一峰 - RESTful API最佳实践
| 状态码 | 含义 |
|---|---|
| 1xx | 相关信息 |
| 2xx | 操作成功 |
| 3xx | 重定向 |
| 4xx | 客户端错误 |
| 5xx | 服务器错误 |
这些是一些常见的 HTTP 状态码,服务器通常使用这些状态码来指示请求的处理结果,以便客户端能够根据状态码采取适当的操作。
通过合适的状态码,API可以更清晰地传达操作结果。
4. 服务器响应
RESTful API通常使用JSON(JavaScript Object Notation)作为数据格式,以便在不同应用之间进行数据交换。JSON是一种轻量级、易于读写的数据格式,适合在Web应用中传输数据。
API返回的数据格式,应该是一个 JSON 对象,因为这样才能返回标准的结构化数据。所以,服务器回应的 HTTP 头的 Content-Type 属性要设为application/json。
在 Flask中 jsonify 函数会自动将数据转换为 JSON 格式,并设置 Content-Type 头为 application/json。
GET /books/9527 HTTP/1.1
Accept: application/json
成功返回:
{"id": 9527,"title": "Sample Book","author": "John Doe"
}
失败返回:
{'error': 'Book not found.'
}
5. 汇总
这份代码已经包含了RESTful API的基本要素:
-
资源与URL:每个API端点对应一个资源,如
/books表示所有书籍资源,/books/<int:book_id>表示特定书籍资源。 -
HTTP方法:不同HTTP方法对应不同操作,如
GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。 -
数据格式:API使用JSON格式来表示数据,例如使用
jsonify来构建响应。 -
状态码:合适的HTTP状态码,如
200表示请求成功,201表示资源创建成功,404表示资源未找到,204表示无内容响应。
这些份代码遵循了RESTful API的设计原则,使API更易于理解、扩展和维护。
总结
本文详细介绍了RESTful API的设计原则,并通过一个 Flask 后端开发的图书管理系统示例,展示了如何在实际代码中应用这些原则。
文章从URL、HTTP方法、状态码和服务器响应四个角度,解析了示例代码中的RESTful API设计。
- 在URL设计中,每个API端点对应一个资源,使得URL的结构清晰、直观。
- HTTP方法则用于表示对资源的不同操作,如GET用于获取资源,POST用于创建资源等;
- 状态码用于表示请求的结果,如200表示请求成功,404表示请求的资源未找到等;
- 服务器响应通常包含了请求的结果,当请求成功时或失败时候,服务器会返回对应的 JSON 对象。
总的来说,遵循RESTful API设计原则,可以使API的使用更加直观、易于理解,同时也使得API的维护和扩展更加方便。
通过本文的学习,小菜已经学会构建出易于维护和使用的API,为他开发后端平台API 打下了扎实的基础。
相关文章:
【实战Flask API项目指南】之五 RESTful API设计
实战Flask API项目指南之 RESTful API设计 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 当小菜踏入Flask后端开发的世界时…...
尚硅谷大数据项目《在线教育之实时数仓》笔记005
视频地址:尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P031 P032 P033 P034 P035 P036 P037 P038 P039 P040 第9章 数仓开发之DWD层 P031 DWD层设计要点: (1)DWD层的设计依…...
算法通过村第十八关-回溯|青铜笔记|什么叫回溯(中篇)
文章目录 前言回溯的核心问题撤销操作解释总结 前言 提示:阳光好的时候,会感觉还可以活很久,甚至可以活出喜悦。 --余秀华 回溯是非常重要的算法思想之一,主要解决一些暴力枚举也搞不定的问题(这里埋个坑💣…...
generate by chatgpt:应用上线前的checkList(部分是我自己的回答)
prompt 1 想象你是一名高级测试工程师,在应用上线前你需要提供一份checklist,请写出来: 作为一名高级测试工程师,以下是我在应用上线前的检查清单: 功能性测试: 检查所有要素和功能是否正常工作。确保满足了所有用户故事/需求。…...
Redis实战 | 使用Redis 的有序集合(Sorted Set)实现排行榜功能,和Spring Boot集成
专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https:/…...
基于信号功率谱特征和GRNN广义回归神经网络的信号调制类型识别算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ................................................................ %调制识别 len1 func_f…...
matplotlib从起点出发(10)_Tutorial_10_Layout
使用受约束的绘图干净整洁地将图形合适排列。 受约束的布局会自动调整子图,以便刻度标签、图例和颜色条等装饰不会重叠,同时仍保留用户请求的逻辑布局。 受约束布局类似于“紧密布局”,但它要更灵活。它处理放置在多个轴上的Axes(放置颜色条…...
HTTP头部信息解释分析(详细整理)(转载)
这篇文章为大家介绍了HTTP头部信息,中英文对比分析,还是比较全面的,若大家在使用过程中遇到不了解的,可以适当参考下 HTTP 头部解释 1. Accept: 告诉WEB服务器自己接受什么介质类型,/ 表示任何类型&#…...
集线器、交换机、网桥、路由器、网关
目录 集线器(HUB)交换机(SWITCH)网桥(BRIDGE)路由器(ROUTER)网关(GATEWAY)交换机和路由器的区别参考 集线器(HUB) 功能 集线器对数据的传输起到同步、放大和整形的作用 属于物理层设备 工作机制 使用集线器互连而成的以太网被称为共享式以太网。当某个主机要给另一个主机发送单…...
项目实战:新增@Controller和@Service@Repository@Autowire四个注解
1、Controller package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited public interface Controller { }2、Service package com.csdn.mymvc.annotation; import java.lang.annotation.*…...
校验 ChatGPT 4.0 真实性的三个经典问题:快速区分 GPT3.5 与 GPT4,并提供免费测试网站
现在已经有很多 ChatGPT 的套壳网站,以下分享验明 GPT-4 真身的三个经典问题,帮助你快速区分套壳网站背后到底用的是 GPT-3.5 还是 GPT-4。 大家可以在这个网站测试:https://ai.hxkj.vip,免登录可以问三条,登录之后无限…...
Jetpack:030-Jetpack中的状态
文章目录 1. 概念介绍2. 使用方法2.1 可监听对象2.2 获取状态值2.3 修改状态值2.4 重组函数 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中网格布局相关的内容,本章回中主要 介绍状态。闲话休提,让我们一起Talk Android Jetpack吧࿰…...
AD教程 (七)元件的放置
AD教程 (七)元件的放置 第一种放置方法 点击右下角Panels,选择SCH Library,调出原理图库器件列表选中想要放置的元件,点击放置,就会自动跳转到原理图,然后放置即可这种方法需要不断打开元件库…...
ubuntu22.04为什么鼠标会自动丢失焦点
排查的步骤 在Ubuntu 22.04中,鼠标自动丢失焦点可能由多种原因引起,包括系统错误、驱动问题、软件冲突或者某些特定的系统设置。以下是一些可能的原因和相应的解决方法: 触控板干扰: 如果你使用的是笔记本电脑,触控板可…...
FastBond2阶段2——基于ESP32C3开发的简易IO调试设备
1. 项目介绍 之前买了许多国产单片机esp32c3一直在吃灰,没有发挥它的真实价值。非常感谢硬禾组织的Fastbond2活动,刚好两者经过微妙的碰撞。恰可以用于FastBond2活动主题4 - 测量仪器(单片机开发测试领域),或者用于国…...
03、SpringBoot + 微信支付 ---- 创建订单、保存二维码url、显示订单列表
目录 Native 下单1、创建课程订单保存到数据库1-1:需求:1-2:代码:1-3:测试结果: 2、保存支付二维码的url2-1:需求:2-2:代码:2-3:测试:…...
【echarts基础】在柱形图上设置文本
一、需求描述 在柱状图上设置文本标签,按需修改它的颜色、大小、边框、阴影等,如下。 二、代码展示 series:[{name:"螺蛳粉",type:"bar",data:data.data.chartData.chartData.num.螺蛳粉,label:{//图形上显示文本标签formatter:&q…...
小户型工业风,陌生上开花知书香。福州中宅装饰,福州装修
漫步陌上 只因陌上花开 花是自然的那种 朴素而恬淡,不落尘俗。—徐志摩 小户型工业风格 满足业主需求 筑造书香押韵家 从动线、色彩、选材、定制等各个环节 与业主一起畅谈家的构造 形成别“居”一格的温暖品质家 以书做墙 告别电视墙 这是一个实用性很强的…...
Gorm 中的迁移指南
探索使用 GORM 在 Go 中进行数据库迁移和模式更改的世界 在应用程序开发的不断变化的景观中,数据库模式更改是不可避免的。GORM,强大的 Go 对象关系映射库,通过迁移提供了一种无缝的解决方案来管理这些变化。本文将作为您全面的指南…...
基于.NET、Uni-App开发支持多平台的小程序商城系统 - CoreShop
前言 小程序商城系统是当前备受追捧的开发领域,它可以为用户提供一个更加便捷、流畅、直观的购物体验,无需下载和安装,随时随地轻松使用。今天给大家推荐一个基于.NET、Uni-App开发支持多平台的小程序商城系统(该商城系统完整开源…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
