Получение ежемесячных данных из API валюты с помощью Retrofit - PullRequest
2 голосов
/ 03 июня 2019

Я должен получить исторические данные о валюте, но я не уверен, как мне это сделать

Я предполагаю, что буду знать, что мне делать дальше, но я не уверен, как должен выглядеть мой класс моделинет никакого «константного» объекта, который я мог бы вызвать, например,

«дата»: {«некоторая дата», «некоторая валюта»: некоторое значение}

Я получил из данных 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;
    }
 }
}

1 Ответ

0 голосов
/ 03 июня 2019

С модификацией у вас могут быть переменные в вашем запросе, такие как:

@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".Переменными startAt и endAt будут ваши строки даты (правильно отформатированные), а symbols будет USD в этом случае.

Для получения дополнительной информации, если вы хотите иметь динамический путь, заголовки,тел и т. д., см. документацию по https://square.github.io/retrofit/

Теперь, когда дело доходит до модели, возникает вопрос, который отвечает на этот вопрос: Анализ динамического JSON в POJO с 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> переменную.

...