iris 默认不自动解析请求体,需显式调用c.readform或c.readjson获取参数;短信sdk应全局初始化并设http超时;响应仅表示“接收成功”,强一致性需异步+redis;本地调试用接口抽象+mock。

用 Iris 的 iris.Post 接收短信发送请求时,为什么收不到参数?
Iris 默认不自动解析 application/x-www-form-urlencoded 或 application/json 请求体,直接读 c.FormValue 或 c.Body() 会为空或报错。
- 必须显式调用
c.ReadForm(30 * time.Second)(表单)或c.ReadJSON(&v)(JSON)才能取到数据 - 若前端用
fetch发 JSON,后端没调ReadJSON,v就是零值,日志里也看不到错误——Iris 默认静默失败 - 别在 handler 里反复调
ReadJSON:第二次调会返回io.EOF,因为 body 已被读空
短信服务商 SDK 和 Iris 怎么共存不冲突?
多数短信 SDK(如阿里云 alisms、腾讯云 tencentcloud-sdk-go)本身是纯函数调用,和 Iris 无耦合。真正容易出问题的是并发和超时控制。
- SDK 客户端(如
alisms.Client)应作为全局变量初始化一次,不要每次请求都 new —— 否则连接池失效,很快打满文件描述符 - 给 HTTP client 设置超时:
http.DefaultClient.Timeout = 10 * time.Second,否则默认是 0(无限等待),一个卡住的短信请求会拖垮整个服务 - 别把敏感配置(
AccessKeySecret)硬编码在 handler 里;用iris.ConfigurationReader加载 YAML/ENV,再注入到 handler 闭包中
iris.Context 里怎么安全返回短信发送结果?
短信接口不是强实时的,返回 200 OK 不代表短信已发出,更不代表用户已收到。Iris 的响应设计要区分「接收成功」和「发送成功」。
- 不要在 handler 里等短信回调或轮询状态——这会阻塞 goroutine;立刻返回
c.JSON(iris.Map{"code": 0, "msg": "已受理", "request_id": "xxx"}) - 如果业务要求强一致性(比如注册必须收到短信才允许下一步),改用异步 + Redis 过期键监听:发完短信后写
SETEX sms:phone:138xxxxxx 60 "pending",回调到达时改值为"success" - 别用
c.StatusCode(iris.StatusOK)后再c.WriteString:Iris 会忽略 status code,实际返回仍是 200;统一用c.JSON或c.Status+c.Write
本地调试时怎么避免真发短信又验证逻辑?
开发阶段调真实短信接口既费钱又难测异常分支(如签名审核中、余额不足、手机号拉黑)。
- 用接口抽象 + 依赖注入:定义
type SMSSender interface { Send(phone, content string) error },测试时传入mockSMSSender,生产才用真实 SDK - Iris 启动时通过环境变量切换:
if os.Getenv("ENV") == "dev" { app.RegisterDependency(&mockSender) } - 在 mock 实现里模拟各种错误:
if phone == "13900000000" { return errors.New("sms: signature rejected") },比改配置文件快得多
真正麻烦的不是调通 API,而是处理“发送成功但运营商丢弃”“用户拒收但网关返回 success”“同一号码 1 分钟内重复触发”这些边界。Iris 只管 HTTP 层,剩下的得靠你用 context 超时、幂等 key、异步补偿来兜底。











