跳到内容

OpenAPI Webhooks

在某些情况下,您希望告知 API 用户,您的应用可能会调用他们的应用(发送请求)并携带某些数据,通常是为了通知某种事件

这意味着与用户向您的 API 发送请求的常规流程不同,这次是您的 API(或您的应用)可能会向他们的系统(向他们的 API 或应用)发送请求

这通常被称为 webhook

Webhooks 步骤

通常的流程是,您在代码中定义您将要发送的消息,即请求体

您还需要以某种方式定义您的应用将在什么时刻发送这些请求或事件。

并且您的用户会以某种方式(例如在某个网页仪表盘中)定义您的应用应该向哪个 URL 发送这些请求。

关于如何注册 Webhook URL 以及实际发送这些请求的代码的全部逻辑都由您决定。您可以按照自己想要的方式在自己的代码中编写。

使用 FastAPI 和 OpenAPI 记录 Webhooks

借助 FastAPI 和 OpenAPI,您可以定义这些 Webhook 的名称、您的应用可以发送的 HTTP 操作类型(例如 POSTPUT 等)以及您的应用将要发送的请求

这可以使您的用户更容易地实现他们的 API 以接收您的 webhook 请求,他们甚至可以自动生成部分自己的 API 代码。

信息

Webhooks 在 OpenAPI 3.1.0 及更高版本中可用,并由 FastAPI 0.99.0 及更高版本支持。

带有 Webhooks 的应用

当您创建 FastAPI 应用时,可以使用 webhooks 属性来定义 webhooks,其方式与定义 路径操作 相同,例如使用 @app.webhooks.post()

from datetime import datetime

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Subscription(BaseModel):
    username: str
    monthly_fee: float
    start_date: datetime


@app.webhooks.post("new-subscription")
def new_subscription(body: Subscription):
    """
    When a new user subscribes to your service we'll send you a POST request with this
    data to the URL that you register for the event `new-subscription` in the dashboard.
    """


@app.get("/users/")
def read_users():
    return ["Rick", "Morty"]

您定义的 Webhooks 将会包含在 OpenAPI 模式和自动生成的文档 UI 中。

信息

app.webhooks 对象实际上只是一个 APIRouter,这与您在将应用组织为多个文件时使用的类型相同。

请注意,使用 Webhooks 时,您实际上并没有声明 路径(例如 /items/),您在那里传递的文本只是 Webhook 的一个标识符(事件名称)。例如在 @app.webhooks.post("new-subscription") 中,Webhook 的名称为 new-subscription

这是因为通常您的用户会通过其他方式(例如网页仪表盘)定义他们希望接收 Webhook 请求的实际 URL 路径

检查文档

现在,您可以启动应用并访问 http://127.0.0.1:8000/docs

您会看到文档中不仅有常规的 路径操作,现在还包含了一些 webhooks