SpringCloud初練習 天氣預報系統(1)
SpringCloud 是一套分散式的微服務解決方案,裡面包含的一些元件統統都是基於springboot構建的 所以說SpringCloud是有很多SpringBoot應用所組成的。springBoot是整個SpringCloud的基石。
天氣預報系統:
① 環境搭建
IntelliJ IDEA 開發工具 , gradle4+ , 打擊一個springBoot的Web專案
②資料來源
天氣預報系統的資料來源:
eg:http://wthrcdn.etouch.cn/weather_mini?city=深圳
http://wthrcdn.etouch.cn/weather_mini?citykey=101280601
http://mobile.weather.com.cn/js/citylist.xml
{"data":{"yesterday":{"date":"27日星期二","high":"高溫 22℃","fx":"無持續風向","low":"低溫 16℃","fl":"<![CDATA[<3級]]>","type":"多雲"},"city":"深圳","aqi":"51","forecast":[{"date":"28日星期三","high":"高溫 25℃","fengli":"<![CDATA[<3級]]>","low":"低溫 19℃","fengxiang":"無持續風向","type":"多雲"},{"date":"1日星期四","high":"高溫 24℃","fengli":"<![CDATA[<3級]]>","low":"低溫 18℃","fengxiang":"無持續風向","type":"多雲"},{"date":"2日星期五","high":"高溫 24℃","fengli":"<![CDATA[<3級]]>","low":"低溫 19℃","fengxiang":"無持續風向","type":"陣雨"},{"date":"3日星期六","high":"高溫 25℃","fengli":"<![CDATA[<3級]]>","low":"低溫 21℃","fengxiang":"無持續風向","type":"多雲"},{"date":"4日星期天","high":"高溫 25℃","fengli":"<![CDATA[<3級]]>","low":"低溫 21℃","fengxiang":"無持續風向","type":"陣雨"}],"ganmao":"各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。","wendu":"26"},"status":1000,"desc":"OK"}
③需要的依賴:
搭建一個SpringBoot 的gradle專案 結果如下:
④根據天氣預報資訊返回的資料建立四個類: 每個類都實現Serlalizable介面,同時提供Set get方法。
Weather類:
private static final long serialVersionUID = 1L; private String city; private String aqi; private String ganmao; private String wendu; private List<Forecast> forecast; private Yesterday yesterday;
Forecast類
private static final long serialVersionUID = 1L;
private String date;
private String high;
private String fengli;
private String low;
private String fengxiang;
private String type;
Yesterday類
private static final long serialVersionUID = 1L;
private String date;
private String high;
private String low;
private String fx;
private String fl;
private String type;
WeatherResponse類
private static final long serialVersionUID = 1L;
private Weather data;
private Integer status;
private String desc;
⑤建立Service類 先建立一個介面 WeatherDataService 接著寫他的實現類
public interface WeatherDataService {
/**
* 根據cityName 獲取到該城市的天氣情況
* @param cityName
* @return
*/
public WeatherResponse getDataByCityName(String cityName);
/**
* 根據cityKey 獲取到該城市的天氣情況
* @param cityKey
* @return
*/
public WeatherResponse getDataByCityKey(String cityKey);
}
@Service
public class WeatherDataServiceImpl implements WeatherDataService {
private static final String WEATHER_URL = "http://wthrcdn.etouch.cn/weather_mini?";
@Autowired
private RestTemplate restTemplate;
@Override
public WeatherResponse getDataByCityName(String cityName) {
String url = WEATHER_URL + "city=" + cityName;
return getDataByUrl(url);
}
@Override
public WeatherResponse getDataByCityKey(String cityKey) {
String url = WEATHER_URL + "citykey=" + cityKey;
return getDataByUrl(url);
}
/**
* 根據傳入的url返回WeatherResponse物件
*
* @param url
* @return
*/
private WeatherResponse getDataByUrl(String url) {
//獲取到url返回的內容 String型別
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
int statusCode = responseEntity.getStatusCodeValue();
String responseBody = null;
if(statusCode == 200){
responseBody = responseEntity.getBody();
}
//將json資料放到物件中
ObjectMapper mapper = new ObjectMapper();
WeatherResponse ws = null;
try {
ws = mapper.readValue(responseBody,WeatherResponse.class);
} catch (IOException e) {
e.printStackTrace();
}
return ws;
}
}
@Configuration
public class RestConfiguration {
@Bean
public RestTemplate restTemplate(){
StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName("UTF-8"));
RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
return restTemplateBuilder.additionalMessageConverters(m).build();
}
}
重點內容 實現的內容時在service中傳送url請求 然後將返回的結果封裝成一個WeatherResponse例項
採用RestTemplate 來發送請求
restTemplate.getForEntity(url, String.class); 傳送url之後返回一個ResponseEntity實體,
responseEntity.getStatusCodeValue();可獲取到狀態碼 當為200時表明成功。 最後將String型別的json資料轉為物件
使用的時jackson的轉換
ObjectMapper mapper = new ObjectMapper();
ws = mapper.readValue(responseBody,WeatherResponse.class);
可能會出現返回的結果為亂碼的現象:
處理方法:
StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName("UTF-8"));
RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
return restTemplateBuilder.additionalMessageConverters(m).build();
RestTempalate 字串型別預設StringHttpMessageConverter做轉碼,而StringHttpMessageConverter的預設編碼集是ISO8859-1,
⑥ 建立Controller類 瀏覽器訪問測試
@RestController
@RequestMapping("/weather")
public class WeatherController {
@Autowired
private WeatherDataService weatherDataService;
@GetMapping("/cityName/{cityName}")
public WeatherResponse getWeatherByCityName(@PathVariable("cityName")String cityName){
return weatherDataService.getDataByCityName(cityName);
}
@GetMapping("/cityId/{cityId}")
public WeatherResponse getWeatherByCityId(@PathVariable("cityId")String cityId){
return weatherDataService.getDataByCityKey(cityId);
}
}
瀏覽器訪問:http://localhost:8080/weather/cityName/北京