Elliot Forbes 2017-10-28
在本教程中,我们将使用 aio-libs/aiohttp 构建一个非常简单的基于 RESTful 的 API。aiohttp 是一个异步 HTTP 客户端/服务器框架。
入门 aiohttp
在深入探讨如何使用 aiohttp 创建简单 RESTful API 之前,了解这个框架到底是什么以及它能为我们做什么非常重要。
首先,aiohttp 对 HTTP 协议提供了出色的支持,同时也支持 WebSocket,这使其非常适合与流行的 WebSocket 库(例如 Socket.io)配合使用。
aiohttp 框架的关键特性在于其异步工作方式——它可以轻松地并发处理每秒数百个请求。与 Flask 等传统框架相比,它的性能极为出色。
安装 aiohttp
要安装 aiohttp,只需运行以下 pip 命令:
pip install aiohttp
编写一个简单的 API
为了开始编写一个简单的 API,我们首先定义一个处理函数:async def handle(request):,该函数在被调用时会返回一个 JSON 格式的响应。
接着,我们通过调用 app = web.Application() 创建一个应用对象,然后设置应用的路由,并添加一个 GET 请求端点,当访问路径 / 时会调用 handle 函数。
最后,我们调用 web.run_app(app) 来启动我们新定义的 aiohttp API。
文件名:app.py
from aiohttp import web
import json
async def handle(request):
response_obj = { 'status' : 'success' }
return web.Response(text=json.dumps(response_obj))
app = web.Application()
app.router.add_get('/', handle)
web.run_app(app)
测试我们的 API
我们可以通过运行 python app.py 来启动这个新的 REST API。默认情况下,它会在 http://0.0.0.0(即 http://localhost)的 8080 端口上启动。
$ python3.6 app.py
======== Running on http://0.0.0.0:8080 ========
(Press CTRL+C to quit)
当你在浏览器中访问 http://localhost:8080 时,应该会看到返回的内容为:
{"status": "success"}
POST 请求和查询参数
现在我们已经成功定义了一个非常基础的单端点 API,接下来可以在此基础上扩展,暴露使用不同 HTTP 方法(动词)的不同路由。
让我们创建一个简单的 POST 请求端点,该端点通过查询参数接收 name。我们希望最终的 URL 看起来像这样:http://localhost:8080/user?name=elliot
现在我们来定义处理函数 new_user(request):
async def new_user(request):
try:
# 正常路径:name 参数已设置
user = request.query['name']
# 处理新用户
print("Creating new user with name: ", user)
response_obj = { 'status' : 'success' }
# 返回状态码为 200(即 'OK')的成功 JSON 响应
return web.Response(text=json.dumps(response_obj), status=200)
except Exception as e:
# 异常路径:name 参数未设置
response_obj = { 'status' : 'failed', 'reason': str(e) }
# 返回状态码为 500(即 '服务器错误')的失败响应
return web.Response(text=json.dumps(response_obj), status=500)
成功定义这个新的处理函数后,我们需要将其注册到路由中,如下所示:
app.router.add_post('/user', new_user)
现在尝试运行你的应用程序,并向 http://localhost:8080/user?name=test 发送一个 POST 请求。你应该会在控制台看到如下输出:
$ python3.6 app.py
======== Running on http://0.0.0.0:8080 ========
(Press CTRL+C to quit)
Creating new user with name: test
同时,你也会收到相同的成功 JSON 响应以及 200 状态码。