Android 端天气预报APP的实现(二)阿里云天气预报API的获取

上一章基本实现了控件的滑动效果,那么其中的数据是怎么获取的呢~
我使用的是阿里云天气预报api,使用阿里云提供的API,需要遵循以下几步:
1. 百度搜索阿里云免费天气预报API,进入阿里云云市场。
Android 端天气预报APP的实现(二)阿里云天气预报API的获取
文章图片

2. 这个API是免费版的,只要不是商业开发,应该可以满足我们的需求。有了API,第一步应该看的是这个API的请求方式,返回的数据格式,以及最重要的是可以请求到多少数据,比如一定要有天气质量,未来几日天气等等。下面这张图就可以看到所有你想知道的。这也是阿里云自己提供的,请求方式为get,返回类型为json,左侧还可以选择你想获取哪些类型的天气信息。这里我选的是id或地名查询7天预报。
Android 端天气预报APP的实现(二)阿里云天气预报API的获取
文章图片

3. 再往下拉你会发现阿里云还把每种语言下具体的请求方式示例全都列举了出来,良心网站啊!!不过我在使用它提供的示例时出现了一些问题,不知道大家会不会遇到,那么我就来说说我具体是怎么获取的吧~
1)首先,将Java请求示例中的代码拷贝下来,这里我稍微做了一下更改,因此我在使用时出现了一些问题,更改之后的是完全可以正常获取的。

final String host = "http://ali-weather.showapi.com"; final String path = "/area-to-weather"; final String method = "GET"; String appcode = "c402356e77824e7d8a23eebf6cf6d0b5"; final Map headers = new HashMap<>(); final Map querys = new HashMap<>(); headers.put("Authorization", "APPCODE " + appcode); querys.put("area", "济南"); querys.put("need3HourForcast", "0"); querys.put("needAlarm", "0"); querys.put("needHourData", "1"); querys.put("needIndex", "1"); querys.put("needMoreDay", "1"); String content = ""; HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys); BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "utf-8")); for (String s = reader.readLine(); s != null; s = reader.readLine()) { content += s; }

2)拷贝完这写代码,你会发现很多地方全都报红,哇是不是很兴奋。首先,先按照示例的要求去下载HttpUtils类,放到项目中。
/** * Created by zhaoxin on 17/9/15. */public class HttpUtils {/** * get * * @param host * @param path * @param method * @param headers * @param querys * @return * @throws Exception */ public static HttpResponse doGet(String host, String path, String method, Map headers, Map querys) throws Exception { HttpClient httpClient = wrapClient(host); HttpGet request = new HttpGet(buildUrl(host, path, querys)); for (Map.Entry e : headers.entrySet()) { request.addHeader(e.getKey(), e.getValue()); }return httpClient.execute(request); }/** * post form * * @param host * @param path * @param method * @param headers * @param querys * @param bodys * @return * @throws Exception */ public static HttpResponse doPost(String host, String path, String method, Map headers, Map querys, Map bodys) throws Exception { HttpClient httpClient = wrapClient(host); HttpPost request = new HttpPost(buildUrl(host, path, querys)); for (Map.Entry e : headers.entrySet()) { request.addHeader(e.getKey(), e.getValue()); }if (bodys != null) { List nameValuePairList = new ArrayList(); for (String key : bodys.keySet()) { nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); } UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); request.setEntity(formEntity); }return httpClient.execute(request); }/** * Post String * * @param host * @param path * @param method * @param headers * @param querys * @param body * @return * @throws Exception */ public static HttpResponse doPost(String host, String path, String method, Map headers, Map querys, String body) throws Exception { HttpClient httpClient = wrapClient(host); HttpPost request = new HttpPost(buildUrl(host, path, querys)); for (Map.Entry e : headers.entrySet()) { request.addHeader(e.getKey(), e.getValue()); }if (StringUtils.isNotBlank(body)) { request.setEntity(new StringEntity(body, "utf-8")); }return httpClient.execute(request); }/** * Post stream * * @param host * @param path * @param method * @param headers * @param querys * @param body * @return * @throws Exception */ public static HttpResponse doPost(String host, String path, String method, Map headers, Map querys, byte[] body) throws Exception { HttpClient httpClient = wrapClient(host); HttpPost request = new HttpPost(buildUrl(host, path, querys)); for (Map.Entry e : headers.entrySet()) { request.addHeader(e.getKey(), e.getValue()); }if (body != null) { request.setEntity(new ByteArrayEntity(body)); }return httpClient.execute(request); }/** * Put String * * @param host * @param path * @param method * @param headers * @param querys * @param body * @return * @throws Exception */ public static HttpResponse doPut(String host, String path, String method, Map headers, Map querys, String body) throws Exception { HttpClient httpClient = wrapClient(host); HttpPut request = new HttpPut(buildUrl(host, path, querys)); for (Map.Entry e : headers.entrySet()) { request.addHeader(e.getKey(), e.getValue()); }if (StringUtils.isNotBlank(body)) { request.setEntity(new StringEntity(body, "utf-8")); }return httpClient.execute(request); }/** * Put stream * * @param host * @param path * @param method * @param headers * @param querys * @param body * @return * @throws Exception */ public static HttpResponse doPut(String host, String path, String method, Map headers, Map querys, byte[] body) throws Exception { HttpClient httpClient = wrapClient(host); HttpPut request = new HttpPut(buildUrl(host, path, querys)); for (Map.Entry e : headers.entrySet()) { request.addHeader(e.getKey(), e.getValue()); }if (body != null) { request.setEntity(new ByteArrayEntity(body)); }return httpClient.execute(request); }/** * Delete * * @param host * @param path * @param method * @param headers * @param querys * @return * @throws Exception */ public static HttpResponse doDelete(String host, String path, String method, Map headers, Map querys) throws Exception { HttpClient httpClient = wrapClient(host); HttpDelete request = new HttpDelete(buildUrl(host, path, querys)); for (Map.Entry e : headers.entrySet()) { request.addHeader(e.getKey(), e.getValue()); }return httpClient.execute(request); }private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException { StringBuilder sbUrl = new StringBuilder(); sbUrl.append(host); if (!StringUtils.isBlank(path)) { sbUrl.append(path); } if (null != querys) { StringBuilder sbQuery = new StringBuilder(); for (Map.Entry query : querys.entrySet()) { if (0 < sbQuery.length()) { sbQuery.append("&"); } if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { sbQuery.append(query.getValue()); } if (!StringUtils.isBlank(query.getKey())) { sbQuery.append(query.getKey()); if (!StringUtils.isBlank(query.getValue())) { sbQuery.append("="); sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8")); } } } if (0 < sbQuery.length()) { sbUrl.append("?").append(sbQuery); } }return sbUrl.toString(); }private static HttpClient wrapClient(String host) { HttpClient httpClient = new DefaultHttpClient(); if (host.startsWith("https://")) { sslClient(httpClient); }return httpClient; }private static void sslClient(HttpClient httpClient) { try { SSLContext ctx = SSLContext.getInstance("TLS"); X509TrustManager tm = new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; }public void checkClientTrusted(X509Certificate[] xcs, String str) {}public void checkServerTrusted(X509Certificate[] xcs, String str) {} }; ctx.init(null, new TrustManager[]{tm}, null); //SSLSocketFactory ssf = new SSLSocketFactory(ctx); //ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); //ClientConnectionManager ccm = httpClient.getConnectionManager(); //SchemeRegistry registry = ccm.getSchemeRegistry(); //registry.register(new Scheme("https", 443, ssf)); } catch (KeyManagementException ex) { throw new RuntimeException(ex); } catch (NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } }}

3)这个时候,你会发现更多地方开始报红了,哇是不是又开始兴奋了。那么我们怎么一步步的修复呢~
首先,先把我上面注释的东西给注释了
然后,导包,因为HttpClient现在已经被丢弃了,如果我们还想使用它,那么必须手动导包。这些jar包我该怎么给你们。。。。。(等我后续研究研究)
Android 端天气预报APP的实现(二)阿里云天气预报API的获取
文章图片

导包步骤:
1.在project中,将jar包放入lib文件中,然后全部选中右键add as library.
Android 端天气预报APP的实现(二)阿里云天气预报API的获取
文章图片

4)到现在为止,应该不报红了吧,不过,要不你运行一下试试呗,是不是又出现了一些小问题。现在,你只需要将下面这段代码放入build.gradle中,然后重新make project就可以了。
在对应的“module文件.gradle”中写入 android{.......packagingOptions { exclude 'META-INF/DEPENDENCIES.txt' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/notice.txt' exclude 'META-INF/license.txt' exclude 'META-INF/dependencies.txt' exclude 'META-INF/LGPL2.1' } .... }

至此,阿里云的天气预报信息就可以获取到了,如果你想查看当前获取的内容,打印一下content就可以了
Log.d("data_",content);

【Android 端天气预报APP的实现(二)阿里云天气预报API的获取】打印结果如下:
Android 端天气预报APP的实现(二)阿里云天气预报API的获取
文章图片

    推荐阅读