使用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的日志拦截器来查看实际请求地址:
- 先在build.gradle中添加依赖:
implementation 'com.squareup.okhttp3:logging-interceptor:4.11.0'
- 初始化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
相关产品推荐
相关产品推荐

