Retrofit请求NASA APOD传昨日日期报注解参数需为编译期常量错误
问题原因
触发编译报错的核心原因是:Retrofit 中 @GET 这类请求注解的传入参数,必须是编译期就能确定的常量值。你定义的 yesterdayDate 是运行时调用才会计算生成的动态值,根本无法在编译阶段就拼接进注解的URL字符串里,直接拼接必然抛出「注解参数必须为编译期常量」的错误。
而且直接在注解URL里硬拼动态参数本身也不符合Retrofit的设计规范,动态查询参数应该用框架提供的专用注解传递,不要手写拼接。
修正方案
@GET注解里只填写接口的固定路径planetary/apod,不要拼接任何动态内容- 动态的
date、api_key这类查询参数,通过@Query注解标记为方法参数,Retrofit会在运行时自动将参数拼接到URL查询串中 - 昨日日期的计算逻辑放到接口调用前执行,把
LocalDate格式化为接口要求的yyyy-MM-dd格式字符串后,再作为参数传入请求方法
修正后的接口代码:
interface NasaApiService { @GET("planetary/apod") fun getYesterdayPhoto( @Query("date") date: String, // api_key设置默认值,调用时无需重复传参 @Query("api_key") apiKey: String = BuildConfig.NASA_API_KEY ): Call<NasaPhoto> companion object { private const val BASE_URL = "https://api.nasa.gov/" fun create(): NasaApiService { val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build() return retrofit.create(NasaApiService::class.java) } } }
接口调用示例:
// 按接口要求将日期格式化为yyyy-MM-dd格式字符串 val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val yesterdayDateStr = LocalDate.now().minusDays(1).format(dateFormatter) // 发起请求 val nasaApi = NasaApiService.create() nasaApi.getYesterdayPhoto(yesterdayDateStr).enqueue(/* 实现你的请求回调逻辑 */)
可选优化
如果所有NASA接口请求都需要携带api_key,可以自定义OkHttp拦截器统一给所有请求追加该参数,不需要在每个接口方法里单独声明api_key参数,能减少很多重复代码。
内容的提问来源于stack exchange,提问作者xenia
相关产品推荐
相关产品推荐

