您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

大牛教大家如何用SpringBoot技术快速实现天气预报系统

时间:2020-08-26 12:39:22  来源:  作者:

从一个天气预报系统讲起

本节通过Spring Boot技术快速实现一个天气预报系统。

通过这个系统,一方面可以了解Spring Boot的全面用法,为后续创建微服务应用打下基础;另一方面,该系统会作为本节进行微服务架构改造的非常好的起点。

下面以前面创建的hello-world应用作为基础进行改造,成为新的应用micro-weather-basic。

大牛教大家如何用SpringBoot技术快速实现天气预报系统

 

开发环境

为了演示本例,需要采用如下开发环境。

. JDK8。

.Gradle 4.0。

. Spring Boot Web Starter 2.0.0.M4。

Apache HttpClient 4.5.3。

数据来源

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

  • ·天气数据来源为中华万年历。例如以下两种方式。

通过城市名称获得天气数据: http://wthrcdn.etouch.cn/weather_mini?city=深圳。

通过城市ID获得天气数据: http://wthrcdn.etouch.cn/weather_mini?citykey=101280601。

  • ·城市ID列表。每个城市都有一个唯一的ID作为标识,见https:/waylau.com/data/citylist.xml。

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

{
"data":{
"yesterday":{
"date" :"1日星期五",
"high" :"高温33℃",
"fx":"无持续风向",
"low" :"低温26℃",
"fl":"<![CDATA[<3级]]>",
"type":"多云"
},
"city":"深圳",
"aqi" : "72",
"forecast":[
"date":"2日星期六",
"high":"高温32℃",
"fengli":"<![CDATA[<3级]1>",
"low" :"低温26℃",
"fengxiang":"无持续风向",
"type" :"阵雨"
},
"date":"3日星期天",
"high":"高温 29℃",
"fengli":"<![CDATA[5-6级]1>",
"low" :"低温26℃",
"fengxiang":"无持续风向",
"type":"大雨"
"date":"4日星期一",
"high":"高温29℃",
"fengli":"<![CDATA[3-4级]1>",
"low":"低温26℃",
"fengxiang" :"西南风",
"type":"暴雨"
},
"date":"5日星期二",
"high":"高温31℃",
"fengli":"<![CDATA[<3级]]>",
"low":"低温27℃",
"fengxiang":"无持续风向",
"type":"阵雨"
"date" :"6日星期三",
"high":"高温32℃",
"fengli":"<![CDATA[<3级]l>",
"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”,该项目可以直接以之前的“hello-world"应用作为基础进行修改。

添加Apache HttpClient的依赖,来作为Web请求的客户端。完整的依赖情况如下。

//依赖关系
dependencies {
//该依赖用于编译阶段
compile('org.springframework.boot:spring-boot-starter-web')
/添加Apache HttpClient依赖
compile('org.apache.httpcomponents:httpclient:4.5.3')
//该依赖用于测试阶段
testCompile('org.springframework.boot:spring-boot-starter-test')}
大牛教大家如何用SpringBoot技术快速实现天气预报系统

 

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

创建com.waylau.spring.cloud.weather.vo包,用于存放相关值对象。这些对象都是POJO对象,没有复杂的业务逻辑

创建天气信息类 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;
1/省略getter/setter方法
}

昨日天气信息类Yesterday :

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;
//省略getter/setter方法
}

未来天气信息类Forecast:

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;
//省略getter/setter方法
}

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

public class WeatherResponse implements Serializable{
private static final long serialversionUID =1L;
private Weather data;1/消息数据
private String status;//消息状态
private string desc;/l消息描述
//省略getter/setter方法
}

服务接口及实现

创建com.waylau.spring.cloud.weather.service包,用于存放服务接口及其实现。

下面是定义服务的两个接口方法,一个是根据城市的ID来查询天气数据,另一个是根据城市名称来查询天气数据。

package com.waylau.spring.cloud.weather.service;
import com.waylau.spring.cloud.weather.vo.WeatherResponse;
/*★
*天气数据服务.
大
csince 1.0.o 2017年10月18日
*  @author <a href="https://waylau.com">Way Lau</a>
*/
public interface weatherDataservice {
/**
根据城市ID来查询天气数据
*
*@param city工d
*return
*/
WeatherResponse getDataByCityId(String cityId);
/**
*根据城市名称来查询天气数据
*
*@param cityId
*@return
*/
WeatherResponse getDataByCityName(String cityName);
}

其服务实现WeatherDataServiceImpl为:

package com.waylau.spring.cloud.weather.service;
import JAVA.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.0bjectMApper;
import com.waylau.spring.cloud.weather.vo.WeatherResponse;
/**
*天气数据服务.
*
* @since 1.0.0 2017年10月18日
* @author <a href="https://waylau.com">Way Lau</a>
*/
@service
public class WeatherDataServiceImpl implements WeatherDataService {
Autowired
private RestTemplate restTemplate;
private final string WEATHER_API = "http://wthrcdn.etouch.cn/weath-
er_ 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 (工OException e){
e.printStackTrace();
return weather;

其中:

. RestTemplate是一个REST客户端,默认采用Apache HttpClient来实现;

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

控制器层

创建com.waylau.spring.cloud.weather.service包,用于存放控制器层代码。控制器层暴露了RESTful API接口。

package com.waylau.spring.cloud.weather.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping:
import org.springframework.web.bind.annotation.RestController;
import com.waylau.spring.cloud.weather.service.WeatherDataService;
import com.waylau.spring.cloud.weather.vo.WeatherResponse;
/★大
*天气AP工.
*
* @since 1.0.0 2017年10月18日
* author <a href="https://waylau.com">Way Lau</a>
*/
@RestController
RequestMapping("/weather")
public class WeatherController {
@Autowired
private WeatherDataService weatherDataService;
@GetMapping("/cityId/{cityId}")
public WeatherResponse getReportByCityId(CPathVariable("cityId")
string cityId){
return weatherDataService.getDataByCityId(cityId);
}
GetMapping("/cityName/{cityName}")
public WeatherResponse getReportByCityName (CPathVariable ("cityName")
string cityName){
return weatherDataService.getDataByCityName(cityName);}

其中,@RestController会自动将返回的数据进行序列化,使其成为JSON数据格式。

配置类

创建com.waylau.spring.cloud.weather.config包,用于存放配置相关的代码。创建RestConfiguration

类,该类是RestTemplate 的配置类。

package com.waylau.spring.cloud.weather.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
*REST 配置类.
*
*@since 1.0.02017年10月18日
* @author <a href="https://waylau.com" >Way Lau</a>
*/
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/惠州。

能看到如图6-1所示的天气API返回的数据。

大牛教大家如何用SpringBoot技术快速实现天气预报系统


Tags:SpringBoot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  Tags: SpringBoot  点击:(20)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  Tags: SpringBoot  点击:(25)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  Tags: SpringBoot  点击:(55)  评论:(0)  加入收藏
1. 介绍1.1 介绍今天开始我们来学习Java操作MySQL数据库的技巧,Java操作MySQL是借助JdbcTemplate这个对象来实现的。JdbcTemplate是一个多数据库集中解决方案,而我们今天只讲...【详细内容】
2021-11-05  Tags: SpringBoot  点击:(30)  评论:(0)  加入收藏
SpringBoot中的Controller注册本篇将会以Servlet为切入点,通过源码来看web容器中的Controller是如何注册到HandlerMapping中。请求来了之后,web容器是如何根据请求路径找到对...【详细内容】
2021-11-04  Tags: SpringBoot  点击:(52)  评论:(0)  加入收藏
环境:Springboot2.4.11环境配置接下来的演示都是基于如下接口进行。@RestController@RequestMapping("/exceptions")public class ExceptionsController { @GetMapping(...【详细内容】
2021-10-11  Tags: SpringBoot  点击:(41)  评论:(0)  加入收藏
SpringBoot项目默认使用logback, 已经内置了 logback 的相关jar包,会从resource包下查找logback.xml, logback 文件格式范本 可直接复制使用,有控制台 info.log error.log三个...【详细内容】
2021-10-09  Tags: SpringBoot  点击:(50)  评论:(0)  加入收藏
环境:Springboot2.4.10当应用程序启动时,Spring Boot将自动从以下位置查找并加载application.properties和application.yaml文件: 从Classpath类路径classpath的根类路径classp...【详细内容】
2021-09-26  Tags: SpringBoot  点击:(76)  评论:(0)  加入收藏
搭建基础1. Intellij IDEA 2. jdk1.8 3. maven3.6.3搭建方式(1)在线创建项目Spring Boot 官方提供的一种创建方式,在浏览器中访问如下网址: https://start.spring.io/在打开的页...【详细内容】
2021-09-14  Tags: SpringBoot  点击:(78)  评论:(0)  加入收藏
最近开发项目的时候需要用到对象的属性拷贝,以前也有用过一些复制框架,比如spring的 BeanUtils.copyProperties等方式,但总是不尽如人意,最近发现使用orika进行对象拷贝挺好用的...【详细内容】
2021-08-27  Tags: SpringBoot  点击:(231)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条