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

使用Retrofit2获取Token时BaseUrl斜杠问题求助

解决Retrofit2中baseUrl与Token端点的匹配问题

我来帮你捋清楚这个问题——Retrofit对baseUrl的格式要求确实有点严格,但只要搞懂它的URL拼接逻辑,这个问题很容易搞定。

问题根源

Retrofit强制要求baseUrl必须以/结尾,这是它的设计规范。但你直接给http://website.net/token加斜杠后,请求地址变成了http://website.net/token/,而后端的Token接口应该是监听http://website.net/token(不带末尾斜杠),所以才会返回Token无效的错误。

正确的解决方案

你需要把baseUrl和接口路径拆分,遵循Retrofit的拼接逻辑:

  • baseUrl:设置为你的域名根路径,必须以/结尾,比如http://website.net/
  • 接口注解:在请求方法里指定具体的端点路径"token"

具体代码示例如下:

第一步:定义API接口

先创建一个接口类,明确Token请求的路径:

public interface AuthApi {
    // 这里的"token"会和baseUrl拼接成http://website.net/token
    @GET("token")
    Call<TokenResponse> getToken(); // TokenResponse是你自定义的响应实体类
}

第二步:初始化Retrofit实例

调整baseUrl为根路径并添加末尾斜杠:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://website.net/") // 根路径+末尾斜杠
                .addConverterFactory(GsonConverterFactory.create()) // 补全你的ConverterFactory
                .build();

        AuthApi authApi = retrofit.create(AuthApi.class);
        // 调用接口请求Token
        Call<TokenResponse> call = authApi.getToken();
        call.enqueue(new Callback<TokenResponse>() {
            @Override
            public void onResponse(Call<TokenResponse> call, Response<TokenResponse> response) {
                // 处理响应
            }

            @Override
            public void onFailure(Call<TokenResponse> call, Throwable t) {
                // 处理错误
            }
        });
    }
}

验证请求URL(可选但推荐)

如果还是不确定拼接后的URL是否正确,可以添加Retrofit的日志拦截器来查看实际请求地址:

  1. 先在build.gradle中添加依赖:
implementation 'com.squareup.okhttp3:logging-interceptor:4.11.0'
  1. 初始化OkHttpClient时添加拦截器:
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); // 可以设为BODY查看完整请求响应

OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .build();

// 然后在Retrofit.Builder中设置client
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://website.net/")
        .client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

这样就能在Logcat里看到实际请求的URL,确认是否和后端要求的一致。

不推荐的替代方案(仅作了解)

如果你坚持要把baseUrl设为http://website.net/token/,可以在接口中用@GET(".")来拼接成http://website.net/token,但这种方式不符合Retrofit的设计理念,后续扩展其他接口时容易出错,所以不建议使用。

内容的提问来源于stack exchange,提问作者Ahmet Yılmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:58:46