最近帮同事排查一个问题,他写的程序调用公司内部的一个API,结果一直返回404。第一反应是“接口不存在”?其实没那么简单。404虽然通常表示“页面未找到”,但在接口调用场景下,背后可能藏着不少坑。
URL拼写错误最常见
有一次我自己也犯过低级错误:把 /api/user/list 写成了 /api/users/list,多了一个 s,直接404。接口路径对大小写、斜杠、复数形式都很敏感,尤其是前后端协作时,文档更新不及时更容易出问题。
建议先把接口文档打开,一个字符一个字符核对请求地址。可以用浏览器直接访问这个URL(如果是GET接口),看看是不是真404。
环境搞混了也常出事
开发、测试、生产环境的域名经常不一样。比如本地连的是 http://localhost:8080,但实际接口在 https://api.dev.example.com 上。要是配置文件写错了环境地址,发出去的请求自然找不到人。
特别是前端项目,有时候 .env 文件里配的是测试环境,打包上线忘了改,一上线就跪。检查一下当前请求发到了哪个域名,抓个包或者看浏览器开发者工具里的Network面板就知道了。
后端服务根本没启动
有次我本地跑前端,调后端接口404,以为是路径错。后来发现后端服务压根没启动,Nginx 或 Node 服务挂了,404其实是服务器返回的兜底页面。
这种情况可以先 ping 一下服务地址,或者用 curl 测试:
curl -v http://your-api-domain.com/api/health
如果连通失败或者返回的是Nginx默认404页,那大概率是服务没起来,或者反向代理没配好。
Nginx或网关配置漏了路由
现在很多接口都经过Nginx、Kong或API网关转发。假如新上线一个接口,但网关没加对应路由规则,外部请求就会被拦在外面,返回404。
比如Nginx配置里漏了这一段:
location /api/v2/data {\n proxy_pass http://backend-service;\n}
那所有发往 /api/v2/data 的请求都会被当作无效路径处理。
前端代码发错请求方法
有些框架对路由有严格限制。比如用Express写的接口,只允许POST访问某个路径,但前端用了GET,也可能返回404而不是405。这取决于后端怎么处理异常路由。
这时候看后端日志最直接。如果日志里完全没记录这次请求,说明根本没进到应用层,可能是被前置服务拦截了。
跨域问题也会伪装成404
听起来离谱,但真实发生过。前端发请求,因为CORS没配,浏览器预检请求(OPTIONS)失败,后续请求被阻止。某些情况下开发者工具显示的是404,其实是压根没发出去。
点开Network里的请求,看下状态码是不是真的404,还是说请求类型是preflight,并且被取消了。这种得让后端加上正确的跨域头。
遇到接口404,别上来就说是后端问题。从自己这边一步步查起:URL对不对、环境配没配错、服务在不在、有没有走网关、浏览器有没有拦截。很多时候问题就在眼皮底下。