SpringBoot整合高德地图天气查询的全过程
申请key
登录高德,注册,添加应用,创建key
官网api:
https://lbs.amap.com/api/webservice/guide/api/weatherinfo
调用步骤:
第一步,申请”web服务 API”密钥(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。
最主要的也是获取到key
相关代码
pom.xml
<!--httpclient--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.78</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency>
application.properties
server.port=2080 #The config for HttpClient http.maxTotal=300 http.defaultMaxPerRoute=50 http.connectTimeout=1000 http.connectionRequestTimeout=500 http.socketTimeout=5000 http.staleConnectionCheckEnabled=true gaode.key = 申请的key
HttpClientConfig
package com.zjy.map.config; import lombok.Data; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.nio.charset.Charset; import java.util.List; @Data @Configuration @ConfigurationProperties(prefix = "http", ignoreUnknownFields = true) public class HttpClientConfig { private Integer maxTotal;// 最大连接 private Integer defaultMaxPerRoute;// 每个host的最大连接 private Integer connectTimeout;// 连接超时时间 private Integer connectionRequestTimeout;// 请求超时时间 private Integer socketTimeout;// 响应超时时间 /** * HttpClient连接池 * @return */ @Bean public HttpClientConnectionManager httpClientConnectionManager() { PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(maxTotal); connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute); return connectionManager; } /** * 注册RequestConfig * @return */ @Bean public RequestConfig requestConfig() { return RequestConfig.custom().setConnectTimeout(connectTimeout) .setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout) .build(); } /** * 注册HttpClient * @param manager * @param config * @return */ @Bean public HttpClient httpClient(HttpClientConnectionManager manager, RequestConfig config) { return HttpClientBuilder.create().setConnectionManager(manager).setDefaultRequestConfig(config) .build(); } @Bean public ClientHttpRequestFactory requestFactory(HttpClient httpClient) { return new HttpComponentsClientHttpRequestFactory(httpClient); } /** * 使用HttpClient来初始化一个RestTemplate * @param requestFactory * @return */ @Bean public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory) { RestTemplate template = new RestTemplate(requestFactory); List<HttpMessageConverter<?>> list = template.getMessageConverters(); for (HttpMessageConverter<?> mc : list) { if (mc instanceof StringHttpMessageConverter) { ((StringHttpMessageConverter) mc).setDefaultCharset(Charset.forName("UTF-8")); } } return template; } }
WeatherUtils
package com.zjy.map.utils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.net.URI; import java.util.Map; @Component public class WeatherUtils { /**日志对象*/ private static final Logger logger = LoggerFactory.getLogger(WeatherUtils.class); @Value("${gaode.key}") private String KEY; public final String WEATHER_URL = "https://restapi.amap.com/v3/weather/weatherInfo?"; /** * 发送get请求 * @return */ public JSONObject getCurrent(Map<String, String> params){ JSONObject jsonObject = null; CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建URI对象,并且设置请求参数 try { URI uri = getBuilderCurrent(WEATHER_URL, params); // 创建http GET请求 HttpGet httpGet = new HttpGet(uri); CloseableHttpResponse response = httpclient.execute(httpGet); // 判断返回状态是否为200 jsonObject = getRouteCurrent(response); httpclient.close(); } catch (Exception e) { e.printStackTrace(); } return jsonObject; } /** * 根据不同的路径规划获取距离 * @param response * @return */ private static JSONObject getRouteCurrent(CloseableHttpResponse response) throws Exception{ JSONObject live = null; // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); logger.info("调用高德地图接口返回的结果为:{}",content); JSONObject jsonObject = (JSONObject) JSONObject.parse(content); JSONArray lives = (JSONArray) jsonObject.get("lives"); live = (JSONObject) lives.get(0); logger.info("返回的结果为:{}",JSONObject.toJSONString(live)); } return live; } /** * 封装URI * @param url * @param params * @return * @throws Exception */ private URI getBuilderCurrent(String url, Map<String, String> params) throws Exception{ // 城市编码,高德地图提供 String adcode = params.get("adcode"); URIBuilder uriBuilder = new URIBuilder(url); // 公共参数 uriBuilder.setParameter("key", KEY); uriBuilder.setParameter("city", adcode); logger.info("请求的参数key为:{}, cityCode为:{}", KEY, adcode); URI uri = uriBuilder.build(); return uri; } /** * 查询未来的 * 发送get请求 * @return */ public JSONObject sendGetFuture(Map<String, String> params){ JSONObject jsonObject = null; CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建URI对象,并且设置请求参数 try { URI uri = getBuilderFuture(WEATHER_URL, params); // 创建http GET请求 HttpGet httpGet = new HttpGet(uri); CloseableHttpResponse response = httpclient.execute(httpGet); // 判断返回状态是否为200 jsonObject = getRouteFuture(response); httpclient.close(); } catch (Exception e) { e.printStackTrace(); } return jsonObject; } /** * 封装URI * @param url * @param params * @return * @throws Exception */ private URI getBuilderFuture(String url, Map<String, String> params) throws Exception{ // 城市编码,高德地图提供 String adcode = params.get("adcode"); URIBuilder uriBuilder = new URIBuilder(url); // 公共参数 uriBuilder.setParameter("key", KEY); uriBuilder.setParameter("city", adcode); uriBuilder.setParameter("extensions", "all"); logger.info("请求的参数key为:{}, cityCode为:{}", KEY, adcode); URI uri = uriBuilder.build(); return uri; } /** * 根据不同的路径规划获取距离 * @param response * @return */ private static JSONObject getRouteFuture(CloseableHttpResponse response) throws Exception{ JSONObject live = null; // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); logger.info("调用高德地图接口返回的结果为:{}",content); JSONObject jsonObject = (JSONObject) JSONObject.parse(content); JSONArray forecast = (JSONArray) jsonObject.get("forecasts"); live = (JSONObject) forecast.get(0); logger.info("返回的结果为:{}",JSONObject.toJSONString(live)); } return live; } }
WeatherController
package com.zjy.map.controller; import com.alibaba.fastjson.JSONObject; import com.zjy.map.utils.WeatherUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; /** * 高德天气 */ @RestController @RequestMapping("/weather") public class WeatherController { @Autowired private WeatherUtils weatherUtils; /**日志对象*/ private static final Logger logger = LoggerFactory.getLogger(WeatherController.class); /** * http://localhost:2080/weather/getCurrent?adcode=140200 * 获取当前的天气预报 * @param adcode * @return */ @GetMapping("/getCurrent") public JSONObject getWeather(@RequestParam String adcode){ Map<String, String> params = new HashMap<>(); params.put("adcode", adcode); logger.info("获取当前的天气预报,请求的参数为:{}", params); JSONObject map = weatherUtils.getCurrent(params); logger.info("获取当前的天气预报,返回的请求结果为:{}", map); return map; } /** * http://localhost:2080/weather/getFuture?adcode=140200 * 获取未来的天气预报 * @param adcode * @return */ @GetMapping("/getFuture") public JSONObject getFuture(@RequestParam String adcode){ Map<String, String> params = new HashMap<>(); params.put("adcode", adcode); logger.info("获取未来的天气预报,请求的参数为:{}", params); JSONObject map = weatherUtils.sendGetFuture(params); logger.info("获取未来的天气预报,返回的请求结果为:{}", map); return map; } }
代码贴完了。开始测试
启动服务
城市编号
官网提供下载地址:
https://lbs.amap.com/api/webservice/download
这里获取当前时间的天气情况与未来天气情况返回数据不一样,所在写了2个方法,参数只有一个,城市编码.
1.获取当前天气
http://localhost:2080/weather/getCurrent?adcode=140200
2.获取未来天气
http://localhost:2080/weather/getFuture?adcode=140200
{ "province": "山西", "casts": [ { "date": "2021-12-13", "dayweather": "晴", "daywind": "西南", "week": "1", "daypower": "4", "daytemp": "2", "nightwind": "西南", "nighttemp": "-18", "nightweather": "晴", "nightpower": "4" }, { "date": "2021-12-14", "dayweather": "晴", "daywind": "西", "week": "2", "daypower": "≤3", "daytemp": "2", "nightwind": "西", "nighttemp": "-13", "nightweather": "晴", "nightpower": "≤3" }, { "date": "2021-12-15", "dayweather": "多云", "daywind": "西南", "week": "3", "daypower": "4", "daytemp": "5", "nightwind": "西南", "nighttemp": "-12", "nightweather": "多云", "nightpower": "4" }, { "date": "2021-12-16", "dayweather": "多云", "daywind": "西北", "week": "4", "daypower": "4", "daytemp": "-1", "nightwind": "西北", "nighttemp": "-18", "nightweather": "晴", "nightpower": "4" } ], "city": "大同市", "adcode": "140200", "reporttime": "2021-12-13 18:04:08" }
测试OK!
总结
到此这篇关于SpringBoot整合高德地图天气查询的文章就介绍到这了,更多相关SpringBoot整合高德地图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
mybatis框架xml下trim中的prefix与suffix等标签的用法
这篇文章主要介绍了mybatis框架xml下trim中的prefix与suffix等标签的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07
最新评论