feature: added openweathermap weather provider
This commit is contained in:
parent
30e5fa44d3
commit
66b0b821f6
@ -12,6 +12,7 @@ repositories {
|
||||
dependencies {
|
||||
testImplementation platform('org.junit:junit-bom:5.10.0')
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter'
|
||||
implementation 'org.json:json:20250517'
|
||||
}
|
||||
|
||||
test {
|
||||
|
@ -1,5 +1,9 @@
|
||||
package ru.dima.weather;
|
||||
|
||||
import ru.dima.weather.city.CityByIpResolver;
|
||||
import ru.dima.weather.http.HttpRequester;
|
||||
import ru.dima.weather.provider.OpenWeatherMapWeatherProvider;
|
||||
|
||||
/*
|
||||
1. Брать текущий IP
|
||||
2. Определять город по текущему IP
|
||||
@ -8,7 +12,11 @@ package ru.dima.weather;
|
||||
public class WeatherApp {
|
||||
|
||||
public static void main(String[] args) {
|
||||
var cityByIpResolver = new CityByIpResolver(new HttpRequester());
|
||||
var httpRequester = new HttpRequester();
|
||||
var cityByIpResolver = new CityByIpResolver(httpRequester);
|
||||
System.out.println(cityByIpResolver.getCurrentCityViaIP());
|
||||
|
||||
var openWeatherMapProvider = new OpenWeatherMapWeatherProvider(httpRequester, "29ed5ca47c3d0c32385b18f1e82e522f");
|
||||
System.out.println(openWeatherMapProvider.getWeeklyWeatherInCity(cityByIpResolver.getCurrentCityViaIP()));
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
package ru.dima.weather;
|
||||
package ru.dima.weather.city;
|
||||
|
||||
import ru.dima.weather.http.HttpRequester;
|
||||
|
||||
public class CityByIpResolver {
|
||||
|
||||
@ -11,6 +13,6 @@ public class CityByIpResolver {
|
||||
}
|
||||
|
||||
public String getCurrentCityViaIP() {
|
||||
return httpRequester.getString(IP_INFO_URL);
|
||||
return httpRequester.getString(IP_INFO_URL).replace("\n", "").replace("\r", "");
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package ru.dima.weather;
|
||||
package ru.dima.weather.http;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
@ -0,0 +1,15 @@
|
||||
package ru.dima.weather.provider;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MultiDaysWeatherInfo {
|
||||
List<WeatherInfo> perDayWeather = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "MultiDaysWeatherInfo{" +
|
||||
"perDayWeather=" + perDayWeather +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package ru.dima.weather.provider;
|
||||
|
||||
import org.json.JSONObject;
|
||||
import ru.dima.weather.http.HttpRequester;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class OpenWeatherMapWeatherProvider implements WeatherProvider {
|
||||
|
||||
private HttpRequester httpRequester;
|
||||
private String openWeatherMapAccessToken;
|
||||
|
||||
public static final String OPEN_WEATHER_MAP_BASE_FORECAST_URL = "https://api.openweathermap.org/data/2.5/forecast";
|
||||
public static final String OPEN_WEATHER_MAP_CITY_NAME_QUERY = "q";
|
||||
public static final String OPEN_WEATHER_MAP_ACCESS_TOKEN_QUERY = "appid";
|
||||
|
||||
public static final String NAME = "open-weather-map";
|
||||
|
||||
public OpenWeatherMapWeatherProvider(HttpRequester httpRequester, String openWeatherMapAccessToken) {
|
||||
this.httpRequester = httpRequester;
|
||||
this.openWeatherMapAccessToken = openWeatherMapAccessToken;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MultiDaysWeatherInfo getWeeklyWeatherInCity(String cityName) {
|
||||
var weatherResponse = httpRequester.getString(getWeeklyWeatherRequestUrl(cityName));
|
||||
var jsonObject = new JSONObject(weatherResponse);
|
||||
var weatherArray = jsonObject.getJSONArray("list");
|
||||
var resultWeeklyWeather = new MultiDaysWeatherInfo();
|
||||
|
||||
for (var day = 0; day < 7; day ++) {
|
||||
var forecast = weatherArray.getJSONObject(day);
|
||||
var mainData = forecast.getJSONObject("main");
|
||||
|
||||
var temperature = mainData.getDouble("temp");
|
||||
resultWeeklyWeather.perDayWeather.add(new WeatherInfo(temperature));
|
||||
}
|
||||
|
||||
return resultWeeklyWeather;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return NAME;
|
||||
}
|
||||
|
||||
private String getWeeklyWeatherRequestUrl(String cityName) {
|
||||
var queryString = Map.of(
|
||||
OPEN_WEATHER_MAP_CITY_NAME_QUERY, cityName,
|
||||
OPEN_WEATHER_MAP_ACCESS_TOKEN_QUERY, openWeatherMapAccessToken,
|
||||
"units", "metric"
|
||||
).entrySet().stream()
|
||||
.map(queryParameter -> queryParameter.getKey() + "=" + queryParameter.getValue())
|
||||
.collect(Collectors.joining("&"));
|
||||
|
||||
return OPEN_WEATHER_MAP_BASE_FORECAST_URL + "?" + queryString;
|
||||
}
|
||||
}
|
16
src/main/java/ru/dima/weather/provider/WeatherInfo.java
Normal file
16
src/main/java/ru/dima/weather/provider/WeatherInfo.java
Normal file
@ -0,0 +1,16 @@
|
||||
package ru.dima.weather.provider;
|
||||
|
||||
public class WeatherInfo {
|
||||
public double temperature;
|
||||
|
||||
public WeatherInfo(double temperature) {
|
||||
this.temperature = temperature;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "WeatherInfo{" +
|
||||
"temperature=" + temperature +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package ru.dima.weather.provider;
|
||||
|
||||
public interface WeatherProvider {
|
||||
MultiDaysWeatherInfo getWeeklyWeatherInCity(String cityName);
|
||||
String getName();
|
||||
}
|
Loading…
Reference in New Issue
Block a user