SpringBoot整合高德地图
DY丶老周 人气:2申请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!
总结
加载全部内容