11. 个人开发者如何用Cloudflare Workers搭建免费API网关?

2026-05-21

兄弟们,今天聊个实战话题。咱干IT的,谁还没写过几个API?写完后想挂出去给朋友用、给前端调,结果发现——服务器要钱、域名要备案、还得防被刷,头疼不?别急,我最近捣鼓了一个骚操作:用Cloudflare Workers搭一个免费的API网关,成本几乎为零,效果还挺香。下面唠唠怎么搞,保证小白也能看懂。

先说为啥要搞个“API网关”

举个真实例子:我前阵子写了个天气查询API,调的是某免费天气接口,但原始接口返回的数据乱七八糟,有中文有英文,前端小哥表示“老子只想用城市名查温度”。假如我把原始地址直接给他,他得自己拼参数、自己解析JSON,而且万一哪天原始接口换地址了,我还得一个个通知。这时候就需要一个“中间人”——API网关。

网关能干啥?统一入口、数据清洗、加个限速、加个鉴权。听起来挺高大上?其实Cloudflare Workers就是干这活的料。它本质上是一小段跑在Cloudflare全球边缘节点上的JavaScript代码,你写个函数,用户访问某个URL,Worker就执行你的函数,返回结果。关键是一天10万次免费请求,个人开发者完全够用。

怎么搭?三步搞定

第一步:注册Cloudflare,把域名托管过去

这步不多说,从域名注册商那里改NS记录到Cloudflare就行。免费套餐本身就带CDN和SSL。你要是还没域名?用Cloudflare提供的.workers.dev子域名也行,不用备案,直接撸。

第二步:写一个Worker做反向代理

咱们要做的很简单:把发到 Cloudflare Workers 的请求,转发到目标API,同时还能在中间加料。比如我那个天气接口,原始URL是 https://api.weather.com/current?city={city}&key=xxx,我不想让前端知道key,也不能暴露原始域名。

那我写个Worker:

export default {
  async fetch(request) {
    const url = new URL(request.url);
    const city = url.searchParams.get('city') || 'Beijing';
    const target = `https://api.weather.com/current?city=${city}&key=my-secret-key`;
    const response = await fetch(target);
    const data = await response.json();
    // 我只要温度和描述,把其他字段扔掉
    return new Response(JSON.stringify({
      temp: data.current.temp_c,
      desc: data.current.condition.text
    }), {
      headers: { 'content-type': 'application/json' }
    });
  }
}

这段代码就像个“翻译官”:前端问 myworker.xxx.workers.dev?city=Shanghai,Worker偷偷去调原始API,提取关键字段,返回干净数据。这样前端小哥拿到了20KB的JSON压缩成2KB,而且原始接口变化再大,我这里改一行代码就行,前端不用动。

第三步:加上限流和鉴权(可选)

网关的另一大用处是防盗刷。个人API被爬虫盯上就废了。Workers里可以简单加个IP频率限制,或者要求请求头带一个token。比如:

const token = request.headers.get('X-Api-Key');
if (token !== 'my-token') {
  return new Response('Forbidden', { status: 403 });
}

这样只有知道token的人能调用。而且免费计划里Worker支持kv存储,还能撸个简单的计数限流,一天最多1000次,超了就返回429。像不像一个迷你版Kong?

真实场景:聚合多个API为一个

之前有个需求:查询某个商品在不同平台的价格,得同时调淘宝、京东、拼多多三个接口。常规做法是在服务器上写个并发请求中间层。但用Worker也能干:

const [taobao, jd, pdd] = await Promise.all([
  fetch(`https://api.taobao.com/price?sku=${sku}`),
  fetch(`https://api.jd.com/price?sku=${sku}`),
  fetch(`https://api.pdd.com/price?sku=${sku}`)
]);
// 合并结果返回

这样前端一次请求,Worker并行拉取,返回合并数据。还能做超时控制,哪个接口慢了直接跳过。

免费额度到底够不够?

Cloudflare Workers免费计划:每天10万次请求,每分钟1000次,每次最多50ms CPU时间(付费可更多)。个人开发者的个人项目、小工具、临时接口,完全够了。我挂了一个小博客的评论API,一个定时签到API,一个月都跑不满10万。就算超了也不怕,因为Cloudflare会在超量后直接返回报错,不会产生欠费。良心。

踩坑提醒

  1. 注意Worker的超时限制。如果目标API响应太慢(超过30秒),Worker会报错。建议用 AbortController 设个5秒超时,或者只缓存结果。
  2. 别忘了加缓存。对于不经常变的数据,在Worker里用 Response 加上 cache-control 头,配合Cloudflare CDN,第二次请求直接命中缓存,连Worker都不跑。
  3. 代码体积别太大。免费套餐单个Worker代码不能超过1MB,但一般够用。如果逻辑复杂,可以拆成多个Worker用路由绑定。

更多玩法

除了当API网关,Workers还能做:A/B测试、SSR(流式渲染)、图片压缩、甚至搭个简单的后台API(配合D1数据库)。对于个人开发者,它就是一把瑞士军刀,省去了服务器运维成本。

当然,如果你需要更专业的API网关,比如商业级的流量管理、插件市场,可以考虑Kong、Apache APISIX那些。但如果你只是一个业余项目、或者想快速验证想法,Cloudflare Workers这套免费方案真香。

最后说一句,技术方案没有银弹,适合自己场景的才是最好的。想了解更多类似的免费基础设施组合,更多方案可访问 itfangan.com,上面有不少老炮的实战分享。

兄弟们,今晚就试试吧。写个Worker,把你手头的API都管起来,轻松又省钱。有啥问题随时交流!