美文网首页
《基于JAVA调用免费天气api》读后写

《基于JAVA调用免费天气api》读后写

作者: af4e8a35bc89 | 来源:发表于2016-11-26 15:19 被阅读224次
    打开简书 恰巧看到《基于JAVA调用免费天气api接口示例》,随心点进去一看发现是干货,就在Eclipse新建Maven工程实践了一遍,感谢原作者。 我主要想再叙述一遍事实,以加强学习印象。如果有缘分看到这篇文章,您也可以跟我一样,抱着学习或复习的心态,看一遍。

    -其间我遇见一个小问题,net.sf.json库找不到:

    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    解决办法是要去:maven仓库里下载:

    2168300-1b89fe9387cd03ed.png

    并通过Eclipse添加到Dependence:

    2168300-c4ba1bbf2d030cfe.png
    我还想把源码复现一边:

    -网络请求类:

    packagewheatherGroupId.wheatherArtifactId;
    
    importjava.io.BufferedReader;
    importjava.io.BufferedWriter;
    importjava.io.InputStream;
    importjava.io.InputStreamReader;
    importjava.io.OutputStream;
    importjava.io.OutputStreamWriter;
    importjava.net.HttpURLConnection;
    importjava.net.URL;
    importjava.util.Map;
    
    /*
    *网络访问工具类
    * */
    
    publicclassPureNetUtil {
    /*
    *get方法直接调用post方法
    *@param url 网络地址
    *@return 返回网络数据
    *
    * */
    
    publicstaticString get(Stringurl){
    returnpost(url,null);
    }
    
    /*
    * 设定post方法获取网络资源 如果参数null实际上设定为get方法
    * @param url 网络地址
    * @param param 请求参数键值对
    * @return 返回读取数据
    * */
    
    publicstaticString post(Stringurl,Mapparam){
    
    HttpURLConnectionconn=null;
    try{
    
    URLu=newURL(url);
    conn=(HttpURLConnection)u.openConnection();
    StringBuffersb=null;
    if(param!=null){
    
    //如果请求参数不为空
    sb=newStringBuffer();
    //默认为false post方法需要写入参数 设定为true
    conn.setDoOutput(true);
    //设定post 默认get
    conn.setRequestMethod("POST");
    //获得输出流
    OutputStreamout=conn.getOutputStream();
    //对输出流封装成高级输出流
    BufferedWriterwriter=newBufferedWriter(newOutputStreamWriter(out));
    //将参数封装成键值对的形式
    for(Map.Entrys:param.entrySet()){
    sb.append(s.getKey()).append("=").append(s.getValue()).append("&");
    
    }
    //将参数通过输出流写入
    writer.write(sb.deleteCharAt(sb.toString().length()-1).toString());
    writer.close();//一定要关闭 不然可能出现参数不全的错误
    sb=null;
    }
    
    conn.connect();//建立连接
    sb=newStringBuffer();
    //获取连接状态码
    
    intrecode=conn.getResponseCode();
    BufferedReaderreader=null;
    if(200==recode){
    //Returns an input stream that reads from this open
    //从连接中获取输入流
    InputStreamin=conn.getInputStream();
    //对输入流进行封装
    reader=newBufferedReader(newInputStreamReader(in));
    
    Stringstr=null;
    sb=newStringBuffer();
    //从输入流中读取数据
    while((str=reader.readLine()) !=null){
    sb.append(str).append(System.getProperty("line.separator"));
    }
    
    //关闭输入流
    reader.close();
    if(sb.toString().length() == 0){
    returnnull;
    }
    returnsb.toString().substring(0,sb.toString().length() - System.getProperty("line.separator").length());
    }
    
    }catch(Exceptione){
    
    e.printStackTrace();
    
    returnnull;
    
    }finally{
    
    if(conn!=null){//关闭连接
    conn.disconnect();
    }
    
    }
    
    returnnull;
    }
    }
    

    -得到城市列表类:

    packagewheatherGroupId.wheatherArtifactId;
    importnet.sf.json.JSONArray;
    importnet.sf.json.JSONObject;
    /*
    *获取城市列表
    *全国天气预报接口调用JAVA示例
    *dtypestring N 返回数据格式:json或xml,默认json
    *key string Y 你申请的key
    *@author silk
    *
    * */
    
    public class GetCityList {
    /***
    *调用获取城市列表接口 返回所有数据
    *@return返回接口数据
    *
    * */
    public static String excute(){
    //接口url
    Stringurl="http://v.juhe.cn/weather/citys?key=08d4c5f2ef1acd5985e87a2bc83b8315";
    //PureNetUtil是一个封装了get和post方法获取网络请求数据的工具类
    returnPureNetUtil.get(url);
    }
    /**
    * 调用接口返回数据后 解析数据 根据输入城市名得到对应ID
    *@paramcityName 城市名称
    *@return返回对应ID
    *
    * */
    publicstaticString getIDByCityName(StringcityName){
    Stringresult= excute();//返回接口结果 得到json格式数据
    System.out.print("result:\n"+result);
    if(null!=result){
    
    JSONObjectobj= JSONObject.fromObject(result);
    result=obj.getString("resultcode");
    if(null!=result&&result.equals("200")){
    //200表示成功返回数据
    result=obj.getString("result");//得到城市列表的json
    JSONArrayarr=JSONArray.fromObject(result);
    for(Objecto:arr){
    //对arr进行遍历
    //将数组中的一个json个数字符串进行解析
    obj= JSONObject.fromObject(o.toString());
    //此时obj如{"id":"2","provice":"北京","city":"北京","district":"海淀"}
    //以city这个key为线索判断所需要寻找的这条记录
    result=obj.getString("district");
    //防止输入城市名不全 如苏州市输入为苏州 类似于模糊查询
    if(result.equals(cityName) ||result.contains(cityName)){
    
    result=obj.getString("id");
    returnresult;
    
    }
    }
    }
    }
    returnresult;
    }
    }
    

    -得到天气预报类:

    package wheatherGroupId.wheatherArtifactId;
    
    importnet.sf.json.JSONObject;
    
    /**
    *根据城市名 / id查询天气
    *@authorliulongchang
    *
    * *
    * */
    
    public class WeatherReportByCity {
    
    /*
    *根据城市名获取
    *@param cityName
    *@return cityName
    *@return
    *
    * */
    
    public static String excute(StringcityName){
    
    Stringurl=//此处以返回json格式数据示例 所以format=2 以根据城市名称为例,Name传入中文
    "http://v.juhe.cn/weather/index?cityname="+cityName+"&key=08d4c5f2ef1acd5985e87a2bc83b8315";
    returnPureNetUtil.get(url);//通过工具类获取返回数据
    
    }
    
    /*
    *获取返回数据中的一个属性示例 此处以获取今日温度为例
    *temperature 8~20今日温度
    *paramargs
    *return
    */
    
    public static String GetTodayTemperatureByCity(Stringcity){
    
    Stringresult= excute(city);
    
    if(result!=null){
    
    JSONObjectobj= JSONObject.fromObject(result);
    //获取返回的状态码
    result=obj.getString("resultcode");
    //如果状态码是200说明返回数据成功
    if(null!=result&&result.equals("200")){
    
    result=obj.getString("result");
    //此时result中数据有多个key 可以对其key进行遍历 得到多个属性
    obj=JSONObject.fromObject(result);
    //今日温度对应的key是today
    result=obj.getString("today");
    obj=JSONObject.fromObject(result);
    //今日温度对应当key是temperature
    result=obj.getString("temperature");
    returnresult;
    }
    
    }
    returnresult;
    }
    }
    

    相关文章

      网友评论

          本文标题:《基于JAVA调用免费天气api》读后写

          本文链接:https://www.haomeiwen.com/subject/ezqgpttx.html