SpringBoot整合高德地图 天气查询

申请key
登录高德,注册,添加应用,创建key
官网api:

https://lbs.amap.com/api/webs...
调用步骤:
第一步,申请”web服务 API”密钥(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。
最主要的也是获取到key
SpringBoot整合高德地图 天气查询
文章图片

相关代码
pom.xml
org.apache.httpcomponents httpclient 4.4 com.alibaba fastjson 1.2.78 org.apache.commons commons-lang3 3.4

推荐阅读:《Spring Boot+Vue全栈开发实战》,点此获取PDF文件完整版
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=truegaode.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> list = template.getMessageConverters(); for (HttpMessageConverter mc : list) { if (mc instanceof StringHttpMessageConverter) { ((StringHttpMessageConverter) mc).setDefaultCharset(Charset.forName("UTF-8")); } } return template; }

推荐阅读:《Spring Boot+Vue全栈开发实战》,点此获取PDF文件完整版
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 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 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 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 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; }

推荐阅读:《Spring Boot+Vue全栈开发实战》,点此获取PDF文件完整版
【SpringBoot整合高德地图 天气查询】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 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 params = new HashMap<>(); params.put("adcode", adcode); logger.info("获取未来的天气预报,请求的参数为:{}", params); JSONObject map = weatherUtils.sendGetFuture(params); logger.info("获取未来的天气预报,返回的请求结果为:{}", map); return map; }

代码贴完了。开始测试 启动服务**推荐阅读:**[《Spring Boot+Vue全栈开发实战》,点此获取PDF文件完整版](https://docs.qq.com/doc/DQ05qV0xDdGNoRU16)城市编号 官网提供下载地址: https://lbs.amap.com/api/webservice/download![在这里插入图片描述](https://mic-blob-bucket.oss-cn-beijing.aliyuncs.com/12b932d20a0c4aa289853cabd8d72595.png)这里获取当前时间的天气情况与未来天气情况返回数据不一样,所在写了2个方法,参数只有一个,城市编码.1.获取当前天气 http://localhost:2080/weather/getCurrent?adcode=140200![在这里插入图片描述](https://mic-blob-bucket.oss-cn-beijing.aliyuncs.com/b2451c2b5d1d4d1aa898d87c80e89dfa.png)2.获取未来天气 http://localhost:2080/weather/getFuture?adcode=140200![在这里插入图片描述](https://mic-blob-bucket.oss-cn-beijing.aliyuncs.com/2d747fcc7c224c48ac0951d1fe6ac1be.png){ "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" }![在这里插入图片描述](https://mic-blob-bucket.oss-cn-beijing.aliyuncs.com/c8e1d6cf0a864677a8b58b808f4c76c7.png)测试OK!**推荐阅读:**[《Spring Boot+Vue全栈开发实战》,点此获取PDF文件完整版](https://docs.qq.com/doc/DQ05qV0xDdGNoRU16)

    推荐阅读