调用高德地图API查询当天城市的气温信息

一、调用高德地图的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测试一下:

完美结束! 

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值