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,提问作者Павел Якунин

