【问题标题】:Getting monthly data from currency API using Retrofit使用 Retrofit 从货币 API 获取月度数据
【发布时间】:2019-06-03 19:55:52
【问题描述】:

我必须接收历史货币数据,但我不知道该怎么做

我假设我会知道接下来我应该做什么,但我不确定我的模型类应该是什么样子,没有我可以调用的“常量”对象

“日期”:{ “某个日期” “某种货币”:某种价值 }

我从 API 收到的 JSON 数据看起来像这样

    {
  "base": "EUR",
  "rates": {
    "2018-01-10": {
      "USD": 1.1992
    },
    "2018-01-02": {
      "USD": 1.2065
    },
    "2018-01-03": {
      "USD": 1.2023
    },
    "2018-01-04": {
      "USD": 1.2065
    },
    "2018-01-08": {
      "USD": 1.1973
    },
    "2018-01-05": {
      "USD": 1.2045
    },
    "2018-01-09": {
      "USD": 1.1932
    }
  },
  "end_at": "2018-01-10",
  "start_at": "2018-01-01"
}

我应该如何命名将输入“日期”对象的变量,以从货币中获取值?

这里是 api 调用

@GET("history?start_at=2018-01-01&end_at=2018-01-10&symbols=USD")
Call<Model> getMonthTest();

现在是硬编码的,我只是想学习一下。

这里是改造电话

HashMap<String, Double> currencyMap = new HashMap<>();
String key;
Double value;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_currency_detailed);
    TEST();

}

public void TEST() {
    String url = "https://api.exchangeratesapi.io/";
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    Api api = retrofit.create(Api.class);
    Call<testModel> modelCall = api.getMonthTest("2018-01-01", "2018-02-01", "USD");
    modelCall.enqueue(new Callback<testModel>() {
        @Override
        public void onResponse(Call<testModel> call, Response<testModel> response) {
            if (!response.isSuccessful()) {
                Log.i(TAG, String.valueOf(response.code()));
            }

            List<testModel> currencyList = Collections.singletonList(response.body());

            for (testModel testModel : currencyList) {

                currencyMap.put("USD", Double.valueOf(testModel.testRATES.getUsd()));

            }
            Iterator<Map.Entry<String, Double>> iterator = currencyMap.entrySet().iterator();

            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
                key = (String) entry.getKey();
                value = (Double) entry.getValue();

            }
        }

        @Override
        public void onFailure(Call<testModel> call, Throwable t) {
        }
    });
 }
}

POJO 类

public class testModel {

String base;
@SerializedName("end_at")
String endAt;
@SerializedName("start_at")
String startAt;
Map<String, String> rates;

Rates testRATES;

public String getBase() {
    return base;
}

public String getEndAt() {
    return endAt;
}

public String getStartAt() {
    return startAt;
}

public Map<String, String> getRates() {
    return rates;
}

public class Rates{
    @SerializedName("USD")
    Double usd;

    public Double getUsd() {
        return usd;
    }
 }
}

【问题讨论】:

    标签: java android retrofit


    【解决方案1】:

    通过改造,您可以在查询中包含如下变量:

    @GET("history")
    Call<Model> getMonthTest(@Query("start_at") String startAt, @Query("end_at") String endAt, @Query("symbols") String symbol);
    

    这会给你想要的结果:history?start_at=startAt&amp;end_at=endAt&amp;symbols=symbol"。在这种情况下,startAtendAt 变量将是您的日期字符串(格式正确),symbols 将是 USD

    有关更多信息,如果您想要动态路径、标题、正文等,请查看https://square.github.io/retrofit/ 的文档

    现在谈到模型,这里有一个问题可以回答这个问题:Parsing dynamic JSON to POJO with Retrofit

    在你的情况下,你会有类似的东西:

    class Response {
        String base;
        @SerializedName("end_at")
        String endAt;
        @SerializedName("start_at")
        String startAt;
        Map<String, Rate> rates;
    }
    
    class Rate {
        @SerializedName("USD")
        Double currency;
    }
    

    请注意,Rate 设置为仅解析 USD。如果您请求几个符号,我不知道响应如何,我想它会是 List&lt;Rate&gt; 但我不确定。在这种情况下,Rate 将有一个 Map&lt;String, Double&gt; 变量。

    【讨论】:

    • 您对问题提供了部分答案。您的答案解决了传递参数问题。处理 JSON 数据的 POJO 怎么样? rates JSON 对象内的键值是动态的。因此,OP 询问 “我应该如何命名将输入“日期”对象的变量,以从货币中获取值?”
    • @Shashanth 是的,完全忘记了问题的那一部分。会更新的。
    • 我能看到 POJO 类应该是什么样子的提示吗? :)
    • 答案中有,我称之为Response@Aws
    • 我放弃了。不知道怎么做...尝试做一些熟悉的事情,就像我从这个 api 中读取货币及其值一样,但这没有用。不知道我应该在这里做什么。我将使用具有 Retrofit 调用的 java 类编辑我的问题
    猜你喜欢
    • 2014-12-07
    • 2019-08-27
    • 2017-09-22
    • 1970-01-01
    • 2022-01-16
    • 2014-08-04
    • 1970-01-01
    • 2012-06-12
    • 2018-02-15
    相关资源
    最近更新 更多