java怎么获取城市气温_获取城市天气数据

中华万年历API

抓包中华万年历得到的接口(JSON):

http://wthrcdn.etouch.cn/weather_mini?city=北京

通过城市名字获得天气数据,json数据

http://wthrcdn.etouch.cn/weather_mini?citykey=101010100

通过城市id获得天气数据,json数据

数据和中国天气网(www.weather.com.cn)一致

数据:

{

"desc": "OK",

"status": 1000,

"data": {

"wendu": "22",

"ganmao": "各项气象条件适宜,无明显降温过程,发生感冒机率较低。",

"forecast": [{

"fengxiang": "南风",

"fengli": "3-4级",

"high": "高温 26℃",

"type": "多云",

"low": "低温 13℃",

"date": "28日星期四"

},

{

"fengxiang": "无持续风向",

"fengli": "微风级",

"high": "高温 28℃",

"type": "多云",

"low": "低温 15℃",

"date": "29日星期五"

},

{

"fengxiang": "无持续风向",

"fengli": "微风级",

"high": "高温 31℃",

"type": "晴",

"low": "低温 15℃",

"date": "30日星期六"

},

{

"fengxiang": "无持续风向",

"fengli": "微风级",

"high": "高温 29℃",

"type": "多云",

"low": "低温 20℃",

"date": "1日星期天"

},

{

"fengxiang": "北风",

"fengli": "4-5级",

"high": "高温 26℃",

"type": "小到中雨",

"low": "低温 13℃",

"date": "2日星期一"

}],

"yesterday": {

"fl": "微风",

"fx": "无持续风向",

"high": "高温 19℃",

"type": "小雨",

"low": "低温 12℃",

"date": "27日星期三"

},

"aqi": "118",

"city": "北京"

}

}

XML

http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100

通过城市id获得天气数据,xml文件数据,

当错误时会有节点

http://wthrcdn.etouch.cn/WeatherApi?city=北京

通过城市名字获得天气数据,xml文件数据

数据:

北京

18:45

22

2级

33%

东南风

05:19

19:06

118

61

儿童、老年人及心脏、呼吸系统疾病患者人群应减少长时间或高强度户外锻炼

轻度污染

臭氧8小时

185

1

101

4

24

18:00:00

27日星期三

高温 19℃

低温 12℃

小雨

无持续风向

微风

无持续风向

微风

28日星期四

高温 26℃

低温 13℃

多云

南风

3-4级

多云

无持续风向

微风级

29日星期五

高温 28℃

低温 15℃

多云

无持续风向

微风级

无持续风向

微风级

30日星期六

高温 31℃

低温 15℃

无持续风向

微风级

多云

无持续风向

微风级

1日星期天

高温 29℃

低温 20℃

多云

无持续风向

微风级

小雨

无持续风向

微风级

2日星期一

高温 26℃

低温 13℃

小到中雨

北风

4-5级

多云

北风

3-4级

晨练指数

适宜

天气不错,空气清新,是您晨练的大好时机,建议不同年龄段的人们积极参加户外健身活动。

舒适度

较舒适

白天天气晴好,您在这种天气条件下,会感觉早晚凉爽、舒适,午后偏热。

穿衣指数

舒适

建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。

感冒指数

少发

各项气象条件适宜,无明显降温过程,发生感冒机率较低。

晾晒指数

适宜

天气不错,适宜晾晒。赶紧把久未见阳光的衣物搬出来吸收一下太阳的味道吧!

旅游指数

适宜

天气较好,但丝毫不会影响您出行的心情。温度适宜又有微风相伴,适宜旅游。

紫外线强度

中等

属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。

洗车指数

较适宜

较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。

运动指数

较适宜

天气较好,户外运动请注意防晒,推荐您在室内进行低强度运动。

约会指数

适宜

天气较好,和恋人一起徜徉于熙攘人群中或漫步于柔软草地上,都是不错的主意哦。

雨伞指数

不带伞

天气较好,不会降水,因此您可放心出门,无须带雨伞。

java code:

package com.topsports.util;

import java.io.BufferedInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.zip.GZIPInputStream;

import org.apache.http.HttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

import net.sf.json.JSONArray;

import net.sf.json.JSONObject;

/**

* 天气预报工具类(调用中华万年历接口获取)

* @author sun.xh

* @date 2018-08-02

*/

public class WeatherUtil {

private static Logger logger = LogManager.getLogger(WeatherUtil.class);

/**

* 获取今天实时天气

* @param cityName 城市名称

* @return type

*/

public static String getTodayWeather(String cityName){

String res = null;

try {

JSONArray array = getWeather(cityName);

if (array != null && !array.isEmpty()) {

JSONObject today = array.getJSONObject(0);

res = today.getString("type");

}

} catch (Exception e) {

logger.error("获取天气失败", e);

}

return res;

}

/**

* 获取最近几天天气 + 昨日天气

* @param cityName

* @return jsonArray

*/

public static JSONArray getWeather(String cityName) {

String url = "http://wthrcdn.etouch.cn/weather_mini?city=" + cityName;

JSONArray array = null;

CloseableHttpClient httpClient = HttpClients.createDefault();

try {

HttpGet httpGet = new HttpGet(url);

HttpResponse httpResponse = httpClient.execute(httpGet);

String result = getJsonStringFromGZIP(httpResponse);// 获取到解压缩之后的字符串

JSONObject jsonData = JSONObject.fromObject(result);

logger.info("请求天气接口返回状态如下:cityName:{}, status:{},desc:{}", cityName, jsonData.getString("status"), jsonData.getString("desc"));

if (jsonData.getString("desc").equals("OK")) {

JSONObject data = jsonData.getJSONObject("data");

array = data.getJSONArray("forecast");

}

} catch (Exception e) {

logger.error("获取一周天气数据失败", e);

} finally {

try {

httpClient.close();

} catch (IOException e) {

logger.error("IO异常", e);

}

}

return array;

}

/**

* 解压缩gzip

* @param response

* @return

*/

private static String getJsonStringFromGZIP(HttpResponse response) {

String jsonString = null;

try {

InputStream is = response.getEntity().getContent();

BufferedInputStream bis = new BufferedInputStream(is);

bis.mark(2);

// 取前两个字节

byte[] header = new byte[2];

int result = bis.read(header);

// reset输入流到开始位置

bis.reset();

// 判断是否是GZIP格式

int headerData = getShort(header);

if (result != -1 && headerData == 0x1f8b) {

is = new GZIPInputStream(bis);

} else {

is = bis;

}

InputStreamReader reader = new InputStreamReader(is, "utf-8");

char[] data = new char[100];

int readSize;

StringBuffer sb = new StringBuffer();

while ((readSize = reader.read(data)) > 0) {

sb.append(data, 0, readSize);

}

jsonString = sb.toString();

bis.close();

reader.close();

} catch (Exception e) {

logger.error("解压JSON异常", e);

}

return jsonString;

}

private static int getShort(byte[] data) {

return (int) ((data[0] << 8) | data[1] & 0xFF);

}

public static void main(String[] args) {

//测试获取实时天气

String res = getTodayWeather("深圳");

System.out.println(res);

}

}

你可能感兴趣的:(java怎么获取城市气温)