Retrofit调用Firebase Auth REST API时URL路径异常问题
我来帮你拆解下你遇到的这两个坑,核心是对Firebase Auth REST API的端点格式和Retrofit的路径解析规则理解不到位:
先复盘你遇到的两个问题
问题1:用
accounts/signInWithPassword?key=API_KEY返回404
按这个写法调用后,日志返回404错误,服务器返回HTML内容,说明Firebase的API服务器上根本不存在这个路径:16:08:06.762 [JavaFX Application Thread] ERROR com.lifedrained.dancejournal.Main - error code 404 16:08:06.764 [JavaFX Application Thread] ERROR com.lifedrained.dancejournal.Main - error message date: Fri, 28 Feb 2025 07:07:27 GMT content-type: text/html; charset=UTF-8 server: ESF content-length: 1635 x-xss-protection: 0 x-frame-options: SAMEORIGIN x-content-type-options: nosniff alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 okhttp3.ResponseBody$1@252c2339问题2:用
accounts:signInWithPassword?key=API_KEY报URL格式错误
按照文档用冒号分隔的写法,却触发了URL格式异常:Caused by: java.lang.IllegalArgumentException: Malformed URL. Base: https://identitytoolkit.googleapis.com/v1/, Relative: accounts:signInWithPassword?key=
问题根源&解决方案
Firebase Auth REST API里的accounts:signInWithPassword是完整的端点动作名,不是传统的斜杠分隔路径,而且你把API Key硬拼在路径里的写法很容易出问题,正确的Retrofit用法应该这么改:
1. 正确定义Retrofit接口
把API Key通过@Query参数传递(不要硬拼在路径里),直接在@POST里写带冒号的端点名:
public interface FirebaseAuthService { // 直接写正确的端点名,用@Query传递API Key @POST("accounts:signInWithPassword") Call<AuthResponse> signIn( @Body UserBody user, @Header("Content-Type") String contentType, @Query("key") String apiKey ); }
2. 确保Base URL格式正确
创建Retrofit实例时,Base URL必须以/结尾,避免路径拼接时出现异常:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://identitytoolkit.googleapis.com/v1/") // 注意末尾的/ .addConverterFactory(GsonConverterFactory.create()) // 记得添加序列化转换器 .build();
3. 调用接口的正确姿势
FirebaseAuthService authService = retrofit.create(FirebaseAuthService.class); // 发起请求 Call<AuthResponse> signInCall = authService.signIn( new UserBody("your-email@example.com", "your-password"), "application/json", FirebaseConfig.API_KEY ); // 异步执行请求 signInCall.enqueue(new Callback<AuthResponse>() { @Override public void onResponse(Call<AuthResponse> call, Response<AuthResponse> response) { if (response.isSuccessful()) { // 处理成功响应 AuthResponse authResponse = response.body(); } else { // 处理错误响应 } } @Override public void onFailure(Call<AuthResponse> call, Throwable t) { t.printStackTrace(); } });
为什么之前的写法会出错?
- 用
accounts/signInWithPassword的写法:Firebase Auth API根本没有这个斜杠分隔的端点,所以返回404是必然的。 - 硬拼API Key在带冒号的路径里:Retrofit的路径解析逻辑对带冒号的字符串如果拼接不当,会误判为URL的scheme部分,导致"Malformed URL"错误;用
@Query传递参数则完全规避了这个问题,而且代码更易维护。
另外提个小优化:Content-Type的@Header其实可以不用手动传,只要你用了GsonConverterFactory,Retrofit会自动为@Body参数设置Content-Type: application/json,可以直接把这个参数去掉。
备注:内容来源于stack exchange,提问作者Drained

