curl -i -X DELETE https://api.example.com/v1/orders/42

删除接口返回 204,响应头里却带着 Content-Length: 0,iOS 客户端一直转圈,直到 30 秒超时才提示成功。安卓端正常。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,204 按规范不能有响应体,部分客户端把 Content-Length 当成还要读 0 字节的信号,读完一直等连接关闭。中间代理又保留了长连接,客户端就卡在读取阶段,只能等超时。

「204 响应体」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:204 响应不要写 Content-Length 也不要在拦截器里统一塞 body;确认框架没有把空字符串序列化成响应体;需要返回结果就改成 200 加 JSON 不要用 204 带内容;用 curl 和移动端各验一次 看客户端是否立即结束。

改完只确认一件事:响应头里没有 Content-Length 和 Transfer-Encoding 客户端删除后立即返回。

作者 9823189