24 Flask RESTful API 请求与响应
在上一篇文章中,我们讨论了什么是 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)
代码讲解
-
获取书籍 (GET /books):
- 当客户端发起 GET 请求时,
get_books
视图函数会被调用,它返回包含所有书籍的 JSON 响应,状态码为200
。 - 使用
jsonify
来生成响应,它会自动将 Python 字典转换为 JSON 格式。
- 当客户端发起 GET 请求时,
-
添加新书 (POST /books):
- 当客户端发送 POST 请求时,
add_book
视图函数会被触发。我们使用request.get_json()
来获取请求体中的 JSON 数据。 - 代码检查请求体中是否包含
title
和author
字段。如果缺少这些字段,则返回400 Bad Request
响应。 - 如果验证通过,则将新书加入
books
列表,并返回新书的 JSON 数据,状态为201 Created
。
- 当客户端发送 POST 请求时,
处理响应
在处理响应时,Flask 允许我们灵活地设置返回的状态码和返回的内容。通常,一个良好的 RESTful API 应该保证返回适当的 HTTP 状态码,以便客户端知道请求是否成功。
状态码与响应示例
- 成功响应:
- 对于成功的 GET 或 POST 请求,我们通常返回
200 OK
或201 Created
。
- 对于成功的 GET 或 POST 请求,我们通常返回
- 错误响应:
- 如果客户端请求的资源不存在,返回
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
解释新增内容
-
获取单本书籍 (GET /books/<book_id>):
- 根据传入的
book_id
返回特定的书籍,如果书籍不存在,则返回404 Not Found
响应。
- 根据传入的
-
删除书籍 (DELETE /books/<book_id>):
- 该路由允许删除指定 ID 的书籍。如果 ID 有效,则从列表中移除相应的书籍并返回该书籍的 JSON 数据;如果无效,则返回
404 Not Found
。
- 该路由允许删除指定 ID 的书籍。如果 ID 有效,则从列表中移除相应的书籍并返回该书籍的 JSON 数据;如果无效,则返回
小结
在本篇教程中,我们深入探讨了 Flask 中 RESTful API 的请求与响应。我们学会了如何处理客户端发来的请求,如何返回合适的响应以及如何结合 HTTP 状态码来提高 API 的可用性。
在下一篇文章中,我们将讨论如何为 RESTful API 实施版本控制,从而确保 API 的向后兼容性及易于未来扩展。如果你对 API 的设计和实现有更多的好奇,欢迎继续跟随我们的系列教程!