Как менять url в интерфейсе. Retrofit
Имеется такой интерфейс
@GET ("weather?q=Махачкала&units=metric&APPID=0b08836a21c5d5280dbc3e634a3712a7&lang=ru")
Call<WeatherMain> getWeather();
А также базовый URL
https://api.openweathermap.org/data/2.5/
Программа работает, но я бы хотел менять url в интерфейсе, чтобы получать данные других городов. Пробовал такие сценарии:
@GET ("weather?{q}=Махачкала&units=metric&APPID=0b08836a21c5d5280dbc3e634a3712a7&lang=ru")
Call<WeatherMain> getWeather(@Path("q") String location);
@GET ("{weather?q}=Махачкала&units=metric&APPID=0b08836a21c5d5280dbc3e634a3712a7&lang=ru")
Call<WeatherMain> getWeather(@Path("weather?q") String location);
@GET ("weather?q={location}&units=metric&APPID=0b08836a21c5d5280dbc3e634a3712a7&lang=ru")
Call<WeatherMain> getWeather(@Path("location") String location);
@GET ("weather?q={location}&units=metric&APPID=0b08836a21c5d5280dbc3e634a3712a7&lang=ru")
Call<WeatherMain> getWeather(@Query("location") String location);
@GET ("weather?{q}=Махачкала&units=metric&APPID=0b08836a21c5d5280dbc3e634a3712a7&lang=ru")
Call<WeatherMain> getWeather(@Query("q") String location);
@GET ("{weather?q}=Махачкала&units=metric&APPID=0b08836a21c5d5280dbc3e634a3712a7&lang=ru")
Call<WeatherMain> getWeather(@Query("weather?q") String location);
Метод networkRequest
public void networkRequest(){
tvLocation = findViewById(R.id.tv_location);
tvTemperature = findViewById(R.id.tv_temperature);
tvDescription = findViewById(R.id.tv_description);
tvHumidity = findViewById(R.id.tv_humidity);
location = "Москва";
NetworkRequest.getRequest()
.getWeatherApi()
.getWeather(location)
.enqueue(new Callback<WeatherMain>() {
@Override
public void onResponse(Call<WeatherMain> call, Response<WeatherMain> response) {
WeatherMain weatherMain = response.body();
tvLocation.setText(weatherMain.getName());
//Проверяю температуру на положительные и отрицательные значения и вывожу
int temp = (int) weatherMain.getMain().getTemp();
if (temp > 0) {
tvTemperature.setText(String.valueOf("+" + temp + "°"));
} else {
tvTemperature.setText(String.valueOf("-" + temp + "°"));
}
//Вывожу влажность воздуха
tvHumidity.setText("Влажность - " + String.valueOf(weatherMain.getMain().getHumidity()) + "%");
//Вывожу описание погоды
String s = toUpperLetter(weatherMain.getWeather().get(0).getDescription());
tvDescription.setText(s);
}
@Override
public void onFailure(Call<WeatherMain> call, Throwable t) {
showToast("Не удалось получить данные");
}
});
}
Приложение или вылетает или выполняет onFailure()
Ответы (2 шт):
Автор решения: Sergei Buvaka
→ Ссылка
Вы неправильно делаете запрос. Ваш запрос должен выглядеть примерно так
@GET("weather")
Call<WeatherMain> getWeather(
@Query("q") String city,
@Query("units") String units,
@Query("APPID") String appid,
@Query("lang") String lang
);
Я думаю вам лучше стоит ознакомиться с документацией Retrofit
Автор решения: Тагир Идрисов
→ Ссылка
Данный ответ от Sergei Buvaka помог мне. Я изменил интерфейс таким образом
public interface WeatherAPI {
//@GET ("weather?q=Махачкала&units=metric&APPID=0b08836a21c5d5280dbc3e634a3712a7&lang=ru")
@GET("weather")
Call<WeatherMain> getWeather(
@Query("q") String city,
@Query("units") String units,
@Query("APPID") String appid,
@Query("lang") String lang
);
}
Создал переменные
String keyLocation = "Махачкала";
String keyUnits = "metric";
String keyAPPID = "0b.......712a7";
String keyLang = "ru";
И передал их в качестве параметра
NetworkRequest.getRequest()
.getWeatherApi()
.getWeather(keyLocation, keyUnits, keyAPPID, keyLang)
.enqueue(new Callback<WeatherMain>() {
@Override
public void onResponse(Call<WeatherMain> call, Response<WeatherMain> response) {}
@Override
public void onFailure(Call<WeatherMain> call, Throwable t) {}
P.S тестировал для других городов, меняя значение переменной keyLocation и это работает