一、调用高德地图的API接口,查询当前城市(或者是任何城市)的天气情况,话不多说,直接上码。
要想调用API接口,首先得在高德地图API官网去生成自己的key,至于怎么生成也很简单,这里就不在描述了。
二、代码:
因为这里是后端代码,所以我将最后查询的信息写到一个类里面了,用于封装,最后以JSON的格式返回。
1、首先需要导入的依赖有:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.71</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
2、编写封装返回信息的实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GaodeWeatherDTO {
private String status;
private String province;
private String city;
private String adcode;
private String weather;
private String temperature;
private String humidity; // 湿度
}
3、统一返回的JSON的风格,将信息的类信息也统一封装到对象中,几乎所有的类信息最后都以这个类来封装返回给前端:
public class BaseResponseDTO implements Serializable {
@Setter
@Getter
private int code; // 状态码
@Setter
@Getter
private String message; // 返回消息体
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonPropertyOrder({"code","message","data"})
public class ApiRestResponseDTO<T> extends BaseResponseDTO {
private static final String SUCCESS_MESSAGE = "操作成功!";
private T data;
/**
*
* @param <T>
* @return object return to client
* 泛型方法中第一个 <T> 表示这个T是泛型,而不是具体的某一个类,第二个 <T> 代表返回值的类型
*/
public static <T> ApiRestResponseDTO<T> success(){
ApiRestResponseDTO<T> apiRestResponse = new ApiRestResponseDTO<>();
// set 200 status at the http status
apiRestResponse.setCode(HttpStatus.OK.value());
// set default message
apiRestResponse.setMessage(SUCCESS_MESSAGE);
return apiRestResponse;
}
/**
*
* @param data
* @param <T>
* @return create a success response object with a default message
*/
public static <T> ApiRestResponseDTO<T> success(T data){
ApiRestResponseDTO<T> apiRestResponse = new ApiRestResponseDTO<>();
// set 200 status at the http status
apiRestResponse.setCode(HttpStatus.OK.value());
// set default message
apiRestResponse.setMessage(SUCCESS_MESSAGE);
// set data
apiRestResponse.setData(data);
return apiRestResponse;
}
/**
*
* @param data
* @param message
* @param <T>
* @return create a success response object with a customized message
*/
public static <T> ApiRestResponseDTO<T> success(T data, String message){
ApiRestResponseDTO<T> apiRestResponse = new ApiRestResponseDTO<>();
// set 200 status at the http status
apiRestResponse.setCode(HttpStatus.OK.value());
// set default message
apiRestResponse.setMessage(message);
// set data
apiRestResponse.setData(data);
return apiRestResponse;
}
}
4、编写OkHttp3的配置类
@Configuration
public class OkHttpConfig {
@Bean
public OkHttpClient initOkHttpClient(){
return new OkHttpClient.Builder()
.retryOnConnectionFailure(false)
.connectionPool(new ConnectionPool(10000,10000, TimeUnit.MILLISECONDS))
.connectTimeout(10000,TimeUnit.MILLISECONDS)
.readTimeout(10000,TimeUnit.MILLISECONDS)
.build();
}
}
5、编写查询天气的方法,这里调用高德API(里面的key值可以写在yml或者properties配置文件中,灵活配置,)
public class GaoDeService{
/**
*
* @param adcode
* @return 根据城市编码查询当天的天气,暂时不查看预报天气。
*/
public GaodeWeatherDTO getCurrentWeather(String adcode) throws IOException {
GaodeWeatherDTO weatherDTO = new GaodeWeatherDTO();
HttpUrl url = HttpUrl.parse("https://restapi.amap.com/v3/weather/weatherInfo")
.newBuilder()
.addQueryParameter("Key",key)
.addQueryParameter("extensions","base")
.addQueryParameter("output","JSON")
.addQueryParameter("city",adcode)
.build();
Request request = new Request.Builder().url(url).build();
Response response = okHttpClient.newCall(request).execute();
// 将json返回体转换为josn对象
JSONObject jsonObject = JSONObject.parseObject(response.body().string());
// 从josn对象里面获取属性封装到GaodeWeatherDTO对象中去
weatherDTO.setStatus(jsonObject.getString("status"));
// JSON 对象是数组形式时
JSONObject lives = jsonObject.getJSONArray("lives").getJSONObject(0);
weatherDTO.setProvince(lives.getString("province"));
weatherDTO.setCity(lives.getString("city"));
weatherDTO.setAdcode(lives.getString("adcode"));
weatherDTO.setTemperature(lives.getString("temperature"));
weatherDTO.setWeather(lives.getString("weather"));
weatherDTO.setHumidity(lives.getString("humidity"));
return weatherDTO;
}
}
上面代码忘了加key:
@Value("${gaode.key}") // 从yml配置文件中获取这个key值
private String key;
6、编写controller层,实现调用接口
@RestController
@RequestMapping("/maps/V1.0")
public class MapController {
/**
*
* @param adcode
* @return 根据城市编码获取当前城市的温度
* @throws IOException
*/
@GetMapping("/weather")
public ApiRestResponseDTO<GaodeWeatherDTO> getWeather(@RequestParam String adcode) throws IOException {
GaodeWeatherDTO currentWeather = gaodeTranService.getCurrentWeather(adcode);
return ApiRestResponseDTO.success(currentWeather);
}
}
7、最后用postman测试一下:
完美结束!