You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit调用Firebase Auth REST API时URL路径异常问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:03:02