申请了天气预报信息接口,提供的接口文档是php的,我用java实现了
基于httpclient-4.3.5
package com.yxkong.utils; import java.io.IOException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import sun.misc.BASE64Encoder; public class SmartWeatherUtil { private static final String MAC_NAME = "HmacSHA1"; private static final String ENCODING = "UTF-8"; private static final String appid = "你的appid"; private static final String private_key = "你的privatekey"; private static final String url_header="http://open.weather.com.cn/data/?"; /** * 使用 HMAC-SHA1 签名方法对对encryptText进行签名 * @param encryptText 被签名的字符串 * @param encryptKey 密钥 * @return * @throws Exception */ public static byte[] HmacSHA1Encrypt(String url, String privatekey) throws Exception { byte[] data=privatekey.getBytes(ENCODING); //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称 SecretKey secretKey = new SecretKeySpec(data, MAC_NAME); //生成一个指定 Mac 算法 的 Mac 对象 Mac mac = Mac.getInstance(MAC_NAME); //用给定密钥初始化 Mac 对象 mac.init(secretKey); byte[] text = url.getBytes(ENCODING); //完成 Mac 操作 return mac.doFinal(text); } /** * 获取URL通过privatekey加密后的码 * @param url * @param privatekey * @return * @throws Exception */ private static String getKey(String url, String privatekey) throws Exception { byte[] key_bytes = HmacSHA1Encrypt(url, privatekey); return URLEncoder.encode(new BASE64Encoder().encode(key_bytes),ENCODING); } /** * 组装url的地址 * @param areaid 地区id * @param type 数据类型 * @param date 时间 * @return * @throws Exception */ private static String getInstanceURL(String areaid,String type,String date) throws Exception{ String keyurl=url_header+"areaid="+areaid+"&type="+type+"&date="+date+"&appid="; String key=getKey(keyurl+appid,private_key); String appid6 = appid.substring(0, 6); return keyurl+appid6+"&key=" + key; } /** * 获取访问URL * @param areaid 地区编号 * @param type 获取类型数: * 天气指数:index_f(基础) 、 index_v(常规) 3 天常规预报 (24 小时 ):forecast_f(基础 ) 、forecast_v (常规) * @return */ public static String getActionURL(String areaid,String type){ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmm"); String date = dateFormat.format(new Date()); try { return getInstanceURL(areaid,type,date); } catch (Exception e) { } return null; } /** * 测试 * @param args */ public static void main(String[] args) { String interfaceURL = getActionURL("101010200", "forecast_v"); CloseableHttpClient client = HttpClientBuilder.create().build(); try { HttpGet request = new HttpGet(interfaceURL); request.addHeader(HttpHeaders.ACCEPT, "application/json;charset=utf-8"); CloseableHttpResponse response = client.execute(request); String bodyAsString = EntityUtils.toString(response.getEntity(),"utf-8"); response.close(); System.err.println(bodyAsString); } catch (IOException e) { e.printStackTrace(); } } }
文章评论