本文介绍: Representational State Transfer(REST)是一种面向资源架构风格,广泛应用于网络服务设计开发。RESTful 架构基于简单原则标准,易于理解实现。它的设计使得系统具有扩展性,便于适应不断变化的需求。RESTful 架构支持松耦合,客户端服务器之间的交互是无状态的,每个请求包含足够的信息使其独立完成。这促使系统组件之间的独立性,使得修改一个组件不会影响其他组件。RESTful 架构通过使用统一接口,使得资源状态操作客户端可见。

RESTful 简介

1.1 为什么使用 RESTful 架构

Representational State Transfer(REST)是一种面向资源架构风格,广泛应用于网络服务设计开发使用RESTful架构有以下几个优点:

1.2 RESTful API 请求设计

设计 RESTful API 请求时应考虑以下几个方面:

1.3 RESTful API 响应设计

设计 RESTful API 响应需要考虑以下几个方面:

通过合理设计 RESTful API 请求和响应可以构建出清晰、可维护、可扩展系统实现客户端服务器之间的有效通信

Flask例子

__init__.py

from flask import Flask 

from .extensions import api, db
from .resources import ns

def create_app():
    app = Flask(__name__)

    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///db.sqlite3"

    api.init_app(app)
    db.init_app(app)

    api.add_namespace(ns)

    return app

api_models.py

# 导入 Flask-Restx 框架fields 模块
from flask_restx import fields

# 从自定义extensions 模块导入 api 对象
from .extensions import api

# 定义一个名为 "Student" 的模型,包含 id整数)、name字符串)和一个嵌套course_model 字段
student_model = api.model("Student", {
    "id": fields.Integer,           # 学生 ID,类型整数
    "name": fields.String,          # 学生名称类型字符串
    #"course": fields.Nested(course_model)  # 嵌套课程模型字段,该行代码注释掉了
})

# 定义一个名为 "Course" 的模型,包含 id整数)、name(字符串)和一个嵌套的 students 字段,是一个学生列表
course_model = api.model("Course", {
    "id": fields.Integer,           # 课程 ID,类型整数
    "name": fields.String,          # 课程名称类型字符串
    "students": fields.List(fields.Nested(student_model))  # 嵌套的学生列表字段
})

# 定义一个名为 "CourseInput" 的模型,用于接收创建课程时的输入数据
course_input_model = api.model("CourseInput", {
    "name": fields.String,          # 课程名称,类型为字符串
})

# 定义一个名为 "StudentInput" 的模型,用于接收创建学生时的输入数据
student_input_model = api.model("StudentInput", {
    "name": fields.String,          # 学生名称,类型为字符串
    "course_id": fields.Integer     # 所属课程的 ID,类型为整数
})

extensions.py

from flask_sqlalchemy import SQLAlchemy 
from flask_restx import Api

api = Api()
db = SQLAlchemy()

models.py

from .extensions import db 

class Course(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)
    
    students = db.relationship("Student", back_populates="course")


class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)
    course_id = db.Column(db.ForeignKey("course.id"))

    course = db.relationship("Course", back_populates="students")

resources.py

# 导入 Flask-Restx 框架的 Resource 类和 Namespace 类
from flask_restx import Resource, Namespace 

# 导入自定义的 API 模型和数据库模型
from .api_models import course_model, student_model, course_input_model, student_input_model
from .extensions import db
from .models import Course, Student

# 创建一个命名空间对象,用于组织管理 API 路由
ns = Namespace("api")

# 创建一个处理 "/hello" 路由的 Resource 类
@ns.route("/hello")
class Hello(Resource):
    def get(self):
        return {"hello": "restx"}

# 创建处理 "/courses" 路由的 Resource 类
@ns.route("/courses")
class CourseListAPI(Resource):
    # 使用 course_model 进行响应数据序列化
    @ns.marshal_list_with(course_model)
    def get(self):
        # 返回所有课程的查询结果
        return Course.query.all()

    # 使用 course_input_model 进行请求数据验证
    # 使用 course_model 进行响应数据序列化
    @ns.expect(course_input_model)
    @ns.marshal_with(course_model)
    def post(self):
        # 从请求中获取课程名称,并创建新的课程对象
        course = Course(name=ns.payload["name"])
        # 将新课程对象添加数据库中
        db.session.add(course)
        # 提交数据库事务
        db.session.commit()
        # 返回创建的课程对象和状态码 201(表示资源创建成功)
        return course, 201

# 创建处理 "/courses/<int:id>" 路由的 Resource 类
@ns.route("/courses/<int:id>")
class CourseAPI(Resource):
    # 使用 course_model 进行响应数据序列化
    def get(self, id):
        # 根据课程 ID 查询返回相应的课程对象
        course = Course.query.get(id)
        return course

    # 使用 course_input_model 进行请求数据验证
    # 使用 course_model 进行响应数据序列化
    def put(self, id):
        # 根据课程 ID 查询相应的课程对象
        course = Course.query.get(id)
        # 更新课程对象的名称
        course.name = ns.payload["name"]
        # 提交数据库事务
        db.session.commit()
        # 返回更新后的课程对象
        return course

    # 删除指定 ID 的课程对象
    def delete(self, id):
        course = Course.query.get(id)
        db.session.delete(course)
        db.session.commit()
        # 返回空响应体和状态码 204(表示资源删除成功)
        return {}, 204

# 创建处理 "/students" 路由的 Resource 类
@ns.route("/students")
class StudentListAPI(Resource):
    # 使用 student_model 进行响应数据的序列化
    def get(self):
        # 返回所有学生的查询结果
        return Student.query.all()

    # 使用 student_input_model 进行请求数据的验证
    # 使用 student_model 进行响应数据的序列化
    def post(self):
        # 从请求中获取学生名称和所属课程 ID,并创建新的学生对象
        student = Student(name=ns.payload["name"], course_id=ns.payload["course_id"])
        # 将新学生对象添加数据库中
        db.session.add(student)
        # 提交数据库事务
        db.session.commit()
        # 返回创建的学生对象和状态码 201(表示资源创建成功)
        return student, 201

# 创建处理 "/students/<int:id>" 路由的 Resource 类
@ns.route("/students/<int:id>")
class StudentAPI(Resource):
    # 使用 student_model 进行响应数据的序列化
    def get(self, id):
        # 根据学生 ID 查询并返回相应的学生对象
        student = Student.query.get(id)
        return student

    # 使用 student_input_model 进行请求数据的验证
    # 使用 student_model 进行响应数据的序列化
    def put(self, id):
        # 根据学生 ID 查询相应的学生对象
        student = Student.query.get(id)
        # 更新学生对象的名称和所属课程 ID
        student.name = ns.payload["name"]
        student.course_id = ns.payload["course_id"]
        # 提交数据库事务
        db.session.commit()
        # 返回更新后的学生对象
        return student

    # 删除指定 ID 的学生对象
    def delete(self, id):
        student = Student.query.get(id)
        db.session.delete(student)
        db.session.commit()
        # 返回空响应体和状态码 204(表示资源删除成功)
        return {}, 204

原文地址:https://blog.csdn.net/m0_61634551/article/details/134630408

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_22734.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注