迁移Google EndPoint 2.0后:404错误且请求指向spi而非api
Google Cloud Endpoints 1.0 → 2.0迁移后Android端404问题排查方案
我之前踩过类似的迁移坑,给你梳理几个关键排查点,一步步来定位问题:
1. 后端配置彻底检查
先确认你的web.xml是不是完全切换到2.0的配置逻辑:
- 把旧的
SystemServiceServlet替换为2.0的EndpointsServlet:<servlet> <servlet-name>EndpointsServlet</servlet-name> <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class> <init-param> <param-name>services</param-name> <param-value>你的API服务类全路径</param-value> </init-param> </servlet> - 确保servlet映射是
/_ah/api/*,并且删除所有旧的/_ah/spi/*映射,避免路径冲突:<servlet-mapping> <servlet-name>EndpointsServlet</servlet-name> <url-pattern>/_ah/api/*</url-pattern> </servlet-mapping> - 检查依赖:移除1.0的
com.google.appengine:appengine-endpoints,替换为2.0的com.google.endpoints:endpoints-framework:2.2.2(或最新稳定版),同时确认appengine-web.xml里没有残留1.0的配置项。
2. 重新生成Android客户端代码
这是最容易忽略的关键步骤!Endpoints 2.0的客户端库结构和1.0完全不同,旧的客户端代码会默认调用/_ah/spi路径,必须重新生成:
- 如果用Gradle插件,确保使用
com.google.cloud.tools.endpoints-framework-gradle-plugin(而非旧的appengine-endpoints插件),然后运行endpointsClientLibs任务生成新的客户端代码。 - 手动生成的话,用2.0的
Endpoint Framework Tools替代1.0的Google App Engine SDK工具,生成后替换Android项目里所有旧的Endpoint相关类,确保请求路径指向/_ah/api。
3. 部署与缓存清理
有时候部署后App Engine会有缓存残留,导致旧配置依然生效:
- 用
gcloud app deploy重新部署后端,可加上--version指定新版本,或者直接覆盖旧版本。 - 部署完成后等待3-5分钟让配置完全生效,再测试API explorer,同时查看最新的App Engine日志,确认请求路径是否已切换为
/_ah/api。
4. 排查API注解与服务注册
检查你的API服务类注解是否符合2.0规范:
- 确保使用
com.google.api.server.spi.config.Api注解,而非旧的com.google.appengine.api.endpoints.Api。 - 注解里的
name、version和命名空间要正确配置,示例:@Api(name = "myapi", version = "v1", namespace = @ApiNamespace(ownerDomain = "yourdomain.com", ownerName = "yourdomain.com")) public class MyApiService { // 你的API方法实现 } - 确认
web.xml里的services参数包含了所有API服务类的全路径,没有遗漏。
5. 日志与请求追踪
如果API explorer显示请求是/_ah/api但日志里是/_ah/spi,可以做这些验证:
- 用curl直接调用API的
/_ah/api路径,比如curl https://your-app-id.appspot.com/_ah/api/myapi/v1/yourmethod,查看返回结果和日志记录的路径是否一致。 - 检查是否有反向代理、Cloud CDN或者App Engine的URL转发规则修改了请求路径。
内容的提问来源于stack exchange,提问作者Thomas Fischer
相关产品推荐
相关产品推荐

