首页 > 其他分享 >基于Spring Boot的天气预报服务

基于Spring Boot的天气预报服务

时间:2023-01-13 21:33:43浏览次数:72  
标签:return String Spring void Boot private 天气预报 type public


本文,我们将基于 Spring Boot 技术来实现一个微服务天气预报服务接口——micro-weather-basic。micro-weather-basic 的作用是实现简单的天气预报功能,可以根据不同的城市,查询该城市的实时天气情况。

开发环境

  • Gradle 4.0
  • Spring Boot 1.5.6
  • Apache HttpClient 1.5.3

数据来源

理论上,天气的数据是天气预报的实现基础。本应用与实际的天气数据无关,理论上,可以兼容多种数据来源。但为求简单,我们在网上找了一个免费、可用的天气数据接口。

  • 天气数据来源为中华万年历。例如:

调用天气服务接口示例,我们以“深圳”城市为例,可用看到如下天气数据返回。

{
"data": {
"yesterday": {
"date": "1日星期五",
"high": "高温 33℃",
"fx": "无持续风向",
"low": "低温 26℃",
"fl": "<![CDATA[<3级]]>",
"type": "多云"
},
"city": "深圳",
"aqi": "72",
"forecast": [
{
"date": "2日星期六",
"high": "高温 32℃",
"fengli": "<![CDATA[<3级]]>",
"low": "低温 26℃",
"fengxiang": "无持续风向",
"type": "阵雨"
},
{
"date": "3日星期天",
"high": "高温 29℃",
"fengli": "<![CDATA[5-6级]]>",
"low": "低温 26℃",
"fengxiang": "无持续风向",
"type": "大雨"
},
{
"date": "4日星期一",
"high": "高温 29℃",
"fengli": "<![CDATA[3-4级]]>",
"low": "低温 26℃",
"fengxiang": "西南风",
"type": "暴雨"
},
{
"date": "5日星期二",
"high": "高温 31℃",
"fengli": "<![CDATA[<3级]]>",
"low": "低温 27℃",
"fengxiang": "无持续风向",
"type": "阵雨"
},
{
"date": "6日星期三",
"high": "高温 32℃",
"fengli": "<![CDATA[<3级]]>",
"low": "低温 27℃",
"fengxiang": "无持续风向",
"type": "阵雨"
}
],
"ganmao": "风较大,阴冷潮湿,较易发生感冒,体质较弱的朋友请注意适当防护。",
"wendu": "29"
},
"status": 1000,
"desc": "OK"
}

我们通过观察数据,来了解每个返回字段的含义。

  • “city”: 城市名称
  • “aqi”: 空气指数,
  • “wendu”: 实时温度
  • “date”: 日期,包含未来5天
  • “high”:最高温度
  • “low”: 最低温度
  • “fengli”: 风力
  • “fengxiang”: 风向
  • “type”: 天气类型

以上数据,是我们需要的天气数据的核心数据,但是,同时也要关注下面两个字段:

  • “status”: 接口调用的返回状态,返回值“1000”,意味着数据是接口正常
  • “desc”: 接口状态的描述,“OK”代表接口正常

重点关注返回值不是“1000”的情况,说明,这个接口调用异常了。

初始化一个 Spring Boot 项目

初始化一个 Spring Boot 项目 ​​micro-weather-basic​​​,该项目可以直接在我们之前章节课程中的 basic-gradle 项目基础进行修改。同时,为了优化项目的构建速度,我们对Maven中央仓库地址和 Gradle Wrapper 地址做了调整。其中细节暂且不表,读者可以自行参阅源码,或者学习笔者所著的《Spring Boot 教程》(​​https://github.com/waylau/spring-boot-tutorial​​)。其原理,我也整理到我的博客中了:

项目配置

添加 Apache HttpClient 的依赖,来作为我们Web请求的客户端。

// 依赖关系
dependencies {
//...

// 添加 Apache HttpClient 依赖
compile('org.apache.httpcomponents:httpclient:4.5.3')

//...
}

创建天气信息相关的值对象

创建​​com.waylau.spring.cloud.vo​​包,用于相关值对象。创建天气信息类 Weather

public class Weather implements Serializable {

private static final long serialVersionUID = 1L;

private String city;
private String aqi;
private String wendu;
private String ganmao;
private Yesterday yesterday;
private List<Forecast> forecast;

public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getAqi() {
return aqi;
}
public void setAqi(String aqi) {
this.aqi = aqi;
}
public String getWendu() {
return wendu;
}
public void setWendu(String wendu) {
this.wendu = wendu;
}
public String getGanmao() {
return ganmao;
}
public void setGanmao(String ganmao) {
this.ganmao = ganmao;
}
public Yesterday getYesterday() {
return yesterday;
}
public void setYesterday(Yesterday yesterday) {
this.yesterday = yesterday;
}
public List<Forecast> getForecast() {
return forecast;
}
public void setForecast(List<Forecast> forecast) {
this.forecast = forecast;
}
}

昨日天气信息:

public class Yesterday implements Serializable {

private static final long serialVersionUID = 1L;

private String date;
private String high;
private String fx;
private String low;
private String fl;
private String type;

public Yesterday() {

}

public String getDate() {
return date;
}

public void setDate(String date) {
this.date = date;
}

public String getHigh() {
return high;
}

public void setHigh(String high) {
this.high = high;
}

public String getFx() {
return fx;
}

public void setFx(String fx) {
this.fx = fx;
}

public String getLow() {
return low;
}

public void setLow(String low) {
this.low = low;
}

public String getFl() {
return fl;
}

public void setFl(String fl) {
this.fl = fl;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

}

未来天气信息:

public class Forecast implements Serializable {

private static final long serialVersionUID = 1L;

private String date;
private String high;
private String fengxiang;
private String low;
private String fengli;
private String type;

public String getDate() {
return date;
}

public void setDate(String date) {
this.date = date;
}

public String getHigh() {
return high;
}

public void setHigh(String high) {
this.high = high;
}

public String getFengxiang() {
return fengxiang;
}

public void setFengxiang(String fengxiang) {
this.fengxiang = fengxiang;
}

public String getLow() {
return low;
}

public void setLow(String low) {
this.low = low;
}

public String getFengli() {
return fengli;
}

public void setFengli(String fengli) {
this.fengli = fengli;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public Forecast() {

}

}

WeatherResponse 作为整个消息的返回对象

public class WeatherResponse implements Serializable {

private static final long serialVersionUID = 1L;

private Weather data; // 消息数据
private String status; // 消息状态
private String desc; // 消息描述

public Weather getData() {
return data;
}

public void setData(Weather data) {
this.data = data;
}

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

}

服务接口及实现

定义了获取服务的两个接口方法

public interface WeatherDataService {

/**
* 根据城市ID查询天气数据
* @param cityId
* @return
*/
WeatherResponse getDataByCityId(String cityId);

/**
* 根据城市名称查询天气数据
* @param cityId
* @return
*/
WeatherResponse getDataByCityName(String cityName);
}

其实现为:

@Service
public class WeatherDataServiceImpl implements WeatherDataService {

@Autowired
private RestTemplate restTemplate;

private final String WEATHER_API = "http://wthrcdn.etouch.cn/weather_mini";

@Override
public WeatherResponse getDataByCityId(String cityId) {
String uri = WEATHER_API + "?citykey=" + cityId;
return this.doGetWeatherData(uri);
}

@Override
public WeatherResponse getDataByCityName(String cityName) {
String uri = WEATHER_API + "?city=" + cityName;
return this.doGetWeatherData(uri);
}

private WeatherResponse doGetWeatherData(String uri) {
ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);
String strBody = null;

if (response.getStatusCodeValue() == 200) {
strBody = response.getBody();
}

ObjectMapper mapper = new ObjectMapper();
WeatherResponse weather = null;

try {
weather = mapper.readValue(strBody, WeatherResponse.class);
} catch (IOException e) {
e.printStackTrace();
}

return weather;
}

}

返回的天气信息采用了 Jackson 来进行反序列化成为 WeatherResponse 对象。

控制器层

控制器层暴露了RESTful API 地址。

@RestController
@RequestMapping("/weather")
public class WeatherController {

@Autowired
private WeatherDataService weatherDataService;

@GetMapping("/cityId/{cityId}")
public WeatherResponse getReportByCityId(@PathVariable("cityId") String cityId) {
return weatherDataService.getDataByCityId(cityId);
}

@GetMapping("/cityName/{cityName}")
public WeatherResponse getReportByCityName(@PathVariable("cityName") String cityName) {
return weatherDataService.getDataByCityName(cityName);
}

}

​@RestController​​自动会将返回的数据,序列化成 JSON数据格式。

配置类

RestConfiguration 是 RestTemplate 的配置类。

@Configuration
public class RestConfiguration {

@Autowired
private RestTemplateBuilder builder;

@Bean
public RestTemplate restTemplate() {
return builder.build();
}

}

访问API

运行项目之后,访问项目的 API :

  • ​​http://localhost:8080/weather/cityId/101280601​​
  • ​​http://localhost:8080/weather/cityName/惠州​​

能看到如下的数据返回

源码

本章节的源码,见 ​​https://github.com/waylau/spring-cloud-tutorial/​​​ ​​samples​​​目录下的​​micro-weather-basic​​。

参考引用


标签:return,String,Spring,void,Boot,private,天气预报,type,public
From: https://blog.51cto.com/u_9427273/6006677

相关文章

  • 基于 MongoDB 及 Spring Boot 的文件服务器的实现
    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,旨在为WEB应用提供可扩展的高性能数据存储解决方案。它支持的数据......
  • Spring Data + Thymeleaf 3 + Bootstrap 4 实现分页器
    实际上分页器或者分页组件在现实中都有广泛着的应用,照理来说老卫没有必要单独撰文来提这茬。事实是,我近期刚好在写一门关于SpringData、Thymeleaf3、Bootstrap4的应用课......
  • SpringMVC轻松学习-环境搭建(二)
    基于spring2.5的采用XML配置的springMVC项目注:本项目全部基于XML配置。同时,集成了hibernate。采用的是:springMVC+hibernate+spring的开发架构。1.      建立web项......
  • SpringMVC轻松学习-注解的使用(三)
    我们采用sprngMVC开发项目时,通常都会采用注解的方式,这样可以大大提高我们的开发效率。实现零配置。下面我们从零开始重新做一个springMVC的配置。这个项目完全采用注解的......
  • SpringBoot 项目中配置多个 Jackson 的 ObjectMapper ,以及配置遇到的坑
    目录问题说明原因排查分析结论总结Jackson自动装配分析问题说明我们都知道,SpringBoot项目中,如果引入了Jackson的包,哪怕不配置,SpringBoot也会帮我们配置(JacksonAutoC......
  • springboot集成swagger3
     1pom.xml增加  <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependen......
  • 【Mongodb结合springboot 01】
    一、简介1、什么是MongoDBc++语言编写的,是一个基于分布式文件存储的开源数据库系统;为web应用提供可扩展的高性能数据存储解决方案;MongoDB将数据存储为一个文档,数据结构......
  • 零基础学习SpringBoot3笔记01_2023-01-13
    零基础学习SpringBoot3笔记01_2023-01-132023-01-131.环境1.1.软件环境安装JDK17并配置环境变量,略安装MySQL5.5并配置环境变量,略安装MySQL客户端工具HeidiSQL,略......
  • 《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第十一章 U-Boot使用实验
    U-Boot使用实验​在移植linux内核之前,我们肯定要先了解U-Boot。因为U-boot是我们的开发板加载引导启动linux内核的必要工具。本章我们讲解U-Boot是什么、有何作用,有哪些命令......
  • 《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第十二章 U-Boot移植​
    U-Boot移植​上一章节我们讲解了uboot的使用,对uboot有了一个初步的了解。前两章我们都是使用的正点原子提供的uboot,本章我们就来学习如何将Xilinx官方的uboot移植到正点原子......