兄弟们,今天聊个实战话题。咱干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会在超量后直接返回报错,不会产生欠费。良心。
踩坑提醒
- 注意Worker的超时限制。如果目标API响应太慢(超过30秒),Worker会报错。建议用
AbortController设个5秒超时,或者只缓存结果。 - 别忘了加缓存。对于不经常变的数据,在Worker里用
Response加上cache-control头,配合Cloudflare CDN,第二次请求直接命中缓存,连Worker都不跑。 - 代码体积别太大。免费套餐单个Worker代码不能超过1MB,但一般够用。如果逻辑复杂,可以拆成多个Worker用路由绑定。
更多玩法
除了当API网关,Workers还能做:A/B测试、SSR(流式渲染)、图片压缩、甚至搭个简单的后台API(配合D1数据库)。对于个人开发者,它就是一把瑞士军刀,省去了服务器运维成本。
当然,如果你需要更专业的API网关,比如商业级的流量管理、插件市场,可以考虑Kong、Apache APISIX那些。但如果你只是一个业余项目、或者想快速验证想法,Cloudflare Workers这套免费方案真香。
最后说一句,技术方案没有银弹,适合自己场景的才是最好的。想了解更多类似的免费基础设施组合,更多方案可访问 itfangan.com,上面有不少老炮的实战分享。
兄弟们,今晚就试试吧。写个Worker,把你手头的API都管起来,轻松又省钱。有啥问题随时交流!