前端不能直接调预警接口 有些场景希望在后台管理页面点一个按钮就给值班人员打电话,或在表单提交失败时弹出告警。但前端页面不能直接调用预警通知API——那样API Key会暴露在浏览器里,任何人打开开发者工具都能看到,进而冒用你的账号发短信、产…
前端不能直接调预警接口
有些场景希望在后台管理页面点一个按钮就给值班人员打电话,或在表单提交失败时弹出告警。但前端页面不能直接调用预警通知API——那样API Key会暴露在浏览器里,任何人打开开发者工具都能看到,进而冒用你的账号发短信、产生费用。正确做法是:前端只调用自己后端的内部接口,由后端封装并调用预警API。互亿无线预警通知API放在服务端调用,前端通过后端间接触发。
本文说明后端封装告警接口的结构、前端调用方式,以及封装时的权限与安全要点。
后端封装一个内部告警接口
在自己的服务里写一个接收前端请求的接口,鉴权后转发给预警API:
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
@app.route("/internal/alert", methods=["POST"])
def alert():
if not check_login(request):
return jsonify({"ok": False}), 401
body = request.get_json()
mobile = body.get("mobile")
message = body.get("message")
r = requests.post("https://api.ihuyi.com/sms/Submit.json", data={
"account": "API_ID", "password": "API_KEY",
"mobile": mobile, "content": message
}, timeout=(3, 5))
return jsonify({"ok": r.json().get("code") == "2"})
前端触发方式
前端页面通过fetch调用自己的内部接口,无需接触密钥:
fetch("/internal/alert", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({mobile: "13800138000", message: "【人工告警】订单系统异常"})
});
封装时的注意点
- 内部接口必须校验登录态和权限,避免匿名调用触发短信。
- 对mobile做白名单校验,只允许向值班号码发送。
- 对message做长度与字符限制,避免长短信多条计费。
- 人工告警与自动告警分开记录,便于审计是谁触发的。
后端封装的进阶用法
在内部接口里,可以再做一层告警分级:前端传来严重级别,后端根据级别选择不同通道。P0直接走语音或三合一,P2只发短信,前端不必关心通道细节。还可以在后端记录谁在什么时间触发了哪条告警,便于事后审计。如果担心前端被滥用触发大量短信,可以加一层频率限制,例如同一个人一分钟内至多触发三条。
另外,建议把预警接口的调用放在后端异步任务里,前端发起后立即返回"已受理",由后台慢慢发送,避免用户页面卡在等待响应上。这样体验更好,也不会因为前端关闭页面而中断发送。互亿无线提供免费技术支持,可协助设计这套封装结构。
前端触发的典型场景
常见场景包括:值班人员在后台点"通知相关人"按钮拉起应急通知;运维人员在监控页面手动补发一条告警;客服在处理投诉时一键通知技术支持。这些场景都由后端统一鉴权、统一调用预警API,避免了把密钥散落在前端。
后端封装还可以统一处理超时与重试,前端只关心是否受理成功。这样无论底层走短信还是语音,前端逻辑都不用改。
这样前端可以便捷地触发告警,而密钥和通道配置都保留在服务端。互亿无线按成功计费,人工误触发未成功的不产生费用。注册免费试用,用测试条数验证后端封装后的触发链路。




