如果您需要在非浏览器环境(例如移动应用程序或 Web 应用程序)中管理流量,Cloudflare 会提供一个可以通过您的 API 端点使用的、JSON 友好的 Waiting Room:
- 当用户排队时,我们将返回我们自己的 JSON 响应。
- 当用户离开 Waiting Room 时,我们会将请求转发到您的源服务器,并返回您的源服务器的响应(无论是 JSON、XML、HTML 页面等)。
为了以 JSON 格式使用 Waiting Room 响应,请采取以下步骤:
要接收 JSON 响应,您首先需要在 Waiting Room 中启用该选项。
- 通过仪表板:在 自定义 Waiting Room 时,启用 JSON 响应。
- 通过 API:在 创建 Waiting Room 时,将
json_response_enabled设置为 true。
使用标头 Accept: application/json 向您的 Waiting Room 端点发出请求。请注意,该标头必须完全匹配 Accept: application/json。如果它是任何其他内容,或有任何额外内容(如 Accept: application/json, text/html),响应将不会以 JSON 格式返回。您必须每隔 refreshIntervalSeconds 重试请求一次,以便用户在队列中前进。
curl "https://example.com/waitingroom" \
--header "Accept: application/json"{
"cfWaitingRoom": {
"inWaitingRoom": true,
"waitTime": 5,
"waitTimeKnown": true,
"waitTimeFormatted": "5 minutes",
"queueIsFull": false,
"queueAll": false,
"lastUpdated": "2021-08-03T23:46:00.000Z",
"refreshIntervalSeconds": 20
}
}Waiting Room 由一个 Waiting Room cookie 驱动,该 cookie 确定用户在队列中的位置。正因为如此,对于每个请求,cookie 都会在响应标头中更新。对于指向受 Waiting Room 保护的端点的每个请求,应用程序必须包含在上一个请求期间检索到的最新 cookie。无论用户是否已排队,这都是强制性的。如果请求不包含 cookie,Waiting Room 会假设这是一个新用户,并将在响应标头中返回一个新 cookie。因此,这会将用户置于队列的末尾。所以,在非浏览器环境中使用 Waiting Room 时,必须在请求标头中包含 Waiting Room cookie 并在每个请求后保持其更新。
有关更多信息,请参考 Waiting Room cookie。
在浏览器环境中,页面每 refreshIntervalSeconds 自动刷新一次,以确保用户在队列中前进。在非浏览器环境中,正在使用 Waiting Room JSON 友好的 API,希望您的后端服务(或 API)也每 refreshIntervalSeconds 刷新/请求一次 Waiting Room 配置的端点,以确保用户在队列中前进。
以下是可以利用 JSON 友好响应的一些位置(此列表并不详尽):
-
在移动应用程序流量中
- 集成 Waiting Room 变量 – 在您的移动应用程序中创建一个新模板以接收 JSON 响应。有关这些变量的完整列表,请参考 Cloudflare API 文档 中的
json_response_enabled参数。 - 允许 cookie – 如上所述,Waiting Room 需要 cookie,您的移动应用程序将需要支持 cookie。为了易于使用,请考虑使用类似 CookieJar ↗ 的 cookie 管理器。
- 使用 JSON 数据 - 使用
Accept: application/json标头向 Waiting Room 端点发出请求。
- 集成 Waiting Room 变量 – 在您的移动应用程序中创建一个新模板以接收 JSON 响应。有关这些变量的完整列表,请参考 Cloudflare API 文档 中的
-
在 Cloudflare Workers 内部(或在您自己的后端服务中)
-
集成 Waiting Room 变量 – 期待您的后端 API 中出现 JSON 响应。有关这些变量的完整列表,请参考 Cloudflare API 文档 中的
json_response_enabled参数。 -
在请求标头中包含 cookie – 如上所述,Waiting Room 需要 cookie,您的后端 API 将需要支持 cookie。为了易于使用,请考虑使用类似 CookieJar ↗ 的 cookie 管理器。
-
启用 JSON 响应 - 通过仪表板或通过 API。
-
使用 JSON 数据 - 使用
Accept: application/json标头向 Waiting Room 端点发出请求。这是一个示例,演示了在 Worker 内部 Waiting Room 端点的用法。请求标头包括 Waiting Room API 所需的必要
accept和cookie标头值。如果用户排队,accept 标头可确保返回 JSON 友好的响应。否则,如果请求发送到源站,则返回源站响应返回的任何内容。在此示例中,一个硬编码的__cfwaitingroom值嵌入在 cookie 字段中。但在实际应用程序中,我们期望在随后的每个请求中使用由 Waiting Room API 返回的 cookie,以确保将用户适当地置于队列中,并在轮到该用户时放行到源站。
-
const waitingroomSite = "https://examples.cloudflareworkers.com/waiting-room";
export default {
async fetch(request, env, ctx) {
const init = {
headers: {
accept: "application/json",
cookie: "__cfwaitingroom=F)J@NcRfUjXnZr4u7x!A%D*G-KaPdSgV",
},
};
return fetch(waitingroomSite, init)
.then((response) => response.json())
.then((response) => {
if (response.cfWaitingRoom.inWaitingRoom) {
return Response("in waiting room", { "content-type": "text/html" });
}
return new Response(response);
});
},
};