【实战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.hqwc.cn/news/159871.html

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

相关文章

EASYX输出文字

在EASYX中绘制出字符串和字符 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14、 //…

外卖行业如何借助微信管理系统实现高效运营

摘要&#xff1a;本文将介绍微信管理系统在外卖行业的应用&#xff0c;包括聚合聊天、朋友圈营销和群发功能。通过这些功能&#xff0c;外卖商家可以更高效地管理订单、与客户沟通、推广品牌和增加销售额。 一、引言 随着外卖行业的快速发展&#xff0c;竞争也日益激烈。为了…

使用LIME解释各种机器学习模型代码示例

机器学习模型变得越来越复杂和准确&#xff0c;但它们的不透明性仍然是一个重大挑战。理解为什么一个模型会做出特定的预测&#xff0c;对于建立信任和确保它按照预期行事至关重要。在本文中&#xff0c;我们将介绍LIME&#xff0c;并使用它来解释各种常见的模型。 LIME LIME…

【深度学习基础】Pytorch框架CV开发(2)实战篇

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)

0x00 k8s简介 k8s&#xff08;Kubernetes&#xff09; 是容器管理平台&#xff0c;用来管理容器化的应用&#xff0c;提供快速的容器调度、弹性伸缩等诸多功能&#xff0c;可以理解为容器云&#xff0c;不涉及到业务层面的开发。只要你的应用可以实现容器化&#xff0c;就可以部…

C++之初始化列表详细剖析

一、初始化列表定义 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式。 class Date { public:Date(int year, int month, int day): _year(year), _month(mont…

STM32-高级定时器

以STM32F407为例。 高级定时器 高级定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车&#xff08;断路&#xff09;功能&#xff0c;这些功能都是针对工业电机控制方面。 功能框图 16位向上、向下、向上/向下自动重装载计数器。 16位可编程预分频器&#xff0c…

软件测试/测试开发丨利用ChatGPT 生成自动化测试脚本

点此获取更多相关资料 简介 自动化测试脚本可以模拟用户与应用程序的交互&#xff0c;例如点击按钮、输入数据、导航到不同的页面等等&#xff0c;以验证应用程序的正确性、性能和稳定性。 自动化测试在回归测试、冒烟测试等测试流程中都可以极大地起到节省时间、节省人力的作…

第二十六章 BEV感知系列三(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 BEV感知系列是对论文Delving into the De…

0002Java安卓程序设计-基于Uniapp+springboot菜谱美食饮食健康管理App

文章目录 开发环境 《[含文档PPT源码等]精品基于Uniappspringboot饮食健康管理App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 功能介绍&#xff…

美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?

这是一道面试中常见的 Redis 基础面试题,主要考察求职者对于 Redis 应用场景的了解。 即使不准备面试也建议看看,实际开发中也能够用到。 内容概览: Redis 除了做缓存,还能做什么? 分布式锁:通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Re…

yolov5简易使用

1.环境配置 从github上下载好yolov5源码后&#xff0c;根据requirement文件配置环境&#xff0c;使用conda新建一个仿真环境&#xff0c;接着使用 pip install -r requirements.txt 来安装环境&#xff0c;安装后首先运行detect.py 发现安装后的环境不能使用&#xff0c;报…