feature: added openweathermap weather provider
This commit is contained in:
parent
30e5fa44d3
commit
66b0b821f6
@ -12,6 +12,7 @@ repositories {
|
|||||||
dependencies {
|
dependencies {
|
||||||
testImplementation platform('org.junit:junit-bom:5.10.0')
|
testImplementation platform('org.junit:junit-bom:5.10.0')
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter'
|
testImplementation 'org.junit.jupiter:junit-jupiter'
|
||||||
|
implementation 'org.json:json:20250517'
|
||||||
}
|
}
|
||||||
|
|
||||||
test {
|
test {
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package ru.dima.weather;
|
package ru.dima.weather;
|
||||||
|
|
||||||
|
import ru.dima.weather.city.CityByIpResolver;
|
||||||
|
import ru.dima.weather.http.HttpRequester;
|
||||||
|
import ru.dima.weather.provider.OpenWeatherMapWeatherProvider;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
1. Брать текущий IP
|
1. Брать текущий IP
|
||||||
2. Определять город по текущему IP
|
2. Определять город по текущему IP
|
||||||
@ -8,7 +12,11 @@ package ru.dima.weather;
|
|||||||
public class WeatherApp {
|
public class WeatherApp {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
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());
|
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 {
|
public class CityByIpResolver {
|
||||||
|
|
||||||
@ -11,6 +13,6 @@ public class CityByIpResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getCurrentCityViaIP() {
|
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.IOException;
|
||||||
import java.io.InputStream;
|
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