【问题标题】:Why I get Attribute value must be constant error?为什么我得到 Attribute value must be constant 错误?
【发布时间】:2017-01-18 13:10:04
【问题描述】:

我正在尝试将当前日期添加到 HTTP @GET 中的 url 字符串,但我收到 Attribute value must be constant 错误。我想不通为什么?我正在使用改造 2。

public interface API {

  final Date c = new Date();
  final String date=new SimpleDateFormat("yyyy-MM-dd").format(c);

  static final String url = ("/modules/json/json/Index?costNumber=0417&firstDay="+date+"&language=fi");


  @GET(url)
  Call<Menu> getMenuName();

【问题讨论】:

  • java 的基础知识:因为+date+ 加上data 不是恒定的事实......这使得url 不是恒定的
  • @Selvin 是的,我知道,但是我怎样才能获得 url 的日期?例如,如果日期是 2017-01-18,那么 url 将是 /modules/json/json/Index?costNumber=0417&firstDay=2017-01-18&language=fi
  • 让它成为getMenuName的参数,阅读文档怎么做
  • url 是静态的,而 date 不是。
  • url 是静态的,而 date 不是。 @JimmyB 没关系,因为它是一个接口字段......所以它们都是静态的......事实上你没有不需要static 也不需要final ideone.com/hxRLtE,因为接口字段是隐式静态和最终的

标签: java android retrofit2


【解决方案1】:

Fred 的答案是适合您的情况的正确解决方案。然而,为了完整的信息,Retrofit 2 确实支持动态 URL。您可以将其作为@Url 参数传递给您的接口方法,例如:

@GET
Call<ResponseBody> getMenuName(@Url String url);

您无需在 @GET 注释中指定 URL。 Retrofit 将从传递的url 中获取值。这使您可以选择从动态 URL 请求数据,这在某些情况下很有用。

您可以在这里找到更多信息:https://futurestud.io/tutorials/retrofit-2-how-to-use-dynamic-urls-for-requests

【讨论】:

    【解决方案2】:

    正如@Selvin 在 cmets 中已经指出的那样,这是因为 date 不是一个常数。

    使用改造您通常将此作为查询参数,因此您可以将getMenuName 更改为:

    @GET("/modules/json/json/Index")
    Call<Menu> getMenuName(
           @Query("costNumber") String costNumber,
           @Query("firstDay") String firstDay,
           @Query("language") String language);
    

    然后您可以使用适当的参数调用该方法:

    getMenuName("0417", date, "fi");
    

    Retrofit 将知道如何为您构建 url。请注意,这也使得使用不同的 costNumberfirstDay 进行相同的调用比使用硬编码的 url 更容易。

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多