最简可行路径是用JDK自带HttpURLConnection调用天气API:设User-Agent、UTF-8读响应、URLEncoder编码城市名、校验200状态码;用Jackson解析JSON(避免org.json异常);用picocli解析命令行参数;禁用SSL验证仅限调试且不可用于生产。

用 HttpURLConnection 调用天气 API 最简可行路径
Java 命令行天气查询的核心不是写界面,而是可靠拿到 JSON 响应。别一上来就套 Spring Boot 或 OkHttp——HttpURLConnection 足够轻量且无额外依赖,JDK 自带,适合练手和快速验证。
关键点在于:必须设 setRequestProperty("User-Agent", "Java"),否则多数公共天气 API(如 OpenWeatherMap)会直接返回 403;响应流要用 InputStreamReader 配 UTF-8 编码读取,否则中文城市名或天气描述会乱码。
- API 地址示例:
https://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=YOUR_KEY&units=metric - 务必检查返回状态码:
httpConn.getResponseCode()== 200 才解析,非 200 时读httpConn.getErrorStream()获取真实错误信息 - 不要手动拼接 URL 中的 city 名,用
URLEncoder.encode(city, "UTF-8")处理空格和中文
解析 JSON 响应时绕开 org.json 的坑
用 JDK 自带类解析 JSON 不现实,得引入一个轻量依赖。org.json 看似简单,但它的 JSONObject.getXXX() 方法在字段缺失时抛 JSONException,而不是返回 null 或默认值——命令行程序崩溃比显示“N/A”更糟糕。
更稳妥的选择是 com.fasterxml.jackson.databind.ObjectMapper(仅需 jackson-databind 单个 jar),它支持 @JsonIgnoreProperties(ignoreUnknown = true),能容忍 API 字段变动;还能直接反序列化成 POJO,比如:
立即学习“Java免费学习笔记(深入)”;
public class WeatherResponse {
public Main main;
public List weather;
public String name;
public static class Main { public double temp; }
public static class Weather { public String description; }
} - 用
ObjectMapper.readValue(jsonString, WeatherResponse.class)替代层层getJSONObject().getString() - 如果只用 Maven,加一行:
com.fasterxml.jackson.core jackson-databind 2.15.2 - 避免用
json-simple:其JSONParser对嵌套 null 值处理不一致,容易在get("main").get("temp")时 NPE
命令行参数解析别手写 args[] 判断
用户输入 java WeatherApp --city Shanghai --unit imperial 比 java WeatherApp Shanghai imperial 更健壮、易扩展。硬编码 args[0] 是典型初学者陷阱:位置错一位、多输个空格、漏参数就直接 ArrayIndexOutOfBoundsException。
用 picocli(单个 jar,零反射,AOT 友好)最省心,几行就能绑定参数:
@Command(name = "weather", mixinStandardHelpOptions = true)
public class WeatherApp implements Runnable {
@Option(names = {"-c", "--city"}, required = true) String city;
@Option(names = {"-u", "--unit"}, defaultValue = "metric") String unit;
public void run() { /* 调用 API + 打印 */ }
}- 自动处理
--help、--version、参数类型转换(如把--timeout 30转成 int) - 不推荐
Apache Commons CLI:配置 verbose,出错提示不友好,且已多年无实质更新 - 若坚决不用第三方库,至少封装一个
parseArgs(String[] args)方法,用HashMap存参数对,再校验必填项
忽略 HTTPS 证书验证?生产环境绝对不行
本地调试时遇到 javax.net.ssl.SSLHandshakeException: PKIX path building failed,有人会搜到“禁用 SSL 验证”的方案——这是危险操作,尤其当你把 API Key 写死在代码里时,中间人可截获密钥。
真正该做的是:确认你用的是可信 CA 签发的证书(OpenWeatherMap 是),然后检查 Java 版本是否过旧(JDK 8u101+ 默认信任主流 CA);若仍失败,优先更新 JRE,而不是加 TrustManager 绕过验证。
- 临时调试可用
-Djavax.net.debug=ssl:handshake查握手细节 - 若公司内网有自签代理证书,应把证书导入 Java
truststore,而非代码里妥协 - 命令行传 API Key 用
--key参数比硬编码安全,至少不会被 git 误提交
实际跑通的关键不在“怎么调 API”,而在于每一步都预设失败路径:网络超时设 10 秒、JSON 字段缺失有默认值、城市名查不到要提示“未找到,请检查拼写”,这些细节堆起来才是可用的命令行工具。










