Android项目使用Retrofit2实现带路径ID的GET请求问题咨询
你当前的实现核心问题是混淆了**路径参数(Path Param)和查询参数(Query Param)**的使用场景,手动拼接路径参数不仅不规范,还容易出现转义、拼写错误等问题,Retrofit本身提供了标准的路径参数占位符方案,无需手动拼接。
正确实现方案
1. 改造API接口定义
直接用@Path注解声明路径中的动态参数,固定的查询参数可以直接写在@GET的路径里,无需手动拼接:
interface SpoonacularApi { // 用{recipeId}做路径占位符,固定查询参数直接写在路径后缀 @GET("/recipes/{recipeId}/information?includeNutrition=false") suspend fun getRecipeById( @Path("recipeId") recipeId: Int, // 路径参数自动替换占位符 @Query("apiKey") apiKey: String // 动态查询参数用@Query传入 ): Response<PersonalizedRecipeResult> }
2. 调用方式简化
不需要再写手动拼接路径的工具方法,直接传入食谱ID和apiKey即可:
// 调用示例 val response = spoonacularApi.getRecipeById( recipeId = 716429, apiKey = API_KEY ) // 后续处理响应逻辑
优化说明
- 不需要手动拼接任何路径或查询参数,所有动态值都通过Retrofit注解传入,避免转义错误
- 固定查询参数(比如这里的
includeNutrition=false)直接写在@GET路径中,代码可读性更高 - 如果后续需要动态控制
includeNutrition的取值,只需要把它改成@Query参数即可:
@GET("/recipes/{recipeId}/information") suspend fun getRecipeById( @Path("recipeId") recipeId: Int, @Query("includeNutrition") includeNutrition: Boolean, @Query("apiKey") apiKey: String ): Response<PersonalizedRecipeResult>
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

