【实战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

Flaskjsonify 函数会自动将数据转换为 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的基本要素:

  1. 资源与URL:每个API端点对应一个资源,如 /books 表示所有书籍资源,/books/<int:book_id> 表示特定书籍资源。

  2. HTTP方法:不同HTTP方法对应不同操作,如 GET 用于获取资源,POST 用于创建资源,PUT 用于更新资源,DELETE 用于删除资源。

  3. 数据格式:API使用JSON格式来表示数据,例如使用 jsonify 来构建响应。

  4. 状态码:合适的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 打下了扎实的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(免费领源码)java#ssm#mysql宠物网站系统07183-计算机毕业设计项目选题推荐

摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。宠物网站每天都有大量的信息需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于B/S&#xff08;浏览器/服务器&#xff09;模式的宠物网站系统。 该系统以JJava编程语言、MySQL和SSM框…

【软考中级】软件设计师-下午题

下午题 试题一 黑洞&#xff1a;加工有输入无输出 白洞(奇迹)&#xff1a;加工有输出无输入 灰洞&#xff1a;数据流输入的加工不足以产生输出 结构化语言&#xff1a; IF *** THEN ELSE IF *** THEN ******* END IF END IF 数据流的父子图平衡&#xff0c;如果父子图平衡就不…

一文深入了解 CPU 的型号、代际架构与微架构

在 10 月 16 号的时候&#xff0c;Intel 正式发布了第 14 代的酷睿处理器。但还有很多同学看不懂这种发布会上发布的各种 CPU 参数。借着这个时机&#xff0c;给大家深入地讲讲 CPU 的型号规则、代际架构与微架构方面的知识。 CPU 在整个计算机硬件中、技术体系中都算是最最重…

Scala和Play WS库编写的爬虫程序

使用Scala和Play WS库编写的爬虫程序&#xff0c;该程序将爬取网页内容&#xff1a; import play.api.libs.ws._ import scala.concurrent.ExecutionContext.Implicits.global ​ object BaiduCrawler {def main(args: Array[String]): Unit {val url ""val proxy…

ChinaSoft 论坛巡礼 | 安全攸关软件的智能化开发方法论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

全功能测试框架 - Carina

Carina是一个基于Java的测试自动化框架&#xff0c;它将所有测试层结合在一起&#xff1a;移动应用程序&#xff08;web、本机、混合&#xff09;、web应用程序、REST服务和数据库。 github&#xff1a;GitHub - zebrunner/carina: Carina automation framework (TestNG): Web…

OpenGL_Learn05(纹理)

1. 纹理贴图 wall.jpg (512512) (learnopengl-cn.github.io) 纹理过滤分为&#xff1a;邻近和线性&#xff0c;这跟opencv图像处理一样。 多级渐远纹理 四种采样方式&#xff1a; 代码实现&#xff1a; std_image.h https://github.com/nothings/stb/blob/master/stb_image.…

体验SOLIDWORKS旋转反侧切除增强 硕迪科技

大家在设计中经常使用的旋转切除命令在solidworks2024版本中迎来了新的增强&#xff0c;添加了旋转反侧切除选项。在设计过程中不必修改复杂的草图即可切除掉我们不需要的部分。使设计工作更加方便快捷。 打开零部件后&#xff0c;点击键盘上的S键并输入旋转切除以搜索该命令&a…

uni-app---- 点击按钮拨打电话功能点击按钮调用高德地图进行导航的功能【安卓app端】

uniapp---- 点击按钮拨打电话功能&&点击按钮调用高德地图进行导航的功能【安卓app端】 先上效果图&#xff1a; 1. 在封装方法的文件夹下新建一个js文件&#xff0c;然后把这些功能进行封装 // 点击按钮拨打电话 export function getActionSheet(phone) {uni.showAct…

Python最强自动化神器Playwright!再也不用为爬虫逆向担忧了!

版权说明:本文禁止抄袭、转载,侵权必究! 目录 一、简介+使用场景二、环境部署(准备)三、代码生成器(优势)四、元素定位器(核心)五、追踪查看器(辅助)六、权限控制与认证(高级)七、其他重要功能(进阶)八、作者Info一、简介+使用场景 Playwright是什么?来自Chat…

intellij idea拉取最新的依赖包

intellij idea setting 拉取最新的依赖包 File --> Settings --> Build, Execution, Deployment --> Build Tools --> Maven --> 勾选 Always update snapshots. 一般情况下&#xff0c;设置完就可以拉取到最新的依赖包了。 如下&#xff1a; 安装最新的依赖…

浅析运维平台在实现光伏发电数据监控的应用

安科瑞 崔丽洁 摘要&#xff1a;全球化经济社会的快速发展&#xff0c;加快了传统能源的消耗&#xff0c;导致能源日益短缺&#xff0c;与此同时还带来了严重的环境污染。因此&#xff0c;利用没有环境污染的太阳能进行光伏发电获得了社会的普遍关注。本文根据传统式光伏电站行…

Java随机获取某个范围内的随机整数

随机获取某个范围内的随机整数 一、代码 /*** 随机获取某个范围内的随机整数的值* param min 最小值* param max 最大值* return*/public static int randomNum(int min,int max) {// 创建一个Random对象Random random new Random();// 生成指定范围内的随机整数int randomI…

day02_第一个Java程序

在开发第一个Java程序之前&#xff0c;我们必须对计算机的一些基础知识进行了解。 常用DOS命令 Java语言的初学者&#xff0c;学习一些DOS命令&#xff0c;会非常有帮助。DOS是一个早期的操作系统&#xff0c;现在已经被Windows系统取代&#xff0c;对于我们开发人员&#xf…

zabbix6.4监控centos

1、关闭防火墙 setenforce 0 #关闭SELinux sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config #设置永久关闭SELinux systemctl stop firewalld.service #关闭防火墙 systemctl disable firewalld.service …

OPCUA 行业配套标准:机器人

OPC UA 定义了对象&#xff0c;对象类型&#xff0c;结构化组织能力和定义对象之间关系的能力&#xff0c;利用这些基础和衍生类型及对象&#xff0c;用户还可以搭建出更复杂的类型&#xff0c;关系和对象。 如果不同的厂商或者用户定义的信息模型不同&#xff0c;将会影响系统…

【蓝桥杯省赛真题41】Scratch电脑开关机 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch电脑开关机 一、题目要求 编程实现 二、案例分析 1、角色分析

CMU/MIT/清华/Umass提出生成式机器人智能体RoboGen

文章目录 导读1. Introduction2. 论文地址3. 项目主页4. 开源地址5. RoboGen Pipeline6. Experimental Results作者介绍Reference 导读 CMU/MIT/清华/Umass提出的全球首个生成式机器人智能体RoboGen&#xff0c;可以无限生成数据&#xff0c;让机器人7*24小时永不停歇地训练。…

STM32笔记-AD模数转换

目录 一、ADC介绍 二、ADC主要特征 三、ADC框图 1. ​​​​ 外部触发转换 ​ 2. 转换模式 3. 输入通道 4. 逻辑框图 四、校准 五、数据对齐 六、AD转换步骤 七、AD_Init(单通道AD转换)初始化函数配置 一、ADC介绍 1. 12位ADC是一种逐次逼近型模拟数字转换器。它有多达…

基于SSM的购物商城网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…