郭震 AI公众号:郭震AI

24 Flask RESTful API 请求与响应

发布日期:

分类: Flask从零教程

预计阅读: 3 分钟

阅读次数: 0

预计阅读3 分钟
结构重点8 个
图文要点0 张
正文规模1.4k 字

在上一篇文章中,我们讨论了什么是 RESTful API 以及如何定义 API。本篇将更深入地探讨如何处理 HTTP 请求与响应,这是构建 RESTful API 的核心部分。我们将通过一个简单的示例来演示如何在 Flask 中处理请求和返回响应。

处理请求

在 Flask 中,处理 HTTP 请求非常简单。我们可以通过定义视图函数来接收不同的 HTTP 方法(如 GET、POST、PUT 和 DELETE)。使用 @app.route() 装饰器,我们可以将 URL 路径与相应的视图函数关联起来。

示例代码

让我们创建一个简单的 Flask 应用,处理关于书籍的 RESTful API。以下代码展示了如何创建一个简单的书籍存储服务,支持 GET 和 POST 请求。

from flask import Flask, jsonify, request

app = Flask(__name__)

# 模拟数据库
books = []

@app.route('/books', methods=['GET'])
def get_books():
    return jsonify(books), 200

@app.route('/books', methods=['POST'])
def add_book():
    new_book = request.get_json()
    if not new_book or 'title' not in new_book or 'author' not in new_book:
        return jsonify({'error': 'Bad Request', 'message': 'Missing title or author'}), 400
    books.append(new_book)
    return jsonify(new_book), 201

if __name__ == '__main__':
    app.run(debug=True)

代码讲解

  1. 获取书籍 (GET /books):

  • 当客户端发起 GET 请求时,get_books 视图函数会被调用,它返回包含所有书籍的 JSON 响应,状态码为 200
  • 使用 jsonify 来生成响应,它会自动将 Python 字典转换为 JSON 格式。
  • 添加新书 (POST /books):

    • 当客户端发送 POST 请求时,add_book 视图函数会被触发。我们使用 request.get_json() 来获取请求体中的 JSON 数据。
    • 代码检查请求体中是否包含 titleauthor 字段。如果缺少这些字段,则返回 400 Bad Request 响应。
    • 如果验证通过,则将新书加入 books 列表,并返回新书的 JSON 数据,状态为 201 Created
  • 处理响应

    在处理响应时,Flask 允许我们灵活地设置返回的状态码和返回的内容。通常,一个良好的 RESTful API 应该保证返回适当的 HTTP 状态码,以便客户端知道请求是否成功。

    状态码与响应示例

    • 成功响应:
      • 对于成功的 GET 或 POST 请求,我们通常返回 200 OK201 Created
    • 错误响应:
      • 如果客户端请求的资源不存在,返回 404 Not Found
      • 对于不合法的请求参数,返回 400 Bad Request

    我们可以通过修改先前的代码来包含这些场景。

    完整示例代码

    @app.route('/books/<int:book_id>', methods=['GET'])
    def get_book(book_id):
        if 0 <= book_id < len(books):
            return jsonify(books[book_id]), 200
        else:
            return jsonify({'error': 'Not Found', 'message': 'Book does not exist'}), 404
    
    @app.route('/books/<int:book_id>', methods=['DELETE'])
    def delete_book(book_id):
        if 0 <= book_id < len(books):
            deleted_book = books.pop(book_id)
            return jsonify(deleted_book), 200
        else:
            return jsonify({'error': 'Not Found', 'message': 'Book does not exist'}), 404
    

    解释新增内容

    1. 获取单本书籍 (GET /books/<book_id>):

      • 根据传入的 book_id 返回特定的书籍,如果书籍不存在,则返回 404 Not Found 响应。
    2. 删除书籍 (DELETE /books/<book_id>):

      • 该路由允许删除指定 ID 的书籍。如果 ID 有效,则从列表中移除相应的书籍并返回该书籍的 JSON 数据;如果无效,则返回 404 Not Found

    小结

    在本篇教程中,我们深入探讨了 Flask 中 RESTful API 的请求与响应。我们学会了如何处理客户端发来的请求,如何返回合适的响应以及如何结合 HTTP 状态码来提高 API 的可用性。

    在下一篇文章中,我们将讨论如何为 RESTful API 实施版本控制,从而确保 API 的向后兼容性及易于未来扩展。如果你对 API 的设计和实现有更多的好奇,欢迎继续跟随我们的系列教程!

    分享文章

    转发到常用平台

    微信/朋友圈可先复制链接

    相关内容

    更多相关文章

    返回栏目

    Reader Messages

    读者留言

    有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

    最多 800 字

    为了防刷,每条留言会做长度、链接数量和提交频率限制。

    0/800

    留言列表

    0
    正在加载留言...