什么是 API?它有什么用?本文从零开始教你搭建 API,认识 API 服务组件和 FastAPI 的使用细节。
GitHub项目地址:
luochang212/calendar-apigithub.com什么是 API?
简单来说,API 是软件间相互传输数据的接口。它在生活中十分常见,比如博物馆订票系统中就使用了 API. 当你在手机应用上订票时,手机实际上发送了一个 HTTP 请求给远程服务器。远程服务器解析该请求。当确认所有字段信息均准确无误后,它才会把你的订票信息录入数据库,并回调成功标识。只有当上述操作全都被正确执行时,你的手机才会显示订票成功。
API 程序通常运行在服务端 (server) 上。客户端 (client) 通过向 API 提供的网络接口发送请求,以实现对服务端的通信。服务端收到请求后,对请求进行解析。如果请求是合法的,则执行该请求,并将请求结果回调给客户端。一次典型的 API 请求大体上是这么个过程。
但是,在业务中,我们经常需要记录每次请求产生的中间状态、运行结果和日志信息等数据,那么就需要数据库的参与。服务端调用 数据库 (database) 以存储业务中产生的各种信息。
1. REST API
API 本身是高度个性化的,软件间可以用任意数据类型进行通信。但如果 API 是面向大众的,个性化将导致软件间沟通成本高企。这就需要有规范来约束其沟通方式。REST API 就是其中一种规范。REST API 提出了六项指导原则,只要 API 符合这六项指导原则,就能称之为“符合 REST 风格的 API”。
REST API 提出的六项指导原则分别是:
- Client–server
- Stateless
- Cacheable
- Uniform interface
- Layered system
- Code on demand (optional)
[了解更多]
PS: FastAPI 对构建 REST 风格的 API 提供良好的支持,这也是本文选用 FastAPI 的原因之一。
2. 安装 FastAPI
FastAPI 是 Python 下用于构建 API 的一个包。它的代码量少适合敏捷开发、服务稳定、支持异步,是目前搭建 API 的不二之选。
Let's start!!!
使用 FastAPI 需要先安装两个包。有关安装的详细信息,参见这里。
1.安装 fastapi
pip install fastapi
2.安装 uvicorn
(或 hypercorn
)
pip install uvicorn
FAQ:
❓ 什么是uvicorn
?
Uvicorn is a lightning-fast ASGI server implementation, using uvloop and httptools. [reference]
❓ 什么是ASGI server
?
ASGI (Asynchronous Server Gateway Interface) is a spiritual successor to WSGI, intended to provide a standard interface between async-capable Python web servers, frameworks, and applications.
Where WSGI provided a standard for synchronous Python apps, ASGI provides one for both asynchronous and synchronous apps, with a WSGI backwards-compatibility implementation and multiple servers and application frameworks. [reference]
3. 测试安装是否成功
安装完后,我们来搭一个超级简单的 API,来验证安装是否成功。调用此 API,它将回调一条 JSON 信息: {'key': 'value'}
。下面的代码实现了这个功能。
首先,新建 main.py
文件,并在文件中写入如下内容。
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
def index():
return {
'key': 'value'}
然后,在命令行界面中,来到当前目录下,执行如下命令。
uvicorn main:app --reload
注:在此命令中,main
是脚本的名称(脚本名为 main.py
),--reload
代表在每次脚本更新时重启 ASGI 服务。
最后,在浏览器中打开 http://127.0.0.1:8000
,如果网页显示 {'key': 'value'}
的话,就说明我们的 API 搭建成功啦!