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

Android Retrofit GET请求@Path动态传递时出现404错误求助

嘿,我之前也踩过Retrofit动态传参导致404的坑,给你几个排查方向和解决办法,应该能帮你搞定:

可能的原因及解决方案

1. 别手动拼接URL!用Retrofit注解处理动态路径

很多人会犯的错:静态请求写死@GET("api/users/123")正常,但动态传参时自己拼字符串(比如"api/users/" + userId),结果不小心多了斜杠、漏了字符,或者参数里的特殊字符没编码,直接导致路径错误。

正确姿势是用@Path注解让Retrofit自动处理:

// 接口定义
public interface ApiService {
    @GET("api/users/{userId}")
    Call<User> getUser(@Path("userId") String userId);
}

Activity里调用时直接传参数就行:

apiService.getUser("123").enqueue(new Callback<User>() {
    // 回调逻辑...
});

Retrofit会自动帮你拼接路径、处理参数编码,完全避免手动拼接的低级错误。

2. 区分路径参数和查询参数(别搞混@Path和@Query)

如果你的静态请求是带?的查询参数(比如api/users?id=123),动态传参时就不能用@Path,得用@Query:

public interface ApiService {
    @GET("api/users")
    Call<User> getUser(@Query("id") String userId);
}

调用后Retrofit会自动生成api/users?id=123的请求,不会出现路径错误。

3. 检查BaseUrl和动态路径的拼接规则

BaseUrl的格式很容易踩坑:如果你的BaseUrl是https://example.com/api/(末尾带斜杠),但动态路径开头又加了斜杠(比如/users/{userId}),拼接后会变成https://example.com/users/{userId},直接跳过了BaseUrl里的api路径,自然404。

统一规则:要么BaseUrl末尾带斜杠,动态路径开头不带;要么BaseUrl末尾不带,动态路径开头带。推荐前者:

// Retrofit实例构建
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://example.com/api/") // 末尾带斜杠
    .addConverterFactory(GsonConverterFactory.create())
    .build();

// 接口路径
@GET("users/{userId}") // 开头不带斜杠
Call<User> getUser(@Path("userId") String userId);

4. 用日志拦截器看真实请求URL

如果以上都排查了还是有问题,直接看实际发送的URL最直观。给OkHttp加个日志拦截器:

OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
    .build();

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .client(client)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

然后在Logcat里找请求的完整URL,和静态请求的URL对比,差异点一眼就能看出来。

内容的提问来源于stack exchange,提问作者Павел Якунин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:58:17