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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:33:19