gpt4 book ai didi

java - 使用 Retrofit 从货币 API 获取每月数据

转载 作者:行者123 更新时间:2023-11-30 12:05:16 24 4
gpt4 key购买 nike

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

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

“日期”:{“某个约会”“一些货币”:一些值(value)

我从 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();

它现在是硬编码的,我只是想学习这个。

这是 Retrofit 调用

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;
}
}
}

最佳答案

通过改造,您可以在查询中使用这样的变量:

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

这会给你想要的结果:history?start_at=startAt&end_at=endAt&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<Rate>但我不确定。在那种情况下 Rate会有一个 Map<String, Double>变量代替。

关于java - 使用 Retrofit 从货币 API 获取每月数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com