【实战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), 200
    return 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), 200
    return jsonify({"error": "Book not found."}), 404


# 删除书籍
@app.route("/books/<int:book_id>", methods=["DELETE"])
def delete_book(book_id):
    global books
    books = [book for book in books if book["id"] != book_id]
    return "", 204


if __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 打下了扎实的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sublime怎么调中文?

Sublime Text是一个功能强大的文本编辑器&#xff0c;它被广泛使用于编码过程中。在开发过程中&#xff0c;Sublime Text界面的语言设置通常默认为英语&#xff0c;无法直接输入中文。那么如何调整Sublime Text编辑器的设置&#xff0c;以允许在界面中输入和编辑中文呢&#xf…

嵌入式web boa配置流程详解

boa配置流程详解 前期准备boa介绍操作目的下载boa 配置流程1.解压boa服务器2.配置Makefile3.编译boa服务器4.修改boa配置文件5.增加权限并编译cgi6.测试demo7.错误示例 附录A history附录B boa.conf 前期准备 boa介绍 Boa服务器是一个小巧高效的web服务器&#xff0c;是一个运…

虹科示波器 | 汽车免拆检修 | 2012 款上汽大众帕萨特车 发动机偶尔无法起动

一、故障现象 一辆2012款上汽大众帕萨特车&#xff0c;搭载CFB发动机&#xff0c;累计行驶里程约为12万km。车主反映&#xff0c;将点火开关置于起动挡&#xff0c;偶尔只能听到“咔哒”一声&#xff0c;起动机没有反应&#xff0c;类似蓄电池亏电时起动发动机的现象。为此&…

优思学院|质量管理工作困难重重,为何仍有人乐此不疲?

有一位网友说道&#xff1a;质量管理工作困难重重&#xff0c;为何仍有人乐此不疲&#xff1f;我完全理解他的困惑&#xff0c;质量管理工作的确是个不容易的任务&#xff0c;充满挑战&#xff0c;需要不断的努力和耐心。尽管如此&#xff0c;很多人依然选择从事这个领域的工作…

学习c++的第二天

目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 变量作用域 数据类型 基本数据类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数…

uni-app 应对微信小程序最新隐私协议接口要求的处理方法

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 一&#xff0c;问题起因 最新在开发小程序的时候&#xff0c;调用微信小程序来获取用户信息的时候经常报错一个问题 fail api scope is not declared in the privacy agreement&#xff0c;api更具公告…

Windows Server 2008安装

1.典型 2.稍后安装操作系统 3.Microsoft Windows 4.尽量虚拟机名称也改一下&#xff0c;我忘记改了 5. 默认40G差不多了&#xff0c;不用修改了 6.直接点完成 7.配置处理器和镜像 8.中文简体 9.现在安装 10.第一个就行&#xff08;完全安装&#xff09; 11.我接受&#xff0c…

HarmonyOS数据管理与应用数据持久化(一)

一. 数据管理概述 功能介绍 数据管理为开发者提供数据存储、数据管理能力&#xff0c;比如联系人应用数据可以保存到数据库中&#xff0c;提供数据库的安全、可靠等管理机制。 数据存储&#xff1a;提供通用数据持久化能力&#xff0c;根据数据特点&#xff0c;分为用户首选项、…

设计模式_状态模式

状态模式 介绍 设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的&#xff1a;攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…

银河麒麟x86版、银河麒麟arm版操作系统编译zlmediakit

脚本 # 安装依赖 gcc-c.x86_64 这个不加的话会有问题 sudo yum -y install gcc gcc-c libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg git openssl-devel gcc-c.x86_64mkdir -p /home/zenglg cd /home/zenglg git clone --depth 1 https://gitee.com/xia-chu…

7.OsgEarth加载Obj模型

愿你出走半生,归来仍是少年&#xff01; 除了大面积的倾斜摄影的加载&#xff0c;同时还存在单个模型的加载。常用的obj模型作为单体在三维场景中的呈现。 原理类似于6.OsgEarth加载倾斜摄影-CSDN博客中的倾斜加载。 1.代码 通过osg读取文件作为节点添加到GeoTransform节点中&…

探索ChatGPT在学术写作中的应用与心得

随着人工智能的迅猛发展&#xff0c;ChatGPT作为一种强大的自然语言处理模型&#xff0c;逐渐在学术界引起了广泛的关注。本文将探讨ChatGPT在学术写作中的应用&#xff0c;并分享使用ChatGPT进行学术写作时的一些经验和心得。 01 — ChatGPT在学术写作中的应用 1.文献综述和…

Openssl数据安全传输平台019:外联接口类的封装以及动态库的制作 - Bug未解决,感觉不是代码的问题

文章目录 1 外联接口1.1 接口类的封装1.2 共享内存与配置文件 2 json格式配置文件的定义2.1 共享内存中存储的节点结构2.2 服务器端配置文件2.3 客户端配置文件2.4 改进配置文件 3 共享内存类修改4 将接口打包成库(静态/动态)4.1 相关的指令4.1.1 静态库4.1.2 动态库 4.2 外联接…

数据结构之树(图解)

文章目录 前言一、树是什么&#xff1f;二、树的特点三、树的相关概念四、树的表示方法&#xff08;孩子兄弟表示法&#xff09;总结 前言 在学习完线性结构&#xff0c;例如顺序表、链表、栈、队列后&#xff0c;我们要开始学习一个新的数据结构----树 一、树是什么&#xf…

安防视频监控平台EasyCVR服务器需要开启firewalld防火墙,该如何开放端口?

智能视频监控/视频云存储/集中存储/视频汇聚平台EasyCVR具备视频融合汇聚能力&#xff0c;作为安防视频监控综合管理平台&#xff0c;它支持多协议接入、多格式视频流分发&#xff0c;视频监控综合管理平台EasyCVR支持海量视频汇聚管理&#xff0c;可应用在多样化的场景上&…

ElasticSearch 批量插入漏数据

项目场景&#xff1a; 项目中需要把Mysql数据同步到ElasticSearch中 问题描述 数据传输过程中数据不时出现丢失的情况&#xff0c;偶尔会丢失一部分数据&#xff0c;本地测试也无法复现&#xff0c;后台程序也没有报错&#xff0c;一到正式环境就有问题,很崩溃 这里是批量操…

Collction的List方法,list特有方法,遍历方式,迭代器选择

[to] list特有方法 //插入指定元素//list.add(1,"ddd");//System.out.println(list);//[aaa, ddd, bbb, ccc]//这个表示在一索引的位置插入ddd//他会把原来一索引位置的元素往后移动一位在添加//删除指定元素//String remove list.remove(1);//System.out.println(…

云原生安全日志审计

记得添加&#xff0c;把配置文件挂载进去 - mountPath: /etc/kubernetes/auditname: audit-policyreadOnly: true.....- hostPath:path: /etc/kubernetes/audit/type: DirectoryOrCreatename: audit-policy/etc/kubernetes/manifests/kube-apiserver.yaml 具体配置文件如下 a…

查询平均提速 700%,奇安信基于 Apache Doris 升级日志安全分析系统

本文导读&#xff1a; 数智时代的到来使网络安全成为了不可忽视的重要领域。奇安信作为一家领先的网络安全解决方案领军者&#xff0c;致力于为企业提供先进全面的网络安全保护&#xff0c;其日志分析系统在网络安全中发挥着关键作用&#xff0c;通过对运行日志数据的深入分析…

Git复制代码

目录 一、常用下载代码 1.登录Git克隆SSH​编辑 2.新建文件然后右键点击Git Bash Here 3.git clone Paste 二. 本地下载 1.从本地进入页面 2.生成代码——>导入——>生成代码后下载 3.解压道相应位置 一、常用下载代码 1.登录Git克隆SSH 2.新建文件然后右键点击…