接口调用返回404?别急,先查这几个地方

昨天同事小李慌慌张张跑过来问:‘线上订单接口突然调不通了,返回404,用户都炸锅了!’我让他先别急,打开浏览器控制台一看,果然是个典型的404 Not Found。这种情况在日常维护中太常见了,不是代码写错了,而是几个关键点没对上。

路径拼写错一个字母,404就找上门

最常见的原因就是URL写错了。比如后端提供的接口是 /api/v1/order/create,前端却写成了 /api/v1/orders/create,多了一个‘s’,服务器找不到对应路由,直接返回404。这种情况在团队协作时尤其容易发生,文档更新不及时,或者复制粘贴手抖了一下,问题就来了。

建议调接口前先用浏览器直接访问一下URL,看能不能打开。如果浏览器也404,那就不用怀疑,路径有问题。

服务没启动,或者端口不对

有时候后端服务重启后忘了启动某个模块,或者配置文件里端口写错了,比如应用监听在8080,但Nginx反向代理配到了8081,请求根本到不了应用层,自然返回404。

可以登录服务器,用 netstat -an | grep 8080 看看端口是否监听。也可以用 curl 测试本地访问:

curl http://localhost:8080/api/v1/order/create
如果本地能通,外部不行,那问题大概率出在网关或防火墙。

网关或反向代理配置漏了一环

现在很多系统都用Nginx、Apache或者云网关做转发。比如公司内部有个统一网关,所有请求都要走 /gateway/服务名/接口 的格式。如果前端直接调了后端地址,没走网关,就会被拦截或找不到,返回404。

举个例子,正确路径应该是:
https://api.example.com/gateway/order-service/create
但前端写成了:
https://order-service.example.com/create
这个地址可能只在内网能访问,公网请求就被挡在外面了。

版本更新后接口被移除或迁移

上周我们升级订单系统,把旧的 /v1/createOrder 接口废弃了,迁到了 /v2/order。结果运营部门还在用旧版APP调用老接口,一堆404报警。后来才发现是客户端没强制更新。

接口变更一定要通知到位,最好加个兼容期,老接口返回301跳转或者自定义提示,别让调用方一头雾水。

域名解析或DNS缓存闹的鬼

有时候明明配置都对了,但就是404。查了半天发现是本地DNS缓存没刷新,或者hosts文件指向了测试环境。特别是运维人员经常在本地改hosts调试,调试完忘了改回去,生产环境请求被导向了不存在的测试地址。

可以执行 nslookup api.example.com 看解析的IP对不对。Windows用户记得清一下DNS缓存:

ipconfig /flushdns

接口404听着吓人,其实大多数时候都不是大问题。冷静下来,从请求路径、服务状态、网关配置、版本变更和网络解析这几个方面一步步排查, usually都能快速定位。