请求结果
对 FourA API 的每个 request 以及通过 proxy 端口的每个 tunnel,都会被归类为恰好一种 outcome。outcome 在调用结束时计算一次,并记录在发起调用的凭据下。您的控制台、活动源和账单都读取同一个字段。
只有 success 会消耗 credit。Premium 流量与 credit 分开计算,且不遵循 outcome 机制:参见 Billing Implications。
The Seven Outcomes
以下是 request 可能结束的七种结果。tunnel 使用其中的五种:参见下文 Tunnels Use the Same Vocabulary。
| Outcome | Layer | What it means |
|---|---|---|
success |
n/a | 已交付有效 response。计入您的计费配额。 |
application_error |
target | 目标返回 HTTP 200,但 body 包含错误字段,或 body 是 FourA 可识别的机器人验证页面。 |
application_fail |
target | 目标返回了您的 validate 规则未接受的非 2xx 状态码,或者完全没有 response,包括无法解析的目标主机名。 |
client_error |
caller | 您的 request 在离开 FourA 之前被拒绝。参数错误、proxy 值格式错误、命中 SSRF 防护的 URL。 |
rate_limit |
FourA | request 在运行前被拒绝:由您的套餐限制拒绝(套餐不包含的 endpoint 或参数返回 403,配额耗尽返回 429),或由平台的共享 RPM 或并发配额拒绝。 |
service_error |
FourA | 引擎返回服务器错误,或其 body 不是有效的 JSON。 |
service_fail |
FourA | FourA 自身网络故障:引擎未及时响应或连接中断,或者您断开了连接。 |
Layer 列说明了责任归属:
- target 结果与您调用的目标站点有关。您的 request 正常到达 FourA,FourA 也正常到达目标。目标站点自身返回了错误。
- caller 结果意味着您的 request 根本无法执行。请修正 request 格式。
- FourA 结果属于平台侧问题。请重试;如果问题持续,请查看 status page。
目标站点返回 403 属于 application_fail,而不是 client_error。您的调用格式正确,只是目标站点拒绝了访问。
Success Is validate-Aware
在未使用 validate 时,API 仅在目标返回 HTTP 200 时将 request 标记为 success。
使用 validate 时,成功判定遵循您声明的规则。如果您告知 API 某次 request 允许接收 200 和 403,则 403 返回时将被标记为 success。body 仍会原样传递给您。
curl -X POST https://eu.api.foura.ai/api/single/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"method": "GET",
"url": "https://target.example/feed",
"validate": {
"status": { "accept": [200, 403] }
}
}'
在此调用中,403 响应计为 success 并计费 1 次 request。500 响应计为 application_fail 且不计费。
相同逻辑适用于 validate.headers 和 validate.data。只要引擎根据您的规则接受了该响应,无论 HTTP 状态码为何,均返回为 success。
无论是否包含 validate,有一种结果绝不会是 success:即响应为 HTTP 200,但 body 是 FourA 可识别的机器人检查页面,例如人机视觉验证任务或仅要求浏览器运行 JavaScript 的页面。此类 request 为 application_error 且不计费。Body 仍会原样传递给您,且 X-FourA-Check-Page header 会指明该检查页面。
计费影响
| Outcome | 计费 | 计入配额 |
|---|---|---|
success |
是 | 是 |
application_error |
否 | 否 |
application_fail |
否 | 否 |
client_error |
否 | 否 |
rate_limit |
否 | 否 |
service_error |
否 | 否 |
service_fail |
否 | 否 |
仅对成功返回您所需数据的 request 进行计费。FourA 端、目标端或您自身端的失败均完全免费。
上表针对点数(credits)。Premium 流量独立于点数计算:尝试使用 premium 出口 的 request,无论结果如何,都会计算该次尝试所产生的流量,因为出口均已被使用。若某个尝试在另一个出口响应时仍在运行,该尝试会立即停止,且其截至当时所产生的流量也会计入。
标准流量同样不取决于结果:在有带宽上限的套餐中,每个 request 的流量都会计入该上限。被您套餐自身限制拒绝的 request 不计算流量。
隧道使用相同的术语体系
通过 proxy 端口 建立的隧道也会以上述结果之一结束,因此同一套标签适用于两款产品。七种结果中只有五种可能发生,因为两种 target 结果需要 FourA 解析目标的响应,而隧道的响应是您自己的加密流量。
| Outcome | 在隧道中的含义 |
|---|---|
success |
隧道已打开且您的工具已成功获取。 |
client_error |
FourA 拒绝打开该隧道:私有或保留地址,或者不支持的端口。 |
rate_limit |
达到您套餐的某项指标上限(并发打开的隧道数、每分钟打开隧道数、当期标准流量、未包含的 premium 流量),或端口本身达到容量上限或连接速率限制。 |
service_error |
FourA 没有满足您请求的出口。通常是暂时的。 |
service_fail |
无法通过 FourA 尝试的任何出口连接到目标:DNS、超时、连接被拒绝。 |
application_error |
绝不会在隧道中出现。 |
application_fail |
绝不会在隧道中出现。 |
拒绝请求时还会附带简要原因,控制面板会以对你而言直观的方式显示,而不是使用内部术语。FourA 无法支持的选项会在连接本身上直接返回 400 响应且不写入记录行,因此根本不会显示在这里。
| 界面显示的原因 | 耗尽项 |
|---|---|
| port not in plan | 你的套餐不包含该代理端口 |
| tunnels at once | 套餐允许的并发隧道数已全部被占用 |
| openings per minute | 你的套餐当前分钟的隧道开启配额已用尽 |
| traffic used up | 你的套餐在当前周期的流量已用尽 |
| premium not available | 高级流量当前不可用于你的套餐 |
| port was full | 端口本身的容量或开启速率已达上限。请稍后重试。 |
| port not served | FourA 不支持向该端口建立隧道 |
| private address | 无法访问私有和保留地址 |
隧道本身完全不以积分计费,因为隧道没有可扣费的具体 request。端口改为按字节计量。请参阅 套餐计量方式。
在控制面板中查看结果
API key 发起的每个 request 都会显示在 Activity 动态中,并带有对应的结果标签。Metrics 和 Overview 页面会聚合该字段以生成圆环图和时间线。
按结果筛选 Activity 时,你还可以聚焦于单个 endpoint (Auto、Single、Proxy Finder、Browser),以排查某类故障是否仅针对其中某一个服务。将页面的 Product 切换为 Proxy,即可使用相同的结果标签筛选隧道。
重试启发式规则
基于结果的初级重试策略:
| 结果 | 是否可安全重试? | 何时重试 |
|---|---|---|
success |
不适用 | 已获取 response。 |
application_error |
视情况而定 | 查看目标网站的错误主体。部分错误是暂时性的,大部分则不是。如果设置了 X-FourA-Check-Page,说明站点返回了验证页面:请将 URL 发送至 Auto,它会将验证页面视为需要通过的步骤,而非最终结果。 |
application_fail |
视情况而定 | 如果目标网站对你实施 rate limit,请降低请求频率。如果目标网站封禁了你,请切换到 Proxy 或 Browser endpoint。 |
client_error |
否 | request 会以相同方式再次失败。请修正输入。 |
rate_limit |
视情况而定 | 遵守 response 给出的等待时间:Retry-After、retry_after_seconds 或 retryAfter。遇到 plan_limit_browser_daily 时,暂停直到 UTC 零点;遇到 plan_limit_credits 或 plan_limit_bandwidth 时,暂停直到 resets_at;遇到 plan_limit_feature 或 plan_limit_premium 时,修改 request。 |
service_error |
是 | 短暂指数退避。 |
service_fail |
是 | 与 service_error 相同。 |
相关内容
- API 错误: HTTP 级别错误响应
- Proxy 端口: 隧道拒绝连接时返回的状态码
- Rate Limits: 触发
rate_limit的条件及其返回的两种形式 - 指标: 查看结果明细的位置
- 活动日志: 单个 request 结果历史记录