1. 程式人生 > >SpringCloud初練習 天氣預報系統(1)

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/北京