一、解决思路

1、首先获取泸州的城市代码

Java使用聚合数据的天气API java查询天气_Java使用聚合数据的天气API


在返回的数据里,第一项的ref值就是泸州的城市代码:101271001

2、利用国家气象局提供的接口访问泸州的天气信息

Java使用聚合数据的天气API java查询天气_字符串_02

二、准备工作

学会如何在Java程序里解析json。

准备jar包

连接:链接: 点击这里 提取码: 3nqw

Java使用聚合数据的天气API java查询天气_ci_03


1、创建Java项目JsonDemo

Java使用聚合数据的天气API java查询天气_Java使用聚合数据的天气API_04


ParseJsonString

package net.qing.json;

import org.json.JSONObject;

/**
 * 功能:将json字符串解析成json对象
 * 将json数组字符串解析成json数组
 * 日期:2019:10:31
 */
public class ParseJsonString {
    public static void main(String[] args) {
        //定义一个json字符串
        String strJson = "{'id':1,'name':'qing','age':100}";
        //基于json字符串创建json对象
        try {
            //基于json字符串创建json对象
            JSONObject jsonObject = new JSONObject(strJson);
            //打印输出json对象
            System.out.println(jsonObject);
            //遍历json对象
            System.out.println("id:"+jsonObject.get("id"));
            System.out.println("name:"+jsonObject.get("name"));
            System.out.println("age:"+jsonObject.get("age"));

        } catch (Exception e) {

            e.printStackTrace();
        }
    }
}

ParseJsonString02

package net.qing.json;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class ParseJsonString02 {
    public static void main(String[] args) {
        //定义json数组字符串
        String strJsonArr = "[{'id':1,'name':'qing','age':100}," +
                            "{'id':2,'name':'peng','age':10},"+
                             "{'id':3,'name':'lzb','age':190}]";
        try {
            //基于json数组字符串创建数组
            JSONArray jsonArray = new JSONArray(strJsonArr);
            //遍历json数组
            for (int i = 0; i<jsonArray.length();i++){
                System.out.println(jsonArray.get(i));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }


    }
}

三、功能实现

1、创建web项目并准备jar包

Java使用聚合数据的天气API java查询天气_Java使用聚合数据的天气API_05


2、修改项目首页文件index.jsp

Java使用聚合数据的天气API java查询天气_ci_06


3、在web目录里创建查询天气页面query_weather.jsp

Java使用聚合数据的天气API java查询天气_ci_07


4、在web目录里创建处理查询天气页面do_query_weather.jsp

(1)显示表单提交的城市名数据

Java使用聚合数据的天气API java查询天气_Java使用聚合数据的天气API_08


3)编写通过城市名查询天气信息的方法

<%!
    ……
    /**
     * 通过城市名获取天气信息
     *
     * @param cityName
     * @return 天气信息
     */
    public HashMap<String, String> getWeatherInfo(String cityName) throws JSONException {
        // 定义天气信息哈希映射
        HashMap<String, String> weather = new HashMap<>();
 
        try {
            // 获取城市代码
            String cityCode = getCityCode(cityName);
            // 定义url字符串
            String strUrl = "http://t.weather.sojson.com/api/weather/city/" + cityCode;
            // 创建URL对象
            URL url = new URL(strUrl);
            // 创建http连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 建立连接
            connection.connect();
            // 获取响应码
            int code = connection.getResponseCode();
            // 判断是否连接成功
            if (code == 200) {
                // 获取字节输入流
                InputStream is = connection.getInputStream();
                // 创建字节数组用于保存响应信息
                byte[] buffer = new byte[is.available()];
                // 读取字节输入流全部信息
                is.read(buffer);
                // 获取响应信息字符串
                String response = new String(buffer, "utf-8");
                // 将json字符串转换成json对象
                JSONObject weatherInfoJsonObj = new JSONObject(response);
                System.out.println(weatherInfoJsonObj);
                JSONObject cityInfoJsonObj = new JSONObject(weatherInfoJsonObj.getString("cityInfo"));
                weather.put("城市:", cityInfoJsonObj.getString("parent") + " " + cityInfoJsonObj.getString("city") + "[" + cityCode + "]");
                JSONArray forcastJsonArr = new JSONArray(new JSONObject(weatherInfoJsonObj.getString("data")).getString("forecast"));
                weather.put("时间:", weatherInfoJsonObj.getString("time") + " " + forcastJsonArr.getJSONObject(0).getString("week"));
                weather.put("温度:", forcastJsonArr.getJSONObject(0).getString("high") + " " + forcastJsonArr.getJSONObject(0).getString("low"));
                weather.put("天气:", forcastJsonArr.getJSONObject(0).getString("type"));
            } else {
                weather.put("错误:", "[" + cityName + "]不存在!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
 
        // 返回天气信息哈希映射
        return weather;
    }
%>

do_query_weather.jsp页面完整代码

<%@ page import="java.net.URL" %>
<%@ page import="java.net.HttpURLConnection" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="org.json.JSONObject" %>
<%@ page import="org.json.JSONArray" %>
<%@ page import="org.json.JSONException" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>显示城市天气信息</title>
</head>
<body>
<%!
    /**
     * 获取城市代码
     *
     * @param cityName
     * @return 城市代码
     */
    public String getCityCode(String cityName) {
        // 定义城市代码
        String cityCode = "";
        try {
            // 定义url字符串
            String strUrl = "http://toy1.weather.com.cn/search?cityname=" + URLEncoder.encode(cityName, "utf-8");
            // 创建URL对象
            URL url = new URL(strUrl);
            // 利用URL对象获取HTTP连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 建立物理连接
            conn.connect();
            // 获取响应码
            int responseCode = conn.getResponseCode();
            // 判断连接是否成功
            if (responseCode == HttpURLConnection.HTTP_OK) { // 200
                // 获取字节输入流
                InputStream is = conn.getInputStream();
                // 定义字节数组用于保存字节输入流的全部内容
                byte[] buffer = new byte[is.available()];
                // 判断城市是否存在
                if (is.available() > 4) {
                    // 读取字节输入流全部信息,保存到buffer
                    is.read(buffer);
                    // 获取响应信息字符串
                    String response = new String(buffer, "utf-8");
                    // 截取出城市代码
                    cityCode = response.substring(10, 19);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        // 返回城市代码
        return cityCode;
    }
 
    /**
     * 通过城市名获取天气信息
     *
     * @param cityName
     * @return 天气信息
     */
    public HashMap<String, String> getWeatherInfo(String cityName) throws JSONException {
        // 定义天气信息哈希映射
        HashMap<String, String> weather = new HashMap<>();
 
        try {
            // 获取城市代码
            String cityCode = getCityCode(cityName);
            // 定义url字符串
            String strUrl = "http://t.weather.sojson.com/api/weather/city/" + cityCode;
            // 创建URL对象
            URL url = new URL(strUrl);
            // 创建http连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 建立连接
            connection.connect();
            // 获取响应码
            int code = connection.getResponseCode();
            // 判断是否连接成功
            if (code == 200) {
                // 获取字节输入流
                InputStream is = connection.getInputStream();
                // 创建字节数组用于保存响应信息
                byte[] buffer = new byte[is.available()];
                // 读取字节输入流全部信息
                is.read(buffer);
                // 获取响应信息字符串
                String response = new String(buffer, "utf-8");
                // 将json字符串转换成json对象
                JSONObject weatherInfoJsonObj = new JSONObject(response);
                System.out.println(weatherInfoJsonObj);
                JSONObject cityInfoJsonObj = new JSONObject(weatherInfoJsonObj.getString("cityInfo"));
                weather.put("城市:", cityInfoJsonObj.getString("parent") + " " + cityInfoJsonObj.getString("city") + "[" + cityCode + "]");
                JSONArray forcastJsonArr = new JSONArray(new JSONObject(weatherInfoJsonObj.getString("data")).getString("forecast"));
                weather.put("时间:", weatherInfoJsonObj.getString("time") + " " + forcastJsonArr.getJSONObject(0).getString("week"));
                weather.put("温度:", forcastJsonArr.getJSONObject(0).getString("high") + " " + forcastJsonArr.getJSONObject(0).getString("low"));
                weather.put("天气:", forcastJsonArr.getJSONObject(0).getString("type"));
            } else {
                weather.put("错误:", "[" + cityName + "]不存在!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
 
        // 返回天气信息哈希映射
        return weather;
    }
%>
<%
    // 设置请求对象字符编码
    request.setCharacterEncoding("utf-8");
    // 获取表单提交的数据(城市名)
    String cityName = request.getParameter("city_name");
    // 输出天气信息
    HashMap<String, String> weather = getWeatherInfo(cityName);
    for (String key: weather.keySet()) {
        out.print(key + weather.get(key) + "<br/>");
    }
%>
</body>
</html>